关于linux:如何在使用sudo时保留环境变量

How to keep environment variables when using sudo

当我对sudo使用任何命令时,环境变量都不存在。例如,在设置了http-proxy之后,命令wget在没有sudo的情况下工作正常。但是,如果我输入sudo wget,它会说它不能绕过代理设置。


首先,你需要用export HTTP_PROXY。其次,你要仔细阅读man sudo,注意-E旗。这工作:

1
2
$ export HTTP_PROXY=foof
$ sudo -E bash -c 'echo $HTTP_PROXY'

以下是手册中的引述:

1
2
3
4
-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文件中,并添加这些行:

1
Defaults env_keep +="ftp_proxy http_proxy https_proxy no_proxy"

取自archlinux wiki。

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

1
2
3
4
Defaults  env_keep +="http_proxy"
Defaults  env_keep +="https_proxy"
Defaults  env_keep +="HTTP_PROXY"
Defaults  env_keep +="HTTPS_PROXY"


对于要一次性提供的单个变量,可以将其作为命令的一部分。

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


您还可以将艾哈迈德·阿斯瓦尼的答案中的两个env_keep语句组合成一个这样的语句:

Defaults env_keep +="http_proxy https_proxy"

您还应该考虑只为这样的单个命令指定env_keep

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