排查终端 shell 莫名被设置了 HTTP 代理
1. 现象
命令行下使用 wget、curl 等命令时始终会提示连接到 127.0.0.1 的 8888 端口失败:
$ curl www.google.com curl: (7) Failed to connect to 127.0.0.1 port 8888: 拒绝连接
2. 排查
看到这种情况直接就想到被设置了网络代理,用 env 列出当前 shell 所有环境变量并搜索:
$ env | fgrep 8888 HTTP_PROXY=http://127.0.0.1:8888/ http_proxy=http://127.0.0.1:8888/ HTTPS_PROXY=http://127.0.0.1:8888/ https_proxy=http://127.0.0.1:8888/
可以看到被设置了 HTTP 代理,然后我从 zsh 切换到 bash,仍旧有这四个环境变量,但最近我没有修改过 shell 相关的配置文件,怀疑是某个软件强制追加了配置文件。
于是给 zsh 和 bash 分别带上 -v 参数,启动时打印所有的环境变量设置:
$ /usr/bin/zsh -v ...... $ /usr/bin/bash -v ......
一番检查后,这四个环境变量的赋值语句并没有出现,我严重怀疑是 zsh、bash 的父进程设置的环境变量(子进程可以继承父进程的环境变量),为了证实,我在 GUI 版的 Emacs 中启动了 zsh,然而发现 env 中并没有被设置代理,因此可以确定问题出在父进程那里。
而 shell 是通过 gnome-terminal 启动的,因此跟踪 gnome-terminal 的系统调用:
$ strace -o /tmp/gnome-terminal.out -f gnome-terminal
排查问题时,通常要带上 -f,这样才能跟踪子进程的系统调用。
现在来检查捕获到的系统调用,优先看进程启动过程中读取的文件,因为多半是通过配置文件设置的:
$ awk '$2~/open/ && $0 !~ /没有那个文件或目录/ && $0 ~/\/home/' gnome-terminal.out 58339 openat(AT_FDCWD, "/home/lu4nx/.local/share/flatpak/exports/share/glib-2.0/schemas/gschemas.compiled", O_RDONLY <unfinished ...> 58339 openat(AT_FDCWD, "/home/lu4nx/.config/dconf/user", O_RDONLY) = 6 58339 openat(AT_FDCWD, "/home/lu4nx/.icons/Adwaita/cursors/", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY <unfinished ...> 58339 openat(AT_FDCWD, "/home/lu4nx/.config/gtk-3.0/settings.ini", O_RDONLY) = 14
上面的 awk 语句做了三个过滤条件:
- 过滤 open 开头的系统调用;
- 不包含找不到的文件;
- 只匹配 home 目录下的。
接下来我就对这四个文件逐个排查,除了 /home/lu4nx/.config/dconf/user
是个二进制文件外,其他三个文件中并没有发现设置了代理,dconf/user 这个文件可以用保存了当前 GNOME 的设置,用 dconf 命令可以用纯文本形式打印当前的设置:
$ dconf dump / | less ...... [system/proxy] mode='manual' [system/proxy/ftp] host='' port=0 [system/proxy/http] host='127.0.0.1' port=8888 [system/proxy/https] host='127.0.0.1' port=8888
上面的输出中,已经看到代理设置 mode='manual' 表示在 GNOME 控制面板中设置了网络代理,所以去控制面板中把网络代理禁用就行了。