Linux修改系统代理

linux系统代理可以通过shell修改,其效果作用于当前shell或者所有shell,对于像chrome,firefox等桌面浏览器,是不能直接走代理的,除非安装一些proxy插件。不过有时我们想在自己写的程序内设置系统代理,那么这时仅修改shell(http_proxy)之类的是毫无作用的,必须依赖于当前的桌面环境(gnome,kde?)提供的接口,就像windows修改注册表来修改系统代理。

当前shell

这种方式仅仅对当前shell以及产生的子shell有用,普遍的方法是export导出*_proxy变量:
export http_proxy=http://USERNAME:PASSWORD@SERVER:PORT/

1
2
export http_proxy=http://127.0.0.1:8888
export https_proxy=http://127.0.0.1:8888

若希望仅仅对当前shell其作用,那么可以这样做:

1
http_proxy=http://127.0.0.1:8888 curl www.google.com --head

不过这种通过修改http_proxy等环境变量来设置代理的方法似乎不支持socks。

所有shell

这种情况可以修改/etc/profile/etc/environment$HOME/.bashrc$HOME/.zshrc配置文件,一般来说,只需要修改.bashrc.zshrc就可以使所有的shell走代理(除非特殊情况)。

1
2
3
4
5
6
7
# set
export {http,https}_proxy="http://127.0.0.1:8888"
# unset
unset {http,https}_proxy
# test
curl -v checkip.dyndns.org
curl --head -v www.google.com

若希望立即见效,则 source $HOME/.zshrcsource $HOME/.bashrc

GNOME

以上方法对于大部分命令(curl,wget,git等)来说在shell基本上可以走代理。不过我开头说了,我们希望在自己写的程序内设置系统代理,就像v2rayNG修改Windows注册表。

而且这样做的另一个好处是支持socks代理。

确定linux的桌面环境可以通过 env |grep DESKTOP 查看全局环境变量,或者直接 echo $XDG_SESSION_DESKTOP,比如我这里的虚拟机linux gnome3输出gnome-classic

gnome通过gsettings来管理GNOME3的配置,这样就可以修改系统代理。
一个简单的例子来获取当前gnome的系统代理信息

1
2
3
4
5
gsettings get org.gnome.system.proxy mode
gsettings get org.gnome.system.proxy.http host
gsettings get org.gnome.system.proxy.http port
gsettings get org.gnome.system.proxy.socks host
gsettings get org.gnome.system.proxy.socks port

mode有三种情况:

  • none 无代理
  • manual 手动代理: 修改http,https,socks等
  • auto 代理自动配置: PAC

一个简单的例子:

1
2
3
4
5
gsettings set org.gnome.system.proxy mode "manual"
gsettings set org.gnome.system.proxy.http host "127.0.0.1"
gsettings set org.gnome.system.proxy.http port 8888
gsettings set org.gnome.system.proxy.socks host "127.0.0.1"
gsettings set org.gnome.system.proxy.socks port 1088

取消系统代理:

1
gsettings set org.gnome.system.proxy mode "none"

身份验证方式:

1
2
3
gsettings set org.gnome.system.proxy.http use-authentication true
gsettings set org.gnome.system.proxy.http authentication-user "xxx"
gsettings set org.gnome.system.proxy.http authentication-password "xxx"

除此之外,还可以设置不经过代理的主机。
不过我这里v2ray配置了路由功能,这样的话即使是manual在访问国内网站时依然不走代理。

1
gsettings get org.gnome.system.proxy ignore-hosts 

默认输出 ['localhost', '127.0.0.0/8', '::1']

PAC

代理自动配置(Proxy auto-config,简称PAC)是一种网页浏览器技术,用于定义浏览器该如何自动选择适当的代理服务器来访问一个网址。

也就是国内不走代理,国外走代理,一般来说可以加快网站访问速度。
关于PAC网上有很多文章介绍,此处不再赘述。

gsettings设置如下:

1
2
gsettings get org.gnome.system.proxy autoconfig-url 
'http://127.0.0.1:xxxx/pac'

KDE

对于KDE来说,通过 kwriteconfig5 来修改系统代理,指定的配置文件一般位于 $HOME/.config/kioslaverc,内容大致如下,有点类似于windows的ini配置文件:

1
2
3
4
5
6
7
8
9
10
11
AutoResume=true
ProxyUrlDisplayFlags=0

[Proxy Settings]
Proxy Config Script=
ProxyType=0
ReversedException=false
ftpProxy=http://localhost 8888
httpProxy=http://localhost 8888
httpsProxy=http://localhost 8888
socksProxy=socks://localhost 1088

kwriteconfig5的help信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
kwriteconfig5
Usage: kwriteconfig5 [options] value

Options:
-h, --help Displays help on commandline options.
--help-all Displays help including Qt specific options.
--file <file> Use <file> instead of global config
--group <group> Group to look in. Use repeatedly for nested groups.
--key <key> Key to look for
--type <type> Type of variable. Use "bool" for a boolean, otherwise it is
treated as a string
--delete Delete the designated key if enabled

Arguments:
value The value to write. Mandatory, on a shell use '' for empty

于是KDE下修改系统代理变得十分简单:

1
2
3
4
kwriteconfig5 --file kioslaverc --group "Proxy Settings" --key "ProxyType" 1
kwriteconfig5 --file kioslaverc --group "Proxy Settings" --key "httpProxy" "http://127.0.0.1 8888"
kwriteconfig5 --file kioslaverc --group "Proxy Settings" --key "httpsProxy" "http://127.0.0.1 8888"
kwriteconfig5 --file kioslaverc --group "Proxy Settings" --key "socksProxy" "socks://127.0.0.1 1088"

ProxyType 可以是以下几种情况:

  • 0 无代理
  • 1 手动配置
  • 2 代理自动配置: PAC

PAC模式:

1
2
kwriteconfig5 --file kioslaverc --group "Proxy Settings" --key "ProxyType" 2
kwriteconfig5 --file kioslaverc --group "Proxy Settings" --key "Proxy Config Script" ""

取消系统代理:

1
kwriteconfig5 --file kioslaverc --group "Proxy Settings" --key "ProxyType" 0

至此,通过gsettings或kwriteconfig5来修改系统代理也就小菜一碟了,其余xfce等其他桌面环境我还没有测试,所以就不知道啦。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!