sudo 不保留 PYTHONPATH

sudo 不保留 PYTHONPATH

我修改了 /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)。也就是说,它们仅为该命令设置一个或多个环境变量。]

相关内容