当我用sudo使用任何命令时,环境变量都不存在。例如,在设置HTTP_PROXY之后,wget命令没有sudo也可以正常工作。但是,如果我输入sudo wget,它说它不能绕过代理设置。
当前回答
诀窍是通过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"
其他回答
首先,您需要导出HTTP_PROXY。其次,您需要阅读man sudo,并查看-E标志。如此:
$ export HTTP_PROXY=foof
$ sudo -E bash -c 'echo $HTTP_PROXY'
下面是手册页中的引文:
-E, --preserve-env
Indicates to the security policy that the user wishes to preserve their
existing environment variables. The security policy may return an error
if the user does not have permission to preserve the environment.
诀窍是通过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"
如果您需要将环境变量保存在脚本中,您可以将您的命令放在如下的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 http_proxy=$http_proxy wget "http://stackoverflow.com"
你也可以把Ahmed Aswani回答中的两个env_keep语句合并成一个语句,就像这样:
默认值env_keep += "http_proxy "
你也应该考虑只为一个命令指定env_keep,就像这样:
违约!/bin/[your_command] env_keep += "http_proxy https_proxy"
推荐文章
- 在tmux中保持窗口名称固定
- 如何生成一个核心转储在Linux上的分段错误?
- 在Python中如何在Linux和Windows中使用“/”(目录分隔符)?
- 命令行从操作系统级配置中删除环境变量
- 如何在Apache服务器上自动将HTTP重定向到HTTPS ?
- 如何限制从grep返回的结果的数量?
- 将值从管道读入shell变量
- 以相对于当前目录的路径递归地在Linux CLI中列出文件
- 如何使用xargs复制名称中有空格和引号的文件?
- 在makefile中抑制命令调用的回声?
- 在套接字编程中AF_INET和PF_INET的区别是什么?
- Chmod递归
- 任何方式退出bash脚本,但不退出终端
- 如何查看按实际内存使用情况排序的顶级进程?
- 如何将多行输出连接到一行?