因为工作需要,我经常需要在命令行下做很多操作,比如:

# 使用 git 命令从 github clone 仓库
git clone https://github.com/xxx/project.git

# 使用 cocoapod 命令设置本地 repo
pod setup

# 使用 npm 安装 nodejs 依赖
npm install

# 使用 gem 安装 ruby 依赖
gem install

然而这些网站都在国外,如果直接使用的话,速度可想而知。为此,国内也有许多相关的镜像。比如 Ruby 就有淘宝的镜像:

https://ruby.taobao.org

Nodejs 也有淘宝的镜像:

https://npm.taobao.org

这些镜像几乎都能保持与官方镜像的一致,因此使用这些镜像也是个不错的选择。但是也有很多是没有一个稳定镜像的,比如 Cocoapodmaster repo

在开发中,执行此类命令的频率比较高,所以速度慢的话非常影响开发效率。因此,最简单的办法就是让这个命令执行的时候也走代理。

但是 Iterm 2 的选项中是没有代理设置这一项的,好在我们可以通过安装 Oh My Zsh,然后通过修改配置文件来实现代理。zsh 的配置文件为:~/.zshrc

安装 Oh My Zsh

sh -c "$(wget https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)"

或者

sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

HTTP、HTTPS 协议

我们先来配置下 HTTP 和 HTTPS 协议的代理,首先在配置文件 ~/.zshrc 中新增:

alias goproxy='export http_proxy=http://127.0.0.1:6152 https_proxy=http://127.0.0.1:6152'
alias disproxy='unset http_proxy https_proxy'

其中,alias 是为后面的 goproxydisproxy 命令起的别名,6152 是本地的代理的端口号,这个需要根据自己具体使用的代理确定。如果使用 ShadowsocksX,代理端口应该是 1080,如果使用 Surge,代理端口可以在网络的 高级 -> 代理 选项中查看。

重启 Iterm 2,然后在需要用到的时候,使用 goproxy 启用,不需要使用的话使用 disproxy 关闭。

Git 协议

上面的配置仅仅是针对 HTTP 和 HTTPS 协议的,如果使用 Git 协议进行操作,上面的配置就无效了。下面我们来配置一下针对于 Git 协议的代理。

编译 connect

这里需要用到一个名为 connect 的项目。由于 connect 项目托管在 Bitbucket,采用 mercurial 进行版本管理。所以需要先安装 mercurial:

brew install mercurial

然后 clone connect 项目到本地:

hg clone ssh://hg@bitbucket.org/gotoh/connect

然后 cd 到该文件夹,使用 make 命令进行编译。

我在 Mac 上编译的时候遇到了上面这个错误,根据错误提示可以把 connect.c 文件中的下面这段代码注释掉再编译就好:

signal(SIGALRM, (__sighandler_t)sig_timeout);

编译成功后会得到 connect 文件,将该文件复制到如下目录:

/usr/bin

如果你使用 macOS 10.11 及以上系统,在复制的时候应该会失败,原因是苹果在 10.11 中全面启用了 System Integrity Protection (SIP) —— 系统完整性保护技术。所以即使用 root 权限也无法修改 /usr/lib 路径的内容,提升了系统的健壮性。我们可以使用下面的方法来关闭这个功能。

重启并按住 Command + R 进入恢复模式,在命令行中输入如下命令:

csrutil disable

执行完毕后重启即可。

接下来编辑 ssh 配置文件:

vi ~/.ssh/config 

内容如下:

ProxyCommand connect -S 127.0.0.1:6153 %h %p  

-S 代表使用 Socks 代理,如果需要使用 HTTP、HTTPS,可以使用 -H

OK,现在 Git 协议应该也能走代理了。