我修改了 /etc/sudoers(使用 visudo)以保留环境变量:
Defaults !env_reset
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
#includedir /etc/sudoers.d
www ALL = NOPASSWD: /usr/bin/env
这几乎很有效:除了 PYTHONPATH 之外,所有环境变量都保存了下来!
www@myhost:~$ env | grep PYTHON
PYTHONPATH=/home/www/python_commons:/home/www/python_commons/django_commons/apps:/home/www
www@myhost:~$ sudo env | grep PYTHON
www@myhost:~$
我尝试在 sudoers 中添加:
Defaults env_keep += "PYTHONPATH"
但这没有帮助。
我正在使用 Ubuntu 11.10:如何保留 PYTHONPATH?
答案1
您已经非常接近了:不要引用 PYTHONPATH,如下所示。
Defaults env_keep += PYTHONPATH
您不需要修改 env_reset。
您可能还想考虑根本不要更改 sudoers。相反,请考虑像这样调用 sudo:
sudo PYTHONPATH=$PYTHONPATH <command...>
这也适用于 PATH 和其他变量。当通过 shell 扩展时,您会得到文字路径,就像您输入了
sudo PYTHONPATH=/home/www/python_commons:... <command>
但只有当您明确请求传递它时才可以(而不是使用 env_keep 隐式传递)。
这是可行的,因为 sudo 允许您传递现有的环境变量(这需要 env_keep),或者指定仅为 sudo 命令设置的环境变量(这不需要 env_keep)。考虑一下:
snafu$ sudo grep Def /etc/sudoers
Defaults env_reset
Defaults env_keep += SE_ok
Defaults env_keep += SE_ik
snafu$ SE_o=outer SE_ok=outer_keep sudo SE_i=inner SE_ik=inner_keep env | grep ^SE
SE_ok=outer_keep
SE_ik=inner_keep
SE_i=inner
此示例演示了如何在 sudo 的调用环境(外部)和 sudo 本身(内部)中设置变量。请注意,即使没有 env_keep 条目,也会打印 SE_i。(SE_ik 的 env_keep 是不必要的。)还请注意,env_keep 适用于外部变量(不打印 SE_o)。
[形式为“var=val command”的命令调用等同于 (export var=val; command)。也就是说,它们仅为该命令设置一个或多个环境变量。]