让 Iterm 2 也能使用代理
因为工作需要,我经常需要在命令行下做很多操作,比如:XX 然而这些网站都在国外,如果直接使用的话,速度可想而知。为此,国内也有许多相关的镜像。
因为工作需要,我经常需要在命令行下做很多操作,比如:
# 使用 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
这些镜像几乎都能保持与官方镜像的一致,因此使用这些镜像也是个不错的选择。但是也有很多是没有一个稳定镜像的,比如 Cocoapod
的 master 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
是为后面的 goproxy
和 disproxy
命令起的别名,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://[email protected]/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 协议应该也能走代理了。