linux终端代理需分层配置:wget/curl等认http_proxy变量,apt需写入/etc/apt/apt.conf.d/,git/pip/conda各有专属配置,proxychains可强制所有tcp命令走代理,no_proxy必须显式设置且区分大小写。

终端走代理不是设一次就全局生效的,不同命令对代理的支持机制完全不同,硬套环境变量会漏掉一大半工具。
哪些命令只认 http_proxy 环境变量
像 wget、curl、apt(Debian/Ubuntu)、dnf(Fedora)这类工具,默认只读取 http_proxy 和 https_proxy 环境变量。但要注意:
-
apt不会自动继承 shell 环境变量,必须写进/etc/apt/apt.conf.d/xxx文件里,例如Acquire::http::Proxy "http://127.0.0.1:7890"; -
curl会同时检查http_proxy、https_proxy、all_proxy,但不认ftp_proxy—— 即使你设置了它,curl ftp://也不会走代理 -
wget默认只看http_proxy,要让它也走 HTTPS 代理,得额外加https_proxy,且不能带https://前缀(必须是http://proxy:port) - 密码含特殊字符(如
@、/)时,必须 URL 编码,否则http://user:p@ss@proxy:8080会被截断成user:p
pip、conda、git 这类工具不完全依赖环境变量
它们有自己独立的配置体系,环境变量只是 fallback:
-
pip优先读--proxy参数或pip.conf里的global.proxy,http_proxy只在没配时才用 -
conda完全无视http_proxy,必须显式运行conda config --set proxy_servers.http http://127.0.0.1:7890 -
git走的是http.proxy配置项:git config --global http.proxy http://127.0.0.1:7890,环境变量无效 - 所有这些工具都绕不开认证问题:如果代理要账号密码,
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ --proxy http://u:p@127.0.0.1:7890 xxx是最稳妥的临时写法
想让任意命令都走代理?用 proxychains
这是唯一能无条件劫持所有 TCP 连接的方法,适合 pip、npm、go get 等不守规矩的工具:
- 装完后改
/etc/proxychains.conf,末尾加一行socks5 127.0.0.1 7890(Clash 默认混合端口)或http 127.0.0.1 8080(传统 HTTP 代理) - 注意默认是
strict_chain模式,中间任一代理挂掉就失败;改成dynamic_chain更容错 - 别直接
proxychains bash——这会让所有子命令都走代理,包括ls、ps这种本地命令,徒增延迟 - 真实使用时只包具体命令:
proxychains pip install torch,而不是整个 shell
容易被忽略的坑:DNS 和 no_proxy
代理配置好了,但 curl https://localhost:8000 却连不上?大概率是 DNS 或 no_proxy 没设对:
-
no_proxy必须包含逗号分隔的域名/IP,不能带空格,比如export no_proxy="localhost,127.0.0.1,.internal.example.com" -
curl和wget会尊重no_proxy,但proxychains完全无视它——它只管 TCP 层,DNS 查询仍可能被污染 - 如果代理本身不支持 DNS over TCP(比如多数 HTTP 代理),
curl会先本地解析域名,再发请求;一旦本地 DNS 返回了错误 IP,走代理也没用 - 验证方式:用
proxychains nslookup github.com看是否返回境外 IP;如果不是,说明代理没接管 DNS,得换 SOCKS5 或配proxy_dns











