文章
终端代理设置:让 Claude Code、Codex、git 走代理
系统代理对命令行工具通常无效。本文给出 zsh/bash、PowerShell、CMD 的代理环境变量写法,git 与 npm 的代理配置,用 curl 验证的方法,以及 TUN 模式这一替代方案。
简短回答
大多数命令行工具不读取系统代理,需要在终端设置 HTTPS_PROXY 等环境变量,或在客户端开启 TUN 模式。设置时把端口换成你客户端实际的本地端口,再用 curl 验证是否生效。
快速步骤 · 6 步
- 01确认本地代理端口
在代理客户端设置中查看 HTTP 或混合端口,下文以 7890 为例。
- 02设置终端环境变量
根据系统在 zsh、bash、PowerShell 或 CMD 中设置 HTTP_PROXY、HTTPS_PROXY 和 NO_PROXY。
- 03写入快捷开关
在 ~/.zshrc 中添加 proxy_on 和 proxy_off 函数,按需开关。
- 04配置 git 和 npm
用 git config 和 npm config 为两者单独设置代理。
- 05用 curl 验证
用 curl 请求 AI 服务的 API 域名,能返回 HTTP 状态码即表示网络已通。
- 06必要时改用 TUN
工具不认环境变量时,关闭环境变量并在客户端开启 TUN 模式。
为什么终端需要单独设置代理
客户端里的“系统代理”只是修改了操作系统的代理设置,浏览器会遵循它,但 Claude Code、Codex CLI、git、npm、curl 这类命令行程序通常只读取环境变量(HTTPS_PROXY 等)或自己的配置文件。所以常见情况是:浏览器里 Claude 能正常打开,终端里却一直超时。解决办法有两种:给终端设置代理变量,或在客户端开启 TUN 模式接管全部流量。下面先讲环境变量的写法,再讲 git、npm 的单独配置和验证方法。
第一步:确认本地端口
所有命令里的端口,都要换成你的代理客户端实际监听的端口。本文示例统一使用 7890,这是 Clash 系客户端常见的默认混合端口,但并非所有客户端都是这个值,例如 Clash Verge Rev 和 v2rayN 的默认端口可能不同。请在客户端的设置页中找到 HTTP 端口或混合端口(mixed port)。
说明
Claude Code 官方文档说明它支持 HTTPS_PROXY、HTTP_PROXY 等变量,但不支持 SOCKS 代理,因此建议统一使用 http:// 形式的地址。
macOS / Linux:zsh 与 bash
临时生效(只对当前终端窗口有效):
export HTTP_PROXY=http://127.0.0.1:7890
export HTTPS_PROXY=http://127.0.0.1:7890
export ALL_PROXY=http://127.0.0.1:7890
export NO_PROXY=localhost,127.0.0.1,::1
有些程序只认小写变量名,可以同时设置 http_proxy、https_proxy 等小写版本。更方便的做法是在 ~/.zshrc(bash 用户写入 ~/.bashrc)末尾加入一对开关函数:
proxy_on() {
export HTTP_PROXY=http://127.0.0.1:7890
export HTTPS_PROXY=$HTTP_PROXY ALL_PROXY=$HTTP_PROXY
export http_proxy=$HTTP_PROXY https_proxy=$HTTP_PROXY all_proxy=$HTTP_PROXY
export NO_PROXY=localhost,127.0.0.1,::1 no_proxy=localhost,127.0.0.1,::1
echo "proxy on"
}
proxy_off() {
unset HTTP_PROXY HTTPS_PROXY ALL_PROXY NO_PROXY
unset http_proxy https_proxy all_proxy no_proxy
echo "proxy off"
}
保存后执行 source ~/.zshrc,以后在终端输入 proxy_on 即可开启,proxy_off 关闭。
Windows:PowerShell 与 CMD
PowerShell 临时设置:
$env:HTTP_PROXY = "http://127.0.0.1:7890"
$env:HTTPS_PROXY = "http://127.0.0.1:7890"
$env:NO_PROXY = "localhost,127.0.0.1"
需要长期生效,可以写入当前用户的环境变量(新开的终端才会读到):
[Environment]::SetEnvironmentVariable("HTTPS_PROXY", "http://127.0.0.1:7890", "User")
[Environment]::SetEnvironmentVariable("HTTP_PROXY", "http://127.0.0.1:7890", "User")
CMD 中使用 set,注意等号两边不要有空格,也不要加引号:
set HTTP_PROXY=http://127.0.0.1:7890
set HTTPS_PROXY=http://127.0.0.1:7890
git 与 npm 的单独配置
git 和 npm 有自己的代理配置项,设置后不依赖环境变量:
git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy http://127.0.0.1:7890
npm config set proxy http://127.0.0.1:7890
npm config set https-proxy http://127.0.0.1:7890
取消时执行:
git config --global --unset http.proxy
git config --global --unset https.proxy
npm config delete proxy
npm config delete https-proxy
注意
http.proxy 只对 https://github.com/... 形式的仓库地址生效。使用 git@github.com:... 的 SSH 地址时,需要在 ~/.ssh/config 中单独配置,或改用 HTTPS 地址。
用 curl 验证是否生效
设置完成后,在同一个终端窗口中执行:
curl -sS -o /dev/null -w "%{http_code}\n" https://api.anthropic.com
curl -sS -o /dev/null -w "%{http_code}\n" https://api.openai.com/v1/models
只要返回一个 HTTP 状态码(未带 API Key 时返回 401、404 都正常),就说明网络已经通了;如果长时间无响应或提示连接超时,说明请求没有走代理或节点不可用。Windows 的 PowerShell 中请使用 curl.exe 调用真正的 curl。验证通过后再启动 Claude Code 或 Codex CLI,具体配置可分别参考 Claude Code 网络环境与连接配置 和 Codex CLI 代理与网络配置。
替代方案:TUN 模式
如果需要走代理的程序很多,或者某些工具(部分 IDE 插件、编译工具链)不读取环境变量,可以直接在客户端开启 TUN 模式。TUN 会创建虚拟网卡,在网络层接管流量,不需要逐个配置。代价是需要管理员权限,并且更容易和其他 VPN、加速器冲突。
| 方案 | 优点 | 缺点 |
|---|---|---|
| 环境变量 | 可控、只影响当前终端 | 每种工具要单独确认是否支持 |
| git / npm 配置 | 长期生效、不依赖变量 | 只对该工具有效 |
| TUN 模式 | 全局接管,免逐个配置 | 需要权限,易与其他软件冲突 |
仍然无法连接时,按 Claude Code 网络连接失败怎么办 逐项排查。
常见问题
Q设置了 HTTPS_PROXY,为什么关掉终端后就失效了?
用 export 或 $env 设置的变量只在当前终端会话中有效。需要长期生效时,写入 ~/.zshrc、~/.bashrc 或 PowerShell 的用户环境变量。
Q7890 端口一定对吗?
不一定。7890 是 Clash 系客户端常见的默认混合端口,但不同客户端、不同版本的默认端口不同,请在客户端设置中查看实际端口。
Qgit clone 用的是 git@github.com 地址,设置 http.proxy 没用?
http.proxy 只对 HTTPS 地址生效,SSH 地址需要在 ~/.ssh/config 中单独配置代理,或改用 HTTPS 地址克隆。
Q环境变量和 TUN 模式该选哪个?
只需要少数终端工具走代理时,用环境变量更可控;工具很多或某些程序不认环境变量时,开启 TUN 更省事。两者不需要同时使用。
Q公司内网地址也被代理了怎么办?
把内网域名和网段加入 NO_PROXY,例如 localhost、127.0.0.1 和公司内部域名后缀,多个值用英文逗号分隔。