【proxy教程】解决网页能访问git克隆失败、pip安装失败、apt更新失败等等网络问题
@TOC
核心原因
能正常访问网站,是因为浏览器走了代理,但是apt、git、pip、conda等等没有走代理,所以就会出现这种情况。但是,一个个去设置代理又很麻烦,我们有两种解决方法:
1.在代理软件中启用虚拟网卡,让所有流量包括系统流量都走代理; 2.引入环境变量,让这些软件走代理,这也是本文的重点。
需要注意的是,SSH 命令(包括 scp)完全不看环境变量,所以必须修改 SSH 的配置文件 ~/.ssh/config,接下来也会讲到。
工具代理兼容性一览表
~ 在 Linux 中代表 /home/用户名/,而在 Windows 中代表 C:\Users\用户名\。
开发工具代理配置及文件位置全览
ssh
❌ 否
必须在配置中设置 ProxyCommand
~/.ssh/config
git (SSH)
❌ 否
走 SSH 协议,与环境变量无关
~/.ssh/config
git (HTTPS)
✅ 是
设置环境变量即可;永久设置需改文件
~/.gitconfig
apt
❌ 否
apt -o一次性添加;或sudo -E继承;永久设置需改文件
/etc/apt/apt.conf.d/99proxy
pip
✅ 是
设置环境变量即可;sudo 时需加 -E
~/.pip/pip.conf / ~/AppData/Roaming/pip/pip.ini
conda
⚠️ 不稳定
若失败,则在文件中显式设置 proxy_servers
~/.condarc
curl
✅ 是
非常可靠,设置了环境变量通常不需改文件
~/.curlrc
查看你的代理的地址和端口
自行查看你所使用的代理软件的地址和端口号,以下图片仅为示例。

设置环境变量
linux
把以下内容添加到~/.bashrc文件中,后文所有类似的ip地址和端口,都需要根据实际情况修改代理地址和端口号。
这样的话,你可以在某个shell窗口中输入setproxy来启动代理,输入unsetproxy来关闭代理,并且这个设置只对当前shell窗口有效,在这个shell窗口中进行的几乎所有活动都会走代理(除了 SSH 和 sudo 执行命令),非常方便。
为什么说 sudo 执行命令不走代理呢?假如你执行了指令setproxy,你只是为当前shell的当前用户设置了环境变量,而你在同一个shell窗口中 sudo 执行命令,会忽略用户层级的环境变量。
如果你想让 sudo 也走代理,有以下两种办法:
1.用sudo再设置一遍:
2.在同一个窗口内使用sudo -E参数,例如:
windows
PowerShell 的配置文件叫 $PROFILE,类似于 Linux 的 .bashrc。
打开配置文件:
把以下内容添加到配置文件中。
然后,同样可以使用setproxy命令来启动代理,使用unsetproxy命令来关闭代理。
windows中,管理员权限的PowerShell窗口和普通权限的PowerShell窗口是不同的,环境变量也是不一样的,所以如果你想让管理员权限的PowerShell窗口也走代理,需要在管理员权限的PowerShell窗口中也执行一次setproxy命令。
ssh设置
linux:
windows:
注意点:
默认情况下,SSH 协议使用 TCP 端口 22。许多公司、学校或公共 Wi-Fi 网络为了安全和限制非必要的流量,会完全阻止或过滤非标准端口(如 22 端口)的传出连接,所以这里使用
443端口。如果使用
443端口,Hostname后面必须是ssh.github.com,不能是github.com。如果使用默认的
22端口,即,不设置Port,Hostname后面就是github.com,不是ssh.github.com。两种协议只能选一种,不能同时启用。
apt代理设置
apt 设计上不直接读取 http_proxy 环境变量,主要出于以下三个考虑:
安全性(Security/Privilege Isolation):
apt通常以root权限运行。为了防止恶意用户通过修改普通用户的环境变量,诱导root权限的进程通过不可信的代理服务器下载恶意软件,apt在设计上被设定为“环境隔离”。稳定性(Service Consistency):
apt被视为系统级维护工具。如果它依赖用户的环境变量,那么当不同用户执行更新时,或者在自动化脚本(如 Cron 任务)中运行时,表现会不一致。它更倾向于通过自己的配置文件(/etc/apt/apt.conf)来获取确定的配置。权限切换(User Switching): 当你运行
apt时,它内部实际上会创建几个低权限的子进程(例如_apt用户)来处理网络下载(这就是你之前看到那个N: Download is performed unsandboxed提示的原因)。普通用户的环境变量很难稳定地传递给这些特定的子进程。
使用 sudo -E apt update 会走代理吗?
sudo -E apt update 会走代理吗?结论是:理论上可行,但不稳定。
为什么说“理论上可行”?
sudo -E 的作用是 “保留当前环境中的所有环境变量”。如果你在终端里跑了 setproxy,然后运行 sudo -E apt update,那么 http_proxy 变量确实会被带入 sudo 启动的那个进程空间。
为什么说“经常失败/不推荐”?
被
apt内部逻辑过滤:即便变量进去了,apt的核心程序(二进制代码)在初始化时可能根本就不去读取环境变量。子进程丢失:如前所述,
apt会切换到_apt用户进行下载。虽然sudo -E保留了变量给apt主进程,但当apt调用_apt用户去连接服务器时,这些变量往往会丢失。协议头敏感:
apt对代理字符串的格式要求非常严苛。如果环境变量里少了一个斜杠或协议头不对,它会直接无视。
最佳实践:如何让
apt稳如泰山地走代理?
一次性配置(推荐做法)
固定配置
创建或编辑专用配置文件:
写入以下内容:
注意:一定要有最后的 / 和 ;。
可选:git代理设置
一次性设置(仅对当前命令有效)
格式:git -c http.proxy="代理地址" clone 仓库地址
永久设置
linux下,打开~/.gitconfig文件;windows下,打开C:\Users\你的用户名\.gitconfig文件。
针对github.com的socket代理:
针对github.com的ttp代理:
若需要针对所有域名设置代理:
可选:conda代理设置
针对 Conda 的代理设置,虽然它理论上会读取系统环境变量,但由于 Conda 经常需要处理复杂的 SSL 证书和多个通道(Channels),手动显式配置通常是最稳妥的做法。
创建或编辑配置文件:
Linux/macOS:
~/.condarcWindows:
C:\Users\用户名\.condarc
在文件中添加或修改:
测试连接并尝试clone
成功!
最后更新于
这有帮助吗?