macOS 终端与 Homebrew 代理配置教程
在 macOS 上开启代理客户端的“系统代理”后,你会发现浏览器可以正常访问外网,但在终端(Terminal / iTerm2)中使用 curl、git clone 或 brew install 时依然会卡住甚至超时报错。
为什么终端不走系统代理?
macOS 的“系统代理”实际上只作用于使用了 Apple 官方网络框架(如 WebKit, URLSession)的应用程序(如 Safari、Chrome 和绝大多数 GUI 软件)。
终端里的底层命令行工具(如 curl, wget, git, homebrew 等)大多是跨平台的开源软件,它们默认并不会去读取 macOS 的系统偏好设置,而是只认特定的环境变量。
环境变量:HTTP 与 SOCKS 代理的区别
要让终端走代理,我们需要手动导出环境变量。常见的有两个协议:
- HTTP/HTTPS 代理:大部分工具(如
curl,gitHTTP协议)支持最完善。 - SOCKS5 代理:一种更底层的代理协议,能代理任何 TCP/UDP 流量,常用于 Git 的 SSH 协议(
git@github.com...)。
假设你的代理客户端(如 ClashX 或 Surge)的本地 HTTP 监听端口是 7890,SOCKS5 端口也是 7890:
临时在当前终端窗口生效
如果你只想在本次命令行操作中走代理,可以直接输入以下命令:
export http_proxy="http://127.0.0.1:7890"
export https_proxy="http://127.0.0.1:7890"
export all_proxy="socks5://127.0.0.1:7890"
设置 Shell 快捷别名 (Alias)
为了避免每次都敲这么长的命令,我们可以在 Bash 或 Zsh 配置文件中编写一个开关函数。
对于 macOS 默认的 Zsh 用户,编辑 ~/.zshrc:
# 开启终端代理
function proxy_on() {
export http_proxy="http://127.0.0.1:7890"
export https_proxy="http://127.0.0.1:7890"
export all_proxy="socks5://127.0.0.1:7890"
export NO_PROXY="localhost,127.0.0.1,.local,::1"
echo -e "终端代理已开启。"
}
# 关闭终端代理
function proxy_off() {
unset http_proxy https_proxy all_proxy
echo -e "终端代理已关闭。"
}
保存后执行 source ~/.zshrc。
以后在终端输入 proxy_on 即可开启代理,输入 proxy_off 即可恢复直连。
NO_PROXY 的作用
注意我们在脚本里加入了 NO_PROXY 环境变量。这是为了防止你在本地开发测试时,终端也把发送给本地 localhost 的请求(比如你启动的本地 Node.js 服务器)发给了代理客户端,导致无法访问本地服务。
针对特定工具的配置
1. Homebrew
只要设置了上述的 http_proxy 环境变量,brew install 下载依赖时就会自动走代理,无需额外配置。
2. Git
Git 对于 HTTP 链接(https://github.com/...)会读取环境变量,但如果是 SSH 链接,则需要修改 ~/.ssh/config,利用 nc (netcat) 来走 SOCKS5 代理:
Host github.com
HostName github.com
User git
ProxyCommand nc -X 5 -x 127.0.0.1:7890 %h %p
代理连通性验证
设置完成后,可以通过以下命令验证代理是否成功:
curl -I https://www.google.com
如果立即返回 HTTP/2 200 或者代理客户端的日志中出现了请求记录,即代表配置生效。