使用教程 · 终端代理设置

终端代理设置 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混合端口设置或内核设置页
v2rayNSOCKS 端口与 HTTP 端口分开参数设置中的本地监听端口
Surge(Mac)HTTP 与 SOCKS5 端口设置中的代理服务器端口

下文示例统一使用 127.0.0.1:7897,请替换成你自己的端口。如果使用 v2rayN,http 开头的变量填 HTTP 端口,socks5 开头的填 SOCKS 端口。客户端的基本使用可参考 Clash Verge 教程 或 v2rayN 教程。

macOS 与 Linux 终端设置

临时生效(仅当前终端窗口)

  1. 打开终端,执行:export http_proxy=http://127.0.0.1:7897
  2. 继续执行:export https_proxy=http://127.0.0.1:7897
  3. 如需 SOCKS 代理,执行:export all_proxy=socks5://127.0.0.1:7897
  4. 测试: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。推荐写成两个别名,按需开关,而不是让代理永久生效:

  1. 用文本编辑器打开配置文件,例如执行 nano ~/.zshrc。
  2. 在末尾添加一行: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'
  3. 再添加一行:alias unproxy='unset http_proxy https_proxy all_proxy'
  4. 保存后执行 source ~/.zshrc 让配置生效。
  5. 以后在终端输入 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 命令提示符

  1. 执行:set http_proxy=http://127.0.0.1:7897
  2. 执行:set https_proxy=http://127.0.0.1:7897
  3. 测试:curl -I https://www.google.com(Windows 10 及以上自带 curl)。
  4. 取消:set http_proxy= 与 set https_proxy=

注意 set 命令的等号两边不要加空格,否则变量名会包含空格导致无效。

PowerShell

  1. 执行:$env:HTTP_PROXY="http://127.0.0.1:7897"
  2. 执行:$env:HTTPS_PROXY="http://127.0.0.1:7897"
  3. 取消: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:

以上只对 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

如果只是下载速度慢,也可以考虑使用国内镜像源而不是代理,两种方式不要同时混用,否则可能出现镜像源走代理反而更慢的情况。

pip

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,同时代理客户端需要打开“允许局域网连接”。

其他常见工具

用 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 教程 一起阅读。

常见问题

为什么开了系统代理终端还是连不上?

因为大多数命令行工具读取的是 http_proxy 等环境变量,而不是系统代理设置。在终端中设置环境变量,或开启 TUN 模式 即可。

http_proxy 和 all_proxy 有什么区别?

http_proxy、https_proxy 指定 HTTP 和 HTTPS 请求使用的代理;all_proxy 是通用兜底设置,常配合 socks5 地址使用。不同程序支持的变量不同,三者都设置兼容性最好。

git 设置代理后 SSH 克隆还是很慢?

git 的 http.proxy 只对 HTTPS 地址生效。SSH 方式需要在 SSH 配置中设置 ProxyCommand,或者直接开启客户端的 TUN 模式。

Docker 容器里怎么使用宿主机的代理?

容器内的 127.0.0.1 是容器本身。Docker Desktop 可用 host.docker.internal 指向宿主机,Linux 可使用网桥 IP,同时代理客户端要允许局域网连接。

相关文章

引用本页:《终端代理设置 2026:命令行、git、npm、pip、docker 走代理》,机场V,https://jichangv.world/guide/terminal-proxy-tutorial/,更新于 2026-10-26。