Linux进阶学习 -修复sudo中http_proxy等环境变量的缺失
在使用sudo
时,经常发生一些和普通用户或root
用户直接执行时不一样的现象。 最常见的是,明明配置了全局网络代理http_proxy
,但是在sudo
时却还是没有代理。 甚至在某些必须要代理的环境下,sudo
的命令会直接卡主,比如sudo curl
、sudo pip install
等。
这是因为sudo
会默认清理掉一些环境变量,以确保执行环境的干净,并减少安全风险。 http_proxy
等环境变量,就被默认清理掉了。
修复http_proxy
等环境变量
使用sudo visudo
或sudo vim /etc/sudoers
,修改sudo
的配置文件,添加以下一行:
Defaults env_keep += "http_proxy https_proxy ftp_proxy no_proxy"
这里的环境变量可以填写任意内容,这里是以几个代理为示例。 但是某些特殊的环境变量,即使填写了也不会生效,比如PATH
、USER
等。
正常情况下,保存后直接生效。 但如果修改时不小心,写出了语法错误,就会出现以下情况。
修复/etc/sudoers
中的语法错误
$ 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 ...
。 - 重装系统,或者在恢复模式、U盘系统等情况下做文件操作……
- 通过
pkexec visudo
修改。还好一般发行版都留下了pkexec
这道门。
还是用最后一种吧,其它三种都更麻烦。