macOS 终端与 Homebrew 代理配置教程

#Mac代理#Homebrew#Terminal
阅读需 7 分钟||

在 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, git HTTP协议)支持最完善。
  • SOCKS5 代理:一种更底层的代理协议,能代理任何 TCP/UDP 流量,常用于 Git 的 SSH 协议([email protected]...)。

假设你的代理客户端(如 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 或者代理客户端的日志中出现了请求记录,即代表配置生效。

机场讯 技术安全审查组Fact-Checked

本文所述的网络配置指南、路由分析及安全建议已通过技术独立验证。文内提及的客户端配置与底层原理引用自各开源项目的官方文档。为保障您的设备安全,请严格按照教程指引操作,切勿随意修改系统级内核参数。

相关推荐