【proxy教程】解决网页能访问git克隆失败、pip安装失败、apt更新失败等等网络问题

@TOC


核心原因

能正常访问网站,是因为浏览器走了代理,但是apt、git、pip、conda等等没有走代理,所以就会出现这种情况。但是,一个个去设置代理又很麻烦,我们有两种解决方法:

1.在代理软件中启用虚拟网卡,让所有流量包括系统流量都走代理; 2.引入环境变量,让这些软件走代理,这也是本文的重点。

需要注意的是,SSH 命令(包括 scp)完全不看环境变量,所以必须修改 SSH 的配置文件 ~/.ssh/config,接下来也会讲到。

  • 工具代理兼容性一览表

~ 在 Linux 中代表 /home/用户名/,而在 Windows 中代表 C:\Users\用户名\

开发工具代理配置及文件位置全览

工具
识别环境变量
推荐做法
配置文件路径 (Linux/Windows)

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:

注意点:

  1. 默认情况下,SSH 协议使用 TCP 端口 22。许多公司、学校或公共 Wi-Fi 网络为了安全和限制非必要的流量,会完全阻止或过滤非标准端口(如 22 端口)的传出连接,所以这里使用443端口。

  2. 如果使用443端口,Hostname后面必须是ssh.github.com,不能是github.com

  3. 如果使用默认的22端口,即,不设置PortHostname后面就是github.com,不是ssh.github.com

  4. 两种协议只能选一种,不能同时启用。

apt代理设置

apt 设计上不直接读取 http_proxy 环境变量,主要出于以下三个考虑:

  1. 安全性(Security/Privilege Isolation)apt 通常以 root 权限运行。为了防止恶意用户通过修改普通用户的环境变量,诱导 root 权限的进程通过不可信的代理服务器下载恶意软件,apt 在设计上被设定为“环境隔离”。

  2. 稳定性(Service Consistency)apt 被视为系统级维护工具。如果它依赖用户的环境变量,那么当不同用户执行更新时,或者在自动化脚本(如 Cron 任务)中运行时,表现会不一致。它更倾向于通过自己的配置文件(/etc/apt/apt.conf)来获取确定的配置。

  3. 权限切换(User Switching): 当你运行 apt 时,它内部实际上会创建几个低权限的子进程(例如 _apt 用户)来处理网络下载(这就是你之前看到那个 N: Download is performed unsandboxed 提示的原因)。普通用户的环境变量很难稳定地传递给这些特定的子进程。

使用 sudo -E apt update 会走代理吗?

结论是:理论上可行,但不稳定。

  • 为什么说“理论上可行”?

sudo -E 的作用是 “保留当前环境中的所有环境变量”。如果你在终端里跑了 setproxy,然后运行 sudo -E apt update,那么 http_proxy 变量确实会被带入 sudo 启动的那个进程空间。

  • 为什么说“经常失败/不推荐”?

  1. apt 内部逻辑过滤:即便变量进去了,apt 的核心程序(二进制代码)在初始化时可能根本就不去读取环境变量。

  2. 子进程丢失:如前所述,apt 会切换到 _apt 用户进行下载。虽然 sudo -E 保留了变量给 apt 主进程,但当 apt 调用 _apt 用户去连接服务器时,这些变量往往会丢失。

  3. 协议头敏感apt 对代理字符串的格式要求非常严苛。如果环境变量里少了一个斜杠或协议头不对,它会直接无视。

  • 最佳实践:如何让 apt 稳如泰山地走代理?

一次性配置(推荐做法)

固定配置

  1. 创建或编辑专用配置文件:

  1. 写入以下内容:

注意:一定要有最后的 /;

可选: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: ~/.condarc

  • Windows: C:\Users\用户名\.condarc

在文件中添加或修改:

测试连接并尝试clone

成功!

最后更新于

这有帮助吗?