5

Я изменил /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 ответ1

5

Вы очень близки: не цитируйте PYTHONPATH, как показано ниже.

Defaults    env_keep += PYTHONPATH

Вам не нужно изменять env_reset.

Вы также можете подумать о том, чтобы вообще не менять sudoers. Вместо этого рассмотрите возможность вызова sudo следующим образом:

sudo PYTHONPATH=$PYTHONPATH <command...>

Это также работает с PATH и другими переменными. Когда раскрывается оболочкой, вы получаете буквальные пути, как если бы вы набрали

sudo PYTHONPATH=/home/www/python_commons:... <command>

но только когда вы явно просите передать его (в отличие от неявно с env_keep).

Это работает, потому что sudo позволяет передавать существующие переменные окружения, для которых требуется env_keep, или указывать переменные env, которые должны быть установлены исключительно для команды 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 (внутренней). Обратите внимание, что SE_i печатается, хотя для него нет записи env_keep. (env_keep для SE_ik не требуется.) Также обратите внимание, что env_keep применяется к внешним переменным (SE_o не печатается).

[Вызовы команд для команды 'var = val' эквивалентны (export var = val; команда). То есть они устанавливают одну или несколько переменных среды только для этой команды.]

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .