我修改了 /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
Run Code Online (Sandbox Code Playgroud)
这几乎工作得很好:保留所有环境变量,除了 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:~$
Run Code Online (Sandbox Code Playgroud)
我试图在 sudoers 中添加:
Defaults env_keep += "PYTHONPATH"
Run Code Online (Sandbox Code Playgroud)
但它没有帮助。
我正在使用 Ubuntu 11.10:如何保留 PYTHONPATH?
你非常接近:不要引用 PYTHONPATH,如下所示。
Defaults env_keep += PYTHONPATH
Run Code Online (Sandbox Code Playgroud)
您不需要修改 env_reset。
您可能还想考虑根本不更改 sudoers。相反,请考虑像这样调用 sudo:
sudo PYTHONPATH=$PYTHONPATH <command...>
Run Code Online (Sandbox Code Playgroud)
这也适用于 PATH 和其他变量。当被 shell 展开时,你会得到文字路径,就像你输入的一样
sudo PYTHONPATH=/home/www/python_commons:... <command>
Run Code Online (Sandbox Code Playgroud)
但仅当您明确请求传递它时(而不是隐式地使用 env_keep)。
这是有效的,因为 sudo 允许您传递现有的环境变量,这需要 env_keep,或者指定仅为 sudo 命令设置的 env 变量,这不需要 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
Run Code Online (Sandbox Code Playgroud)
此示例演示在 sudo 的调用环境(外部)和 sudo 本身(内部)中设置变量。请注意,即使没有 env_keep 条目,也会打印 SE_i。(SE_ik 的 env_keep 是不必要的。)还要注意 env_keep 确实适用于外部变量(不打印 SE_o)。
['var=val command' 形式的命令调用等价于 (export var=val; command)。也就是说,他们仅为该命令设置一个或多个环境变量。]
| 归档时间: |
|
| 查看次数: |
6672 次 |
| 最近记录: |