在使用sudo时,经常发生一些和普通用户或root用户直接执行时不一样的现象。 最常见的是,明明配置了全局网络代理http_proxy,但是在sudo时却还是没有代理。 甚至在某些必须要代理的环境下,sudo的命令会直接卡主,比如sudo curl、sudo pip install等。
这是因为sudo会默认清理掉一些环境变量,以确保执行环境的干净,并减少安全风险。 http_proxy等环境变量,就被默认清理掉了。
使用sudo visudo或sudo vim /etc/sudoers,修改sudo的配置文件,添加以下一行:
Defaults env_keep += "http_proxy https_proxy ftp_proxy no_proxy"
这里的环境变量可以填写任意内容,这里是以几个代理为示例。 但是某些特殊的环境变量,即使填写了也不会生效,比如PATH
、USER
等。
正常情况下,保存后直接生效。 但如果修改时不小心,写出了语法错误,就会出现以下情况。
$ sudo vim /etc/sudoers
>>> /etc/sudoers: 语法错误 near line 9 <<<
sudo: /etc/sudoers 中第 9 行附近有解析错误
sudo: 没有找到有效的 sudoers 资源,退出
sudo: 无法初始化策略插件
如果修改/etc/sudoers
文件出现语法错误并保存后,再次执行sudo
会出现以上错误(或其英文版)。 这会陷入一种窘境:一方面需要root
权限来再次修改,另一方面sudo
却无法使用。
解决方案有四种:
su
,登录root
。但是一些系统配置下,root
是无法登录的,或者强密码设完即丢。sudo
类软件。但是,一般是没有安装的,而安装又需要sudo apt install ...
。pkexec visudo
修改。还好一般发行版都留下了pkexec
这道门。还是用最后一种吧,其它三种都更麻烦。