排查终端 shell 莫名被设置了 HTTP 代理

Table of Contents

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 语句做了三个过滤条件:

  1. 过滤 open 开头的系统调用;
  2. 不包含找不到的文件;
  3. 只匹配 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 控制面板中设置了网络代理,所以去控制面板中把网络代理禁用就行了。