在之前的一篇文章中,介绍了如何在无用户界面 GUI 的 Ubuntu 服务器上实现走代理。然而本文解决的是这样一个问题:当我们在本地开启了代理(例如 xclash、Shadowsocket 等),在浏览器上可以走代理,但是命令行无法访问,特别是当我们使用 git 等操作时。

原因

代理软件设置的是系统代理,MacOS, Linux, Windows 等操作系统的终端不走系统设置的代理,终端代理和系统代理不是一回事。

解决方法

下面介绍 MacOS, Linux 这类 Unix 系列操作系统的解决办法,也是我日常使用的方法。Windows 用户可以自行上网找,道理是一样的。

1
2
3
export https_proxy=http://127.0.0.1:7890
export http_proxy=http://127.0.0.1:7890
export all_proxy=socks5://127.0.0.1:7890

在已经开启代理软件,并且浏览器可以正常走代理的情况下。我们可以在命令行输入上面的命令,临时设置终端的代理,注意打开新的终端需要再次输入。因为我使用的是 xclash,所以端口是7890,其他的代理软件端口可能不一样。

上面命令的作用是分别设置了终端中 HTTP、HTTPS 和其他协议(如 SOCKS5)的网络代理:export https_proxy=http://127.0.0.1:7890 指定 HTTPS 请求通过本地代理服务器 127.0.0.1:7890export http_proxy=http://127.0.0.1:7890 指定 HTTP 请求通过同一个代理服务器,export all_proxy=socks5://127.0.0.1:7890 则为其他类型的网络请求(如 SOCKS5 协议)指定了相同的代理服务器。这些设置确保终端中的所有网络流量都通过指定的代理进行。

如果觉得每次输入一大串麻烦,可以在 shell 的配置文件中,设置相关的函数,以 MacOS 为例。

1
2
# 创建 shell 配置文件
sudo touch ~/.bash_profile

然后输入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 开启代理
proxy_on() {
export https_proxy=http://127.0.0.1:7890
export http_proxy=http://127.0.0.1:7890
export all_proxy=socks5://127.0.0.1:7890
echo "HTTP/HTTPS Proxy on"
}

# 关闭代理
proxy_off() {
unset http_proxy
unset https_proxy
unset all_proxy
echo "HTTP/HTTPS Proxy off"
}
1
2
# 刷新配置文件,使其生效
source ~/.bash_profile

这样每次我们在终端可以通过 proxy_onproxy_of 命令,方便的关闭、开启代理了。注意开启代理要保证打开了代理软件。

1
2
# 测试能否成功访问代理
curl www.google.com