当我用sudo使用任何命令时,环境变量都不存在。例如,在设置HTTP_PROXY之后,wget命令没有sudo也可以正常工作。但是,如果我输入sudo wget,它说它不能绕过代理设置。


当前回答

你也可以把Ahmed Aswani回答中的两个env_keep语句合并成一个语句,就像这样:

默认值env_keep += "http_proxy "

你也应该考虑只为一个命令指定env_keep,就像这样:

违约!/bin/[your_command] env_keep += "http_proxy https_proxy"

其他回答

添加代码片段到/etc/sudoers.d

不知道这是否在所有发行版中都可用,但在基于debian的发行版中,在/etc/sudoers文件的尾部或附近有一行,其中包括文件夹/etc/sudoers.d在这里,可以添加代码“片段”来修改sudo的配置。具体来说,它们允许控制sudo中使用的所有环境变量。

与/etc/sudoers一样,这些“代码片段”应该使用visudo编辑。你可以从阅读README文件开始,这也是一个方便的地方,可以保存任何你想做的笔记:

$ sudo visudo -f /etc/sudoers.d/README 

# files for your snippets may be created/edited like so:

$ sudo visudo -f /etc/sudoers.d/20_mysnippets

阅读“man 5 sudoers”的“命令环境”部分

也许关于sudo中环境配置的最丰富的文档可以在man5 sudoers的命令环境部分中找到。在这里,我们了解到默认情况下被阻塞的sudoers环境变量可能会使用env_check或env_keep选项被“白名单”;如。

Defaults env_keep += "http_proxy HTTP_PROXY"
Defaults env_keep += "https_proxy HTTPS_PROXY"
Defaults env_keep += "ftp_proxy FTP_PROXY"

因此,在OP的情况下,我们可以“传递”sudoer的环境变量,如下所示:

$ sudo visudo -f /etc/sudoers.d/10_myenvwlist

# opens the default editor for entry of the following lines: 
Defaults env_keep += "http_proxy HTTP_PROXY"
Defaults env_keep += "https_proxy HTTPS_PROXY"
# and any others deemed useful/necessary
# Save the file, close the editor, and you are done!

从“# sudo -V”中找到你的方位

OP大概是通过试错发现了sudo中缺失的环境变量。但是,可以采取主动:从根提示符中可以获得所有环境变量的列表,以及它们的允许或拒绝状态(对于每个主机都是唯一的),如下所示:

# sudo -V
...
Environment variables to check for safety: 
...
Environment variables to remove: 
...
Environment variables to preserve:
...

注意,一旦一个环境变量像上面那样被“列入白名单”,它就会出现在sudo -V的后续清单中“preserve”清单下。

你也可以把Ahmed Aswani回答中的两个env_keep语句合并成一个语句,就像这样:

默认值env_keep += "http_proxy "

你也应该考虑只为一个命令指定env_keep,就像这样:

违约!/bin/[your_command] env_keep += "http_proxy https_proxy"

对于您希望一次性可用的单个变量,您可以将其作为命令的一部分。

sudo http_proxy=$http_proxy wget "http://stackoverflow.com"

如果您需要将环境变量保存在脚本中,您可以将您的命令放在如下的here文档中。特别是当你有很多变量让事情看起来很整洁的时候。

# prepare a script e.g. for running maven
runmaven=/tmp/runmaven$$
# create the script with a here document 
cat << EOF > $runmaven
#!/bin/bash
# run the maven clean with environment variables set
export ANT_HOME=/usr/share/ant
export MAKEFLAGS=-j4
mvn clean install
EOF
# make the script executable
chmod +x $runmaven
# run it
sudo $runmaven
# remove it or comment out to keep
rm $runmaven

诀窍是通过sudo visudo命令将环境变量添加到sudoers文件中,并添加这些行:

Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy"

摘自ArchLinux wiki。

对于Ubuntu 14,你需要在单独的行中指定,因为它会返回多变量行的错误:

Defaults  env_keep += "http_proxy"
Defaults  env_keep += "https_proxy"
Defaults  env_keep += "HTTP_PROXY"
Defaults  env_keep += "HTTPS_PROXY"