当我用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"
推荐文章
- 在Bash中检查变量是否存在于列表中
- 查看PS命令的全部输出
- Linux命令将域名转换为IP
- Mac OS X中的环境变量
- 如何从命令行在windows中找到mysql数据目录
- 如何在Makefile中设置子进程的环境变量
- 有效地测试Linux上的端口是否打开?
- 如何从另一个文件A中删除文件B中出现的行?
- 对以制表符分隔的文件进行排序
- 使用sudo时未找到命令
- 当有命令行参数时,如何使用GDB分析程序的核心转储文件?
- 如何强制从另一个SSH会话分离屏幕?
- 如何将文件指针(file * fp)转换为文件描述符(int fd)?
- Linux Bash中双&和分号有什么区别?
- 如何在POM.xml中引用环境变量?