Mac 搭建开发环境(二)常用软件

Finder 中显示完整路径

defaults write com.apple.finder _FXShowPosixPathInTitle -bool TRUE;killall Finder

关于 .DS_store 文件

说明:.DS_Store 文件是 MacOS 保存文件夹的自定义属性的隐藏文件,如文件的图标位置或背景色,相当于 Windows 的 desktop.ini。

# 禁止 .DS_store 生成
defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool TRUE

# 开启 .DS_store 生成
defaults delete com.apple.desktopservices DSDontWriteNetworkStores

Node.js+Npm

建议用 nvm 来管理和安装 node 版本,查看使用说明nvm 和 n 的区别和原理

如果之前曾经用官网 pkg 包安装过 node,则需要先删除:

# 查看已安装在全局模块,以便重装
npm ls -g --depth=0

# 删除 node
sudo rm /usr/local/bin/node

# 删除全局 node_modules 目录
sudo rm -rf /usr/local/lib/node_modules

# 删除全局 node 模块注册的软链
cd  /usr/local/bin && ls -l | grep "../lib/node_modules/" | awk '{print $9}'| xargs rm

清理完毕后,开始通过 nvm 来安装 node:

# 安装 nvm
# 如想安装最新版本的 nvm 可以去 https://github.com/creationix/nvm
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | bash

# 安装最新稳定版 node
nvm install stable

# 安装指定版本 node
nvm install 6.9.1

# 切换到指定 node 版本
nvm use 7

另外可以用 nrm 来切换 npm 源,查看使用说明

# 安装 nrm
sudo npm install -g nrm

# 列出可选的源
nrm ls

# 测试所有源的响应时间
nrm test

# 切换到指定源
nrm use taobao

提示:如果某个项目需要单独指定 node 版本,可以在项目根目录下新建一个 .nvmrc 文件来特殊标明:

cd staylife_frontend/mobile
echo 4 > .nvmrc
nvm use
node -v

SublimeText3

下载地址:http://www.sublimetext.com/3

安装常用插件:

  • PackageControl
  • Alignment
  • MarkdownHighlighting
  • Sass
  • Less
  • Vue Syntax Highlight
  • DocBlockr
  • ColorsSublime 代码高亮主题管理插件,安装成功后需要照着文档配置两个地方
  • Material Theme 非常棒的编辑器主题
  • Blade Snippets Blade 模板自动补全
  • Laravel Blade Hightlighter Blade 语法高亮支持
  • SyncedSideBar 自动在左边文件夹树中定位当前文件
  • BracketHighlighter 结尾处高亮
  • EditorConfig .editorconfig 编码格式化支持
  • Emmet 快速编码
  • SideBarEnhancements 文件夹栏右键菜单增强
  • AdvancedNewFile 快速创建新文件
  • GitGutter 标记代码中做的编辑
  • Laravel 5 Artisan Artisan 命令行调用
  • Laravel 5 Snippets 代码片段
  • SublimeLinter + SublimeLinterPHP 代码检测

想在命令行使用 Sublime?

ln -s /Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl /usr/local/bin/subl
ln -s /usr/local/bin/subl /usr/local/bin/sublime

Zsh/OhMyZsh

brew install zsh
wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh

echo 'export PATH="/usr/local/sbin:$PATH"' >> ~/.zshrc
source ~/.zshrc

Vi/Vim

# 安装 monokai 主题
1.下载 Monokai.vim (https://github.com/sickill/vim-monokai) 保存到 ~/.vim/colors 下;
2.编辑 ~/.vimrc 文件,添加 syntax enable、colorscheme Monokai 两行,例如:

    syntax enable
    colorscheme Monokai

    set encoding=utf-8
    set fileencoding=utf-8
    set fileencodings=ucs-bom,utf-8,chinese,cp936
    set guifont=Consolas:h15
    language messages zh_CN.utf-8
    set autoindent
    set smartindent
    set tabstop=4
    set autochdir
    set shiftwidth=4
    set foldmethod=manual
    set nocompatible
    set nobackup

CharlseProxy

http://www.charlesproxy.com/download/

如何抓取 https?

# 设置手机代理、安装证书(依次点击可查看当前电脑IP、端口、证书地址)
1、Charles ->Help -> SSL Proxying ->Install Charles Root Certifate on a Mobile Device or Remote Browser
2、用手机浏览器(Safari)打开并安装上面窗口提示的证书,例如:
    http://www.charlesproxy.com/getssl

# 设置需要捕获的域名
4、Charles -> Proxy -> Proxy Settings -> SSL -> Enable SSL Proxying,在下方 Locations 区域添加要抓取的域名和端口443

Wine

# XQuartz >= 2.7.7
brew install Caskroom/cask/xquartz

# 安转 wine
brew install wine

# 或者去官网下载
https://dl.winehq.org/wine-builds/macosx/download.html

# 开始安装
wine heidisql-installer.exe

# 启动程序
wine /User/....exe

Git

brew install git
git config --global branch.autosetuprebase always
git config --global core.autocrlf input
git config --global core.safecrlf true
git config --global credential.helper store
git config --global core.excludesfile ~/.gitignore_global
git config --global push.default simple

# 设置提交者
git config --global user.name "silverd"
git config --global user.email "silverd29@gmail.com"

SourceTree

https://www.sourcetreeapp.com/download/

iTerm2

http://www.iterm2.com/downloads.html

# 安装主题(Solarized Dark Higher Contrast 不错)
http://www.iterm2.com/colorgallery

Scroll Reverser

http://pilotmoon.com/scrollreverser/

ShadowsocksX

# ShadowsocksX-2.6.3.dmg
https://github.com/shadowsocks/shadowsocks-iOS/releases

SecureCRT

# v7.3.7 下载地址
http://macabc.com/detail.htm?app_id=24

# 正常安装

# 破解方法1. 下载破解文件 securecrt_mac_crack.pl
地址1:http://yun.baidu.com/share/link?shareid=297986172&uk=18145526
地址2:https://raw.githubusercontent.com/silverd/silverd.github.io/master/res/attach/securecrt_mac_crack.pl

# 破解方法2. 在终端执行命令,会返回一组序列号信息,然后打开 SecureCRT 手动依次输入这些信息就可
sudo perl securecrt_mac_crack.pl /Applications/SecureCRT.app/Contents/MacOS/SecureCRT

# 破解方法原文
http://bbs.feng.com/read-htm-tid-6939481.html
# 下载链接(直接就是破解版 v11.1.8)
http://www.waitsun.com/navicat-premium-11-1-11.html

Alfred+Dash

# Alfred3 破解版
http://www.sdifenzhou.com/alfred3.html

# Dash
http://scriptfans.iteye.com/blog/1543219

# Dash 集成 Alfred
Dash -> Preference -> Integration -> Alfred Import

Genymotion+VitualBox

https://www.virtualbox.org/wiki/Downloads
https://www.genymotion.com/download/

增加 ssh-copy-id 命令(MacOS 不自带)

# 仓库原地址:https://github.com/beautifulcode/ssh-copy-id-for-OSX
curl -L https://raw.githubusercontent.com/beautifulcode/ssh-copy-id-for-OSX/master/install.sh | sh

# 用法示例
ssh-copy-id -i ~/.ssh/dev@morecruit.pub root@m.hicrew.cn

Mac 搭建开发环境(一)LAMP

安装 homebrew

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Command Line Tools

方法1. brew doctor 后根据提示自动安装
方法2. xcode-select --install
方法3. 在 AppStore 里安装最新版 Xcode

准备工作

brew install wget
brew install libevent
brew link libevent
brew install autoconf
brew install pkg-config
brew install libmemcached

# 如果出现连接不上,可尝试修改DNS解析:
sudo vi /etc/resolev.conf
nameserver 114.114.114.114
nameserver 8.8.8.8

安装基础服务

brew install homebrew/apache/httpd24
brew install homebrew/php/php71 --with-apache
brew install memcached
brew install redis
brew install mongodb

安装 PHP7 PECL 扩展(–HEAD 表示最新但非稳定版)

brew install homebrew/php/php71-memcached
brew install homebrew/php/php71-redis
brew install homebrew/php/php71-mongodb
brew install homebrew/php/php71-xxtea
brew install homebrew/php/php71-yaf
brew install homebrew/php/php71-swoole
brew install homebrew/php/php71-mcrypt

安装 PHP Composer 包管理器

brew install homebrew/php/composer
composer self-update

# 启用 Packagist 中国镜像
composer config -g repo.packagist composer https://packagist.phpcomposer.com

可选安装 PHP7-PECL-YAF 扩展

homwbrew 里已可以安装 php71-yaf,但版本可能不是最新。可以跳过本步。

wget http://pecl.php.net/get/yaf-3.0.4.tgz
tar zxvf yaf-3.0.4.tgz
cd yaf-3.0.4

phpize
./configure
make && make install
echo 'extension=yaf.so' > '/usr/local/etc/php/7.1/conf.d/ext-yaf.ini'
cd ..
rm -rf yaf-3.0.4 yaf-3.0.4.tgz package.xml

查看 php -v 可能会遇到 memcached 依赖问题

PHP Deprecated: PHP Startup: memcached.sess_lock_wait and memcached.sess_lock_max_wait are deprecated. Please update ...

按照所述修改 `/usr/local/etc/php/7.1/conf.d/ext-memcached.ini`

移除以下两句
memcached.sess_lock_wait = 150000
memcached.sess_lock_max_wait = 0

更换成新版的写法
memcached.sess_lock_wait_min = 0;
memcached.sess_lock_wait_max = 0;
memcached.sess_lock_retries = 0;

开启 PHP 解析短标签

修改 `/usr/local/etc/php/7.1/php.ini` 设置 short_open_tag = On

启动、重启、停止 Apache

sudo apachectl start
sudo apachectl stop
sudo apachectl restart

通过 `httpd -V` 也可以查看当前 Apache 的版本以及 httpd.conf 所在路径 (SERVER_CONFIG_FILE)
/usr/local/etc/apache2/2.4/httpd.conf

Apache 修改 /usr/local/etc/apache2/2.4/httpd.conf

# 如果访问 localhost 出现 403 Forbidden?
找 `Require all denied` 替换成 `Require all granted`

# 开启 mod_rewrite 模块
取消注释 `LoadModule rewrite_module libexec/apache2/mod_rewrite.so`

# 如果是 PHP7,还需修改 Mac 自带 apache 的 PHP 模块,
搜索 `LoadModule php5_module libexec/apache2/libphp5.so`
替换 `LoadModule php7_module /usr/local/Cellar/php71/7.1.*/libexec/apache2/libphp7.so`

# 开启引入虚拟主机
取消注释 `Include /usr/local/etc/apache2/2.4/extra/httpd-vhosts.conf`

# 在文件最底部增加:
<IfModule php7_module>
    AddType application/x-httpd-php .php
    AddType application/x-httpd-php-source .phps
    <IfModule dir_module>
        DirectoryIndex index.html index.php
    </IfModule>
</IfModule>

如何新建一个 Apache vhost?

sudo vi /usr/local/etc/apache2/2.4/extra/httpd-vhosts.conf

<VirtualHost *:80>
    ServerName local.api.hicrew.cn
    ServerAlias local.m.hicrew.cn
    DocumentRoot "/Users/silverd/home/wwwroot/hicrew/app/web"
    <Directory "/Users/silverd/home/wwwroot/hicrew/app/web">
        Options Indexes FollowSymLinks
        Require all granted
        AllowOverride All
        <IfModule mod_rewrite.c>
            RewriteEngine On
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteRule ^(.*)$ /index.php/$1 [L]
        </IfModule>
    </Directory>
</VirtualHost>

特别注意:

DocumentRoot 必须是绝对路径。不能简写为 ~/home/wwwroot/…,否则会报 404 Not Found

因为 DocumentRoot 是相对 ServerRoot 而言的,httpd.conf 中 ServerRoot 是 /Users

MySQL 安装和管理

# 第1步:安装
brew install mysql

# 第2步:启动(会以当前登录身份启动)
mysql.server start

# 第3步:设置密码(然后按提示操作)
mysql_secure_installation

# 第4步:停止
mysql.server stop

# 将 MySQL Server 设为开机启动(以 root 身份启动)
sudo ln -sfv /usr/local/opt/mysql/*.plist /Library/LaunchDaemons
sudo chown root:wheel /Library/LaunchDaemons/homebrew.mxcl.mysql.plist
sudo launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.mysql.plist

# 停止 MySQL Server
sudo launchctl unload -w /Library/LaunchDaemons/homebrew.mxcl.mysql.plist

附录:用 launchctl 来管理服务

官方不推荐用 brew services 方式管理服务(以后可能被淘汰),那么可以用以下方法:

# 将 Redis Server 设为开机启动
sudo ln -sfv /usr/local/opt/redis/*.plist /Library/LaunchDaemons
sudo chown root:wheel /Library/LaunchDaemons/homebrew.mxcl.redis.plist
sudo launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.redis.plist

# 停止 Redis Server
sudo launchctl unload -w /Library/LaunchDaemons/homebrew.mxcl.redis.plist

# 将 Memcache Server 设为开机启动
sudo ln -sfv /usr/local/opt/memcached/*.plist /Library/LaunchDaemons
sudo chown root:wheel /Library/LaunchDaemons/homebrew.mxcl.memcached.plist
sudo launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.memcached.plist

# 停止 Memcache Server
sudo launchctl unload -w /Library/LaunchDaemons/homebrew.mxcl.memcached.plist

特别注意:当 Memcached 以 root 身份启动时,必须带上 -u 参数,需修改 plist

sudo sed -i '' \
    -e 's#<string>-l</string>#<string>-u</string>#g' \
    -e 's#<string>localhost</string>#<string>root</string>#g' \
    /Library/LaunchDaemons/homebrew.mxcl.memcached.plist

修改后的 plist 全文如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>homebrew.mxcl.memcached</string>
    <key>KeepAlive</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/opt/memcached/bin/memcached</string>
        <string>-u</string>
        <string>root</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>Debug</key>
    <true/>
    <key>WorkingDirectory</key>
    <string>/usr/local</string>
    <key>StandardErrorPath</key>
    <string>/usr/local/var/log/memcached.log</string>
    <key>StandardOutPath</key>
    <string>/usr/local/var/log/memcached.log</string>
</dict>
</plist>

或者直接设置命令别名 vi ~/.zshrc,加入:

alias mysql.start="sudo launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.mysql.plist"
alias mysql.stop="sudo launchctl unload -w /Library/LaunchDaemons/homebrew.mxcl.mysql.plist"
alias mysql.restart='mysql.stop && mysql.start'

alias redis.start="sudo launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.redis.plist"
alias redis.stop="sudo launchctl unload -w /Library/LaunchDaemons/homebrew.mxcl.redis.plist"
alias redis.restart='redis.stop && redis.start'

alias memcached.start="sudo launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.memcached.plist"
alias memcached.stop="sudo launchctl unload -w /Library/LaunchDaemons/homebrew.mxcl.memcached.plist"
alias memcached.restart='memcached.stop && memcached.start'

source ~/.zshrc

附录:homebrew 其他技巧

# 诊断 brew
brew doctor

# 查看配置和版本
brew config

# 更新 brew 源
brew update

# 升级软件
brew upgrade

# 卸载软件
brew uninstall wget

# 使用 brew 第三方安装源
brew tap phinze/homebrew-cask
brew install brew-cask

# 然后像 brew 一样来安装软件
brew cask install google-chrome

# 查看 homebrew cask 已支持软件列表
https://github.com/phinze/homebrew-cask/tree/master/Casks

# 卸载软件
brew cask uninstall google-chrome

2016.10.25 补充说明

自 MacOS Sierra 系统发布后,homebrew 里的 php71 安装时默认不会编译 Apache 的 libphp7.so 模块,务必加上 --with-apache 参数

brew install homebrew/php/php71 --with-apache

如果通过 homebrew 升级了 Apache2.4(Mac虽然自带 Apache,但有些库版本较旧,可通过 /usr/sbin/httpd -v 可查看自带的 Apache 版本)

那么请移步:Mac 通过 brew 安装 Apache2.4

2016.11.01 一键安装脚本

本司的全栈小王子陈问鱼同学把以上各步骤写成了一个自动脚本,无人值守、省时省力,以后再也不用一步步复制粘贴啦~

可以通过直接在命令行运行 cURL:

curl -o- https://raw.githubusercontent.com/silverd/silverd.github.io/master/res/attach/install_mac_dev_env.sh | sh

或者 Wget:

wget -qO- https://raw.githubusercontent.com/silverd/silverd.github.io/master/res/attach/install_mac_dev_env.sh | sh

Linux 学习笔记:输出日志 >/dev/null 2>&1

  1. 标准输入 stdin 文件描述符为 0
  2. 标准输出 stdout 文件描述符为 1
  3. 标准错误 stderr 文件描述符为 2
  4. /dev/null 表示空设备,相当于垃圾桶

2>1 与 2>&1 的区别

  • 2>1 把标准错误 stderr 重定向到文件 1 中
  • 2>&1 把标准错误 stderr 重定向到标准输出 stdout

各种举例说明

假设有脚本 test.sh,内容如下:

t 是一个不存在的命令,执行脚本进行下面测试。

# cat test.sh
t
date

标准输出重定向到 log,错误信息输出到终端上,如下:

# ./test.sh > log
./test.sh: line 1: t: command not found

# cat log
Thu Mar 23 22:53:02 CST 2016

删除 log 文件,重新执行,这次是把标准输出定向到 log,错误信息定向到文件 1

# ./test.sh > log 2>1
# cat log
Thu Mar 23 22:56:20 CST 2016
# cat 1
./test.sh: line 1: t: command not found

把标准输出重定向到 log 文件,把标准错误重定向到标准输出

# ./test.sh > log 2>&1
#
# cat log
./test.sh: line 1: t: command not found
Thu Mar 23 22:58:54 CST 2016

把错误信息重定向到空设备

# ./test.sh 2>/dev/null
Thu Mar 23 23:01:07 CST 2016

把标准输出重定向到空设备

# ./test.sh >/dev/null
./test.sh: line 1: t: command not found

把标准输出和标准错误全重定向到空设备

#./test.sh >/dev/null 2>&1

Linux 学习笔记

六年前的学习笔记(2010年)

终端语言乱码问题

设置语言包编码 /etc/sysconfig/i18n,同时结合 SecureCRT 的外观语言设置 UTF-8 和中文字体,可解决 SecureCRT 中文乱码问题。

CentOS启动默认进入命令行界面(关闭X-Windows)

vi /etc/inittab
设置 id:3:initdefault: 编号

虚拟机三种上网方式的含义和区别

  • NAT: 跟主机同一个IP,没有自己独立IP,主机与虚拟机之间不可互相通信;可以方便上外网。
  • Host-Only: 跟主机构成一个私有的小局域网,有独立IP,但不能上外网(可研究共享主机Internet连接解决)
  • Bridge: 和主机同级,加入到主机所在的大局域网内,有独立IP,可上外网,主机与虚拟机之间可相互通信。

一些命令

# 精确查找文件[包括后缀]
find / -name libmysqlclient.so

# 模糊查找文件名,引号不可少
find / -name 'libmysqlclient*'  

注意 find 、locate、whereis 的异同

查看 Linux 版本

uname –a -s、lsb_release –a

查看文件夹容量大小

du -sh dir_name/

目录操作

cd - (减号),返回刚才的目录(refer)
cd 空 <=> cd ~ 返回家目录

复制时强制覆盖(命令前面加斜杠)

# \cp xxx xxx

后缀名 *.tar.gz 等价于 *.tgz

Linux 访问光驱

挂载

mkdir /mnt/cdrom
mount -o ro /dev/cdrom /mnt/cdrom

卸载

umount /mnt/cdrom

关闭 SELINUX

vi /etc/sysconfig/selinux 或者(/etc/selinux/config)
修改 SELINUX=enforcing 为 disabled

编译PHP参数串

./configure --prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--with-apxs2=/usr/local/apache/bin/apxs \
--with-mysql=/usr --with-mysqli=/usr/bin/mysql_config \
--with-libxml-dir=/usr \
--with-zlib=/usr --with-zlib-dir=/usr \
--with-iconv-dir=/usr/local \
--with-curl=/usr/include/curl \
--with-mcrypt=/usr/local \
--with-mhash=/usr/local \
--with-openssl=/usr \
--with-xsl=/usr \
--enable-mbstring \
--enable-ftp \
--enable-soap \
--enable-sockets \
--enable-fastcgi --enable-force-cgi-redirect --enable-fpm \
--with-gd=/usr \
--with-jpeg-dir=/usr \
--with-png-dir=/usr \
--with-freetype-dir=/usr \
--enable-gd-native-ttf

颜色说明: 蓝色 php.ini 放置的路径,缺省是 /usr/local/php/lib/php.ini 红色 必须项目。注意,如以 Nginx + PHP-FPM 方式安装,则必须去除 --with-apxs2=/usr/local/apache/bin/apxs 这项,并且加上 --enable-fpm,这样才能以 fast-cgi 方式运行 黑色 其他扩展 [–enable-zip –with-bz2]

补充: 如果 make 时报错:/usr/bin/ld: cannot find –lgcrypt, 则是 –with-xsl没有正确安装,需先装 libxml2 + libxslt

其中路径 /usr/local 为缺省,例如 –with-mhash=/usr/local 可以省略为 –with-mhash

编译 PHP 前要先安装 apache 和 mysql (client, server, devel, share) RPM 包,这次安装的 zlib、gd 库采用的都是RPM包

设置网卡IP和地址

快速修改(一次有效,重启后无效)

ifconfig eth0 192.168.0.20 netmask 255.255.255.0

永久修改:

vi /etc/sysconfig/network-scripts/ifcfg-eth0

修改MAC地址、网卡名(eth0)等等。 修改或增加一行 IPADDR=xx.xxx.xx.xx

注:BOOTPROTO (启动协议)必须设置为 static 或 none 才可以使用自定义 IP 设置信息。 默认是 dhcp 则无效。

重启网卡:

/etc/init.d/network restart
或
service network restart

RPM 包的安装和卸载

查看 rpm -qa|grep -i mysql 参数i表示忽略大小写
安装 rpm -ivh MySQL-server-5.1.53-1.glibc23.i386.rpm
卸载 rpm -e MySQL-server  SILVER-TIPS 不要写RPM后缀名,版本号也可省略,否则会提示找不到组件

防火墙的设置

vi /etc/sysconfig/iptables

# 增加一行:
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 11211 -j ACCEPT

重启命令

/etc/inid.d/iptables restart
或
service iptables restart

停止或开启

/etc/inid.d/iptables stop|start
或
service iptables stop|start

查看状态

/etc/inid.d/iptables status

查看 Linux 运行了多少时间

uptime

显示如下信息:
11:09:38 up 50 days, 23:00,  2 users,  load average: 0.75, 1.06, 0.90

echo 写文件时的用法

# 1个箭头,把文件清空并重写内容
echo 'xxxxxxx' > /dir/test.txt

# 2n个箭头,在文件尾追加内容
echo 'xxxxxxx' >> /dir/test.txt

SCP 远程拷贝

# 将本地(来源)的推送复制到远程(目标)
scp /tmp/test.zip root@192.168.1.155:/soft

# 将远程(来源)的拉取复制到本地(目标)
scp root@192.168.1.150/tmp/test.zip /soft

# 拷贝文件夹
scp –r /tmp/testdir/ root@10.1.1.54:/etc/testdir/

Linux只能访问 IP 不能解析域名?

原因:本机没有设置DNS解析服务器

解决办法:

vi /etc/resolv.conf 

# 加入以下几行
nameserver 8.8.8.8
nameserver 202.96.128.86
nameserver 202.96.128.166

然后重启网络服务:

service network restart

修改 ssh 的端口号

# 修改其中的 Port 22,可以有多行,表示启用多个端口
vi /etc/ssh/sshd_config

# 重启 SSH 服务
/etc/init.d/sshd restart

SecureCRT 没有 rz/sz 命令

# 安装 lrzsz 软件包
yum install lrzsz

修改 Linux 用户密码

# 修改当前用户密码
passwd

# 修改指定用户
passwd silverd

输出空 1>/dev/null 2>&1

  • 1 表示标准输出,输出到空设备 /dev/null
  • 2 表示错误输出,引用指向1,表示也输出为空

mysql 命令行创建数据库

mysqladmin create dbname -uroot -proot

ubuntu 下禁用/开启触摸板

modprobe psmouse# modprobe -r psmouse

查找大于2M的文件或目录(用于清理空间)

find / -size +2048k
du -h|sort –gr
du --max-depth=1 –h
find / -name *.log* -type f -size +100M

确定当前MySQL正在使用的 my.cnf 位置

mysql --help | grep my.cnf

统计某文件夹及其子文件夹的文件总数

ls -lR | grep "^-" | wc -l

vi编辑器的批量替换

:%s/查找的文字/替换成的文字/g
注意:/g 表示忽略大小写

把查找到的文件的内容合并成一个文件

find ./ -name 'sqlError.log' -exec 'cat' {} \; > target.log

读兄弟连 PPT 记录 vi 常用命令

命令 说明
:setnu 显示行号
:setnonu 不显示行号
gg 跳到文件头
G 跳到文件尾
:n 跳到指定行
nG 跳到指定行
dG 删除当前行到文件末尾
:%s/old/new/g 全文替换指定字符串
:n1,n2s/old/new/g 在一定范围内替换指定字符串
:wq! 保存修改并退出
ZZ 快捷键,保存修改并退出

读兄弟连PPT其他笔记

  • kill -9 进程号(强行关闭)
  • kill -1 进程号(重启进程)

理解 HTTPS

简介

HTTPS 中的 S 代表 Secure,所以 HTTPS 自然就是更安全的 HTTP 的意思。互联网诞生之初 SSL(Secure Sockets Layer 安全套接层)是由 Netscape 这家最早的浏览器公司设计的,主要是用于 Web 的安全传输的协议,这种协议在早期 Web 上获得了广泛的应用。后来被 IETF 标准化形成了 TLS(Transport Layer Security 传输层安全)标准,其历史如下:

  • 1994: SSL1.0,因为存在严重的安全漏洞,未发布。
  • 1995: SSL2.0,这个版本由于设计缺陷,很快被发现有严重漏洞,被废弃。
  • 1996: SSL3.0,重新设计并开始流行,SSL 前三个版本都是由 Netscape 设计实现,有已知漏洞,建议弃用。
  • 1999: TLS1.0,IETF 将 SSL 标准化,即 RFC 2246,也存在部分安全漏洞,比如 RC4 和 BEAST 攻击。
  • 2006: TLS1.1,作为 RFC 4346 发布。
  • 2008: TLS1.2,作为 RFC 5246 发布 。
  • 2015: TLS1.3,尚在制定中,处于草案阶段。

如上,现在互联网世界使用最广泛的应该是 TLS1.2 标准。

##目标

SSL/TLS 最初的设计目标就是为了实现下面三个目的:

  1. 保密:第三方无法窃听。
  2. 完整:无法篡改。
  3. 认证:防止身份冒充。

结构

整个互联网构建于 TCP/IP 协议栈基础之上,SSL/TLS 协议处于该分层协议栈结构中的会话层位置:

流程和步骤

1. 客户端发起 HTTPS 请求

客户端向服务端传送:

  • SSL Version : 自己支持的最高协议版本,比如 TLS 1.2
  • Ciphers : 支持的加密套件,比如: RSA 非对称加密算法,AES 对称加密算法
  • 随机数 (A) RandomC

2. 服务端的配置

服务器的数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面。

这套证书其实就是一对公钥和私钥。可以想象成一把钥匙和一个锁头,全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。

关于数字证书可以查看另一篇:数字签名是什么?

3. 传送证书

服务端向客户端传送证书,包含以下信息:

  • 服务器公钥(明文)
  • 申请者的组织信息和个人信息
  • 签发机构 CA 的信息
  • 有效时间、证书序列号等信息(明文)
  • 发行者的数字签名:使用散列函数计算公开的明文信息的摘要,然后用 CA 的私钥对信息摘要进行加密,密文即签名

同时会一并做传送以下信息:

  • 确认使用的 SSL 协议的版本号
  • 加密套件 Cipher Suite
  • 随机数 (B) RandomS
  • CertificateRequest 可选,Server 端需要认证 Client 端身份的请求时发送。 比如,银行提供的各类 U 盾,其实就是一种 Client 证书,一般在线使用专业版网银时才需要。
  • ServerHelloDone 表示 Server 响应结束。

4. 客户端验证证书

客户端的 TLS 来验证证书的合法性:

  • 证书是否过期
  • 签发机构 CA 是否可靠
  • 签发机构 CA 的公钥来验证服务器证书的发行者数字签名
  • 证书上的域名和服务器的实际域名是否一致

如果证书没有问题,那么就生成一个随机数 (C)。然后把三个随机数 A+B+C 拼接成一个新的随机数 (D),用服务端公钥(证书里解析得来)对随机数 (D) 进行加密,形成行动暗号

如果发现异常,浏览器则会弹出一个警告框,提示证书存在问题。如果这时用户仍然选择『继续』,就表示不验证证书合法性,直接把证书里的 服务端公钥拿来用就是了。

5. 传送暗号

客户端把行动暗号发送给服务端,以后两边的通信就通过这个暗号来进行对称加、解密了。

同时向服务端传送以下信息:

  • Certificate 如果在ServerHello 时服务端要求客户端 U 盾验证,那么 Client 端也会在这一步响应 Server 的 CertificateRequest 请求。
  • CertificateVerify 用于对客户端 U 盾证书提供证明,对于特定的证书需要可选发送。
  • ChangeCipherSpec 告知 Server,Client 已经切换到之前协商好的加密套件(Cipher Suite)的状态,准备加密数据并传输了。
  • ClientFinished Client 会用协商好的算法先加密一小段 Finished 的数据传送给 Server,为了在正式传输前做最后验证。

6. 服务端获取暗号

服务端用自己的私钥解密得到了客户端传过来的行动暗号。同时服务端回应以下信息:

  • NewSessionTicket 表示新建了一个会话票据,传递给 Client。若连接意外中断 Client 需要重建会话时,可以复用该票据,加速握手过程。
  • ChangeCipherSpec 告知 Client,Server 已经切换到协商过的加密套件状态,准备加密数据并传输了。
  • ServerFinished Server 会用协商好的算法加密一小段 Finished 的数据传送给 Client,为了在正式传输前做最后验证。

至此,整个 SSL 握手阶段全部结束。接下来 Client 和 Server 进入使用会话密钥的加密通信过程。

7. 服务端返回加密信息

服务端用行动暗号把数据加密后发回给客户端。

8. 客户端解密信息

客户端用行动暗号解密服务端发过来的信息。

完成!

FAQ

Q: 应用层数据为什么不用非对称加解密?性能开销太大,无法承受。

A: CPU 计算资源消耗非常大。一次完全 TLS 握手,密钥交换时的非对称解密计算量占整个握手过程的 90% 以上。而对称加密的计算量只相当于非对称加密的 0.1%。 非对称加密算法对加密内容的长度有限制,不能超过公钥长度。比如现在常用的公钥长度是 2048 位,意味着待加密内容不能超过 256 个字节。

所以公钥加密目前只能用来作密钥交换或者内容签名,不适合用来做应用层传输内容的加解密。

Q: 交互过程中到底有几个随机数?

A: 一共有三个随机数。

  • 第1个 RandomC 由 clientHello 时生成发送给服务端
  • 第2个 RandomS 由 serverHello 时生成发送给客户端(随着 CA 证书一起发回)
  • 第3个 PreMaster 由客户端生成

根据三个随机数,计算得到行动暗号

PreMasterSecret = crypt(RandomC, RandomS, PreMaster)

至于为什么要用三个随机数,是为了增加更多随机因素,防止被猜出。

参考文章:

Nginx 配置 SSL 证书支持 Https

确保机器上安装了 openssl 和 openssl-devel

yum install openssl
yum install openssl-devel

注意:如果 Nginx 以后要开启 HTTP2,那么 OpenSSL 库必须是 1.0.2 以上,CentOS 通过 yum 安装的版本太旧,只有 1.0.1e。我们需要去官网下载最新版,并且在重新编译升级 Nginx 时指定 OpenSSL 的源码目录(--with-openssl='path/to/openssl')。如果不带这个参数,Nginx 只会去读系统自带的 OpenSSL 库。

所以也可以用更彻底的方法:升级系统全局 OpenSSL 版本,那么 Nginx 时就不用指定 OpenSSL 源码目录了。

确保 Nginx 支持 SSL 模块,编译时带 --with-http_ssl_module 参数(可通过 nginx -V 查看 configure 时的参数),否则会报错

[emerg] 10464#0: unknown directive "ssl" in /usr/local/nginx/conf/nginx.conf:74”

创建服务端私钥(第三方 SSL 证书签发机构都要求起码 2048 位的 RSA 加密的私钥)

cd /usr/local/nginx/
mkdir ssl && cd ssl
openssl genrsa -des3 -out hicrew.key 2048

创建证书请求文件(CSR = SSL Certificate Signing Request)

openssl req -new -nodes -sha256 -key hicrew.key -out hicrew.csr

依次输入密码、国家代码、省份城市、邮箱等信息即可。

Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Shanghai
Locality Name (eg, city) [Default City]:Shanghai
Organization Name (eg, company) [Default Company Ltd]:Morecruit
Organizational Unit Name (eg, section) []:RD
Common Name (eg, your name or your server's hostname) []:api.hicrew.cn
Email Address []:support@morecruit.cn

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:hicrew
An optional company name []:qa.api.hicrew.cn

特别注意

Common Name 和 An optional company name 是证书的生效域名。 如果只是同一个站点下面分出很多个子域名,那么可以直接申请通配证书,将证书的 Common Name 填写为 *.hicrew.cn,但 这种写法只能匹配二级域名,根域名 hicrew.cn 和三级域名 qa.api.hicrew.cn 都无法匹配,所以如果有更多的域名,可以填入“使用者可选名称”。参考《SSL多域名绑定证书的解决方案》

去除私钥里的密码信息(否则以SSL启动Nginx时会提示必须输入密钥)

openssl rsa -in hicrew.key -out hicrew_nopwd.key

使用刚生成的私钥和CSR进行证书签名(10年有效期)

或者到 StartSSL 上传 CSR 后获得经 CA 机构签名后的证书,如:1_study.hicrew.cn_bundle.crt

openssl x509 -req -days 3650 -sha256 -in hicrew.csr -signkey hicrew_nopwd.key -out hicrew.crt

如果需要用 pfx 可以用以下命令生成

openssl pkcs12 -export -inkey hicrew.key -in hicrew.crt -out hicrew.pfx

修改 Nginx 配置文件,让其包含新标记的证书和私钥:

server
{
    listen 443;
    server_name api.hicrew.cn;

    ssl on;
    ssl_certificate /usr/local/nginx/ssl/hicrew.crt;
    ssl_certificate_key /usr/local/nginx/ssl/hicrew_nopwd.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL;
    ssl_prefer_server_ciphers on;

    # HSTS (HTTP Strict Transport Security, ngx_http_headers_module is required)
    # 让浏览器访问 HTTP 时强制 307 内部跳转到 HTTPS
    add_header Strict-Transport-Security max-age=15768000;
}

全部 CipherSuite 可以在 IANA 的 TLS Cipher Suite Registry 页面查看。

协商算法配置务必参考权威 Mozilla 的推荐配置 或者 CloudFlare 使用的配置

另外还可以实现访问 80 端口直接重定向到 443(其实 HSTS 307 Internal Redirect 已经可以实现这个效果)但为了双保险,再加一个 vhost 做 302 重定向:

server
{
    listen 80;
    server_name api.hicrew.cn;
    rewrite ^(.*) https://$server_name$1 permanent;
}

重启 nginx 就可以通过以下方式访问了

https://api.hicrew.cn

Chrome 浏览器可以安装 HTTP/2 and SPDY indicator 插件看到『蓝色闪电』表示本站启用了 HTTP2。

或者在线测试:https://tools.keycdn.com/http2-test

FAQ

问:如何让浏览器信任自己办法的证书,以IE为例:

答:

IE:控制面板 -> Internet选项 -> 内容 -> 发行者 -> `受信任的根证书颁发机构` -> 导入 -> 选择 hicrew.crt
Chrome:设置 -> 显示高级设置 -> HTTPS/SSL 管理证书 -> `受信任的根证书颁发机构` -> 导入 -> 选择 hicrew.crt

问:什么是针对企业的 EV SSL

答:EV SSL,是 Extended Validation 的简称,更注重于对企业网站的安全保护以及严格的认证。最明显的区别就是,通常 EV SSL 显示都是绿色的条

参考文章: