基础概念 · 终端代理环境变量

终端代理怎么设置:环境变量与 NO_PROXY

浏览器已经走代理,终端里的下载命令却仍然失败,常见原因是命令行程序没有读取系统代理。先在当前终端设置环境变量并验证,确认有效后再决定是否长期保存。

全部概念工具使用教程引用资料

环境变量由程序读取,不会自动接管整个终端

环境变量把代理地址传给支持它的程序,不会把所有网络请求强制转进客户端。不同工具支持的名称和优先级可能不同;这里先以 curl 为例,其他程序还要看自己的代理设置。

环境变量由程序读取,不会自动接管整个终端
curl 使用的变量用途填写示例
http_proxyHTTP 目标的代理入口http://127.0.0.1:2080
https_proxyHTTPS 目标的代理入口http://127.0.0.1:2080
ALL_PROXY没有协议专用变量时的候选入口socks5h://127.0.0.1:2080
no_proxy / NO_PROXY哪些目标不使用显式代理localhost,127.0.0.1,::1

curl 的协议专用变量优先于 ALL_PROXY;它只接受小写的 http_proxy,这是与 CGI 环境有关的安全设计,不能把大写 HTTP_PROXY 当成通用替代。其他工具是否相同,需要单独核对。

支持代理变量的程序启动后取得环境,再按自己的规则读取协议变量与 ALL_PROXY,并检查 NO_PROXY 是否排除目标。
这是支持环境变量的程序选择显式入口的过程,变量不会自动接管其他应用。

Bash 和 zsh:先只改当前会话

示例代码
export http_proxy="http://127.0.0.1:2080"
export https_proxy="http://127.0.0.1:2080"
export no_proxy="localhost,127.0.0.1,::1"
curl --verbose --head --connect-timeout 5 --max-time 20 https://example.com

把 2080 换成客户端实际的 HTTP 或混合端口。export 影响当前 shell 及之后由它启动的子进程,不会改动已经运行的程序,也不会自动写入启动文件。

看详细输出是否先连接本机入口,并对照客户端日志。如果已有 ALL_PROXY 或其他协议变量,先记录原值,避免把旧设置误当成这次操作的结果。测试结束后可移除本次新增的变量:

示例代码
unset http_proxy https_proxy no_proxy

原来已有这些变量时,恢复原值更合适。确认工作流需要长期代理后,再编辑自己实际使用的 shell 启动文件;不要同时在多个文件里重复设置。

PowerShell:设置当前进程的环境变量

示例代码
$env:http_proxy = "http://127.0.0.1:2080"
$env:https_proxy = "http://127.0.0.1:2080"
$env:no_proxy = "localhost,127.0.0.1,::1"
curl.exe --verbose --head --connect-timeout 5 --max-time 20 https://example.com

这里使用 curl.exe 调用 curl 本身。$env: 修改当前 PowerShell 进程的环境,并传给之后启动的子进程;它不是给所有已打开的程序统一设置代理。

示例代码
Remove-Item Env:http_proxy, Env:https_proxy, Env:no_proxy -ErrorAction SilentlyContinue

移除变量只适用于本次临时新增的值。若原来就有设置,应恢复之前记录的内容。关闭当前窗口也会结束这一会话中的临时修改。

NO_PROXY 排除的是目标,不是代理服务器

访问本机服务、内网接口或开发环境时,通常希望请求绕过显式代理。NO_PROXY 按目标主机匹配,不是把代理服务器地址写进去就能排除所有流量。

NO_PROXY 排除的是目标,不是代理服务器
curl 中的写法含义或限制
localhost,127.0.0.1,::1排除这些本机目标
.example.com按 curl 的域名匹配规则排除该域及其子域
*全部目标都不使用显式代理
192.168.0.0/16curl 7.86.0 起支持 CIDR;其他工具未必支持

排除变量的大小写、域名后缀和 CIDR 支持并非所有软件一致。开发工具仍然走错路径时,用一个明确的目标测试,核对该工具的文档,不要只看变量名字是否存在。

为什么新终端能用,编辑器或容器不行

  • 编辑器从桌面启动时,通常不会继承另一个终端后加的变量。检查编辑器自身及其集成终端的环境。
  • 后台服务启动时就取得了环境;修改当前终端,不会更新已经运行的服务进程。
  • 容器里的 127.0.0.1 指向容器自身。要连接宿主机代理,应使用该容器环境支持的宿主机地址,并检查监听范围。
  • 提权工具可能过滤环境变量。不要为图方便盲目保留所有变量;按需要给具体程序设置代理。

如果程序不支持环境变量,检查它的代理参数或配置文件。需要接管更多应用时可研究 TUN 的路由范围,但也要验证例外、DNS 和实际出站。

用一条请求验证,再决定是否保存

选一个不在 NO_PROXY 中的目标,用 curl 的详细输出确认本机入口,然后在客户端查到对应连接、命中规则和最终出站。这三处能对上,再把设置用于实际下载工具。

关闭代理客户端后,保留的环境变量仍会指向原端口。下次出现“浏览器正常、终端连接被拒绝”,先看变量是否还在;移除它们只改变支持变量的程序,不会关闭 TUN 或系统代理。

常见问题

https_proxy 的值必须以 https:// 开头吗?

不需要。变量对应 HTTPS 目标;它的值描述代理入口。普通 HTTP 入口可以通过 CONNECT 转发 HTTPS,因此常见值仍是 http://127.0.0.1:端口。

只设置 ALL_PROXY 就够了吗?

对支持该变量的程序可能够用,但协议专用变量通常会优先,其他工具也可能不读取 ALL_PROXY。先查具体程序支持哪些设置,再验证请求。

参考资料

原理和协议定义可查以下标准与官方文档。文中的流程图由 AFQKit 绘制。

curl 代理测试 →curl 代理测试:从本机端口到网站响应系统代理与TUN →系统代理与 TUN 的区别:选择、验证与恢复局域网代理共享 →手机怎么用电脑代理:局域网共享与排查

返回基础概念 · 按症状排查问题