使用教程 · 终端代理设置
终端代理设置 2026:命令行、git、npm、pip、docker 走代理
机场V 编辑部 · 更新于
终端代理设置:先说结论
结论:终端和命令行工具默认不读取系统代理,所以即使代理客户端已经打开了系统代理,curl、git、npm、pip 等命令依然可能连不上外网。最通用的解决办法是在终端中设置 http_proxy、https_proxy、all_proxy 三个环境变量,指向代理客户端的本地端口(例如 127.0.0.1:7897,以你客户端设置页显示的端口为准)。macOS 和 Linux 用 export 命令,Windows CMD 用 set 命令,PowerShell 用 $env 变量。需要长期生效可写入 shell 配置文件,部分工具(git、npm、pip、docker)还可以单独配置。另一种一劳永逸的方式是开启代理客户端的 TUN 模式。下面分系统、分工具给出具体命令。
为什么终端不走系统代理
系统代理是操作系统层面的一项设置,图形界面程序(如浏览器)会主动读取并遵守它。但终端中的大多数命令行工具是按照类 Unix 的传统,读取名为 http_proxy、https_proxy、all_proxy、no_proxy 的环境变量来决定是否使用代理,而不是读取系统代理设置。因此,在终端里需要单独告诉程序代理地址。
还有一些工具既不读系统代理,也不完全遵守环境变量,比如 Docker 守护进程、部分语言的包管理器,它们需要在自己的配置文件中设置代理。了解这一层原理,就能理解为什么不同工具的设置方法不一样。
第一步:确认代理客户端的本地端口
设置终端代理前,需要知道代理客户端在本机监听的端口。不同客户端的默认值不同,下表仅供参考,实际以客户端设置界面显示为准:
| 客户端 | 端口类型 | 查看位置 |
|---|---|---|
| Clash Verge Rev | 混合端口(HTTP 与 SOCKS 共用) | 设置页的端口设置 |
| Mihomo Party / FlClash | 混合端口 | 设置或内核设置页 |
| v2rayN | SOCKS 端口与 HTTP 端口分开 | 参数设置中的本地监听端口 |
| Surge(Mac) | HTTP 与 SOCKS5 端口 | 设置中的代理服务器端口 |
下文示例统一使用 127.0.0.1:7897,请替换成你自己的端口。如果使用 v2rayN,http 开头的变量填 HTTP 端口,socks5 开头的填 SOCKS 端口。客户端的基本使用可参考 Clash Verge 教程 或 v2rayN 教程。
macOS 与 Linux 终端设置
临时生效(仅当前终端窗口)
- 打开终端,执行:
export http_proxy=http://127.0.0.1:7897 - 继续执行:
export https_proxy=http://127.0.0.1:7897 - 如需 SOCKS 代理,执行:
export all_proxy=socks5://127.0.0.1:7897 - 测试:
curl -I https://www.google.com,返回状态码即表示成功。
也可以合并成一行:export http_proxy=http://127.0.0.1:7897 https_proxy=http://127.0.0.1:7897 all_proxy=socks5://127.0.0.1:7897。关闭这个终端窗口后设置就会失效。
部分程序只认大写形式的变量名,稳妥起见可以同时设置 HTTP_PROXY 和 HTTPS_PROXY。
取消代理
执行 unset http_proxy https_proxy all_proxy 即可。
长期生效:写入配置文件并做成快捷命令
macOS 默认使用 zsh,配置文件是用户目录下的 .zshrc;多数 Linux 发行版默认 bash,配置文件是 .bashrc。推荐写成两个别名,按需开关,而不是让代理永久生效:
- 用文本编辑器打开配置文件,例如执行
nano ~/.zshrc。 - 在末尾添加一行:
alias proxy='export http_proxy=http://127.0.0.1:7897 https_proxy=http://127.0.0.1:7897 all_proxy=socks5://127.0.0.1:7897' - 再添加一行:
alias unproxy='unset http_proxy https_proxy all_proxy' - 保存后执行
source ~/.zshrc让配置生效。 - 以后在终端输入 proxy 即开启代理,输入 unproxy 即关闭。
之所以不建议永久开启,是因为代理客户端没运行时,所有命令都会因连接不到代理端口而失败,反而让人摸不着头脑。
no_proxy:排除不需要代理的地址
访问本地服务、公司内网或国内镜像源时,可以设置 no_proxy 让它们直连,例如 export no_proxy=localhost,127.0.0.1,192.168.0.0/16,.example.com。不同程序对 no_proxy 中网段写法的支持程度不同,域名后缀写法兼容性最好。
Windows 终端设置
CMD 命令提示符
- 执行:
set http_proxy=http://127.0.0.1:7897 - 执行:
set https_proxy=http://127.0.0.1:7897 - 测试:
curl -I https://www.google.com(Windows 10 及以上自带 curl)。 - 取消:
set http_proxy=与set https_proxy=
注意 set 命令的等号两边不要加空格,否则变量名会包含空格导致无效。
PowerShell
- 执行:
$env:HTTP_PROXY="http://127.0.0.1:7897" - 执行:
$env:HTTPS_PROXY="http://127.0.0.1:7897" - 取消:
Remove-Item Env:HTTP_PROXY与Remove-Item Env:HTTPS_PROXY
需要注意,PowerShell 中的 curl 在旧版本里其实是 Invoke-WebRequest 的别名,测试时可以使用 curl.exe 明确调用真正的 curl。
永久设置(Windows)
在“设置 → 系统 → 关于 → 高级系统设置 → 环境变量”中新建用户变量 HTTP_PROXY 与 HTTPS_PROXY,值填代理地址。与 Mac 一样,永久设置会让所有读取这些变量的程序在代理关闭时报错,所以更推荐按需临时设置,或者直接开启客户端的 TUN 模式。
常用工具单独设置代理
git
git 会读取 http_proxy 环境变量,也可以单独配置,只影响 git:
- 设置:
git config --global http.proxy http://127.0.0.1:7897与git config --global https.proxy http://127.0.0.1:7897 - 取消:
git config --global --unset http.proxy与git config --global --unset https.proxy - 只为 GitHub 设置:
git config --global http.https://github.com.proxy http://127.0.0.1:7897,这样访问国内代码托管平台不受影响。
以上只对 HTTPS 方式克隆有效。如果使用 SSH 方式(git@github.com 开头),需要在 SSH 配置文件中为 github.com 设置 ProxyCommand,macOS 与 Linux 可以借助 nc 命令转发到 SOCKS 端口,Windows 上 Git 自带的 connect 工具可以实现同样的效果。还有一个简单办法:GitHub 支持通过 443 端口的 ssh.github.com 走 SSH,配合 TUN 模式通常最省心。
npm、yarn、pnpm
- npm 设置:
npm config set proxy http://127.0.0.1:7897与npm config set https-proxy http://127.0.0.1:7897 - npm 取消:
npm config delete proxy与npm config delete https-proxy - pnpm 与 yarn 也有类似的 proxy 配置项,并且大多也会读取环境变量。
如果只是下载速度慢,也可以考虑使用国内镜像源而不是代理,两种方式不要同时混用,否则可能出现镜像源走代理反而更慢的情况。
pip
- 临时:
pip install 包名 --proxy http://127.0.0.1:7897 - 长期:在 pip 配置文件(pip.conf 或 pip.ini)的 global 段落中加入 proxy 一行,值为代理地址。
- pip 也会读取 https_proxy 环境变量,设置了环境变量就无需再单独配置。
Docker
Docker 涉及两类代理,经常被混淆:
| 场景 | 谁需要代理 | 设置方式 |
|---|---|---|
| docker pull 拉取镜像 | Docker 守护进程 | Docker Desktop 在设置的 Resources → Proxies 中填写;Linux 在 systemd 的 docker 服务配置中添加 HTTP_PROXY、HTTPS_PROXY 环境变量后重启服务 |
| docker build 构建时下载依赖 | 构建容器 | 通过 build-arg 传入 HTTP_PROXY 等变量 |
| 运行中的容器访问外网 | 容器内进程 | 运行时用 -e 传入环境变量,或在 Docker 客户端配置文件中设置默认代理 |
特别注意:容器内的 127.0.0.1 指向容器自己,不是宿主机。容器里要使用宿主机上的代理,Docker Desktop 可以使用 host.docker.internal 作为地址,Linux 上可使用 docker0 网桥的宿主机 IP,同时代理客户端需要打开“允许局域网连接”。
其他常见工具
- Homebrew:读取 http_proxy 等环境变量,设置后直接执行 brew 命令即可。
- wget:读取环境变量,也可在 .wgetrc 中配置 use_proxy 与代理地址。
- Go:模块下载读取环境变量,也可以设置 GOPROXY 使用模块代理镜像。
- apt:需要在 apt 的配置目录中添加 Acquire::http::Proxy 设置,sudo 执行时默认不继承用户环境变量。
用 TUN 模式一劳永逸
如果你需要代理的命令行工具很多,逐个配置太麻烦,可以直接开启代理客户端的 TUN 模式。TUN 在网络层接管所有流量,命令行程序无需任何设置即可按规则分流。缺点是需要管理员权限,并可能与其他 VPN 冲突。原理与开启方法见 TUN 模式。对于开发者,我们的建议是:日常开 TUN 加规则模式,遇到特殊需求再用环境变量精细控制。
常见问题排查
| 现象 | 原因 | 解决 |
|---|---|---|
| 设置后 curl 提示连接被拒绝 | 端口填错或代理客户端未运行 | 核对客户端端口;确认客户端已启动 |
| 新开的终端代理失效 | export 只对当前窗口有效 | 写入 .zshrc 或 .bashrc 的别名 |
| sudo 执行的命令不走代理 | sudo 默认不继承环境变量 | 使用 sudo -E 保留环境变量,或在工具配置文件中设置 |
| git clone 依然很慢 | 使用了 SSH 协议,未经过 http.proxy | 改用 HTTPS 地址,或为 SSH 配置代理,或开启 TUN |
| docker pull 超时 | 只设置了终端变量,守护进程未设置 | 在 Docker Desktop 或 systemd 中为守护进程配置代理 |
| 内网地址也走了代理 | 没有设置 no_proxy | 为内网域名和网段设置 no_proxy |
| 代理通了但速度慢或超时 | 节点质量问题 | 换节点测试,参考 节点超时怎么办 |
小结
终端代理设置的关键在于理解“命令行读环境变量,不读系统代理”。临时使用就 export 或 set 三个变量;长期使用就写成 proxy 与 unproxy 两个快捷命令;git、npm、pip、docker 等工具按需单独配置;需要全面接管时开启 TUN。只要端口填对、客户端在运行,命令行走代理并不复杂。开发者对线路稳定性要求较高,挑选机场时可参考 稳定机场推荐 与 电脑机场推荐,在 Mac 上操作可结合 Clash Verge Mac 教程 一起阅读。