在生产服务器上,通常会采用 sudo 进行 root 授权,但 sudo 不继承环境变量,导致某些命令无法执行,尤其是涉及到一些要代理的场景。
所以在使用 sudo 执行命令时,可以使用 -E 参数来保留环境变量,例如:
sudo -E some_command
但这种方法是临时使用,要让 sudo 永久继承环境变量,可以修改 sudoers 文件:
sudo visudo
然后添加以下行:
Defaults env_keep += "http_proxy https_proxy no_proxy"
这样就可以继承代理相关的环境变量,确保在使用 sudo 执行命令时,代理设置依然有效。
这种方法仍然要求用户本身已经配置了相应的环境变量,例如:
export http_proxy="http://example.com:8080"
export https_proxy="http://example.com:8080"
export no_proxy="localhost,127.0.0.1"
生产服务器上的代理通常是固定的,如果是多用户的环境,则非常麻烦,可以考虑将代理写入 /etc/sudoenv 文件中:
echo 'export http_proxy="http://example.com:8080"' | sudo tee -a /etc/sudoenv
echo 'export https_proxy="http://example.com:8080"' | sudo tee -a /etc/sudoenv
echo 'export no_proxy="localhost,127.0.0.1"' | sudo tee -a /etc/sudoenv
然后在 sudoers 文件中添加:
Defaults env_keep += "http_proxy https_proxy no_proxy"
Defaults env_reset
Defaults env_file=/etc/sudoenv
这样在执行 sudo 命令时,就会自动加载 /etc/sudoenv 中的环境变量,实现永久继承代理设置。