45

Используя sudo 1.7.4p4 в Solaris 5.10 и sudo 1.6.7p5 в RHEL4 u6, я не вижу, как сохранить переменные среды, например, $ PYTHONPATH. Я добавил эту строку в sudoers, но это не имеет никакого значения:

Defaults !env_reset

Я что-то не так делаю, или установка sudo просто не соблюдает флаг env_reset?

Изменить: По крайней мере на Solaris, мы обнаружили, что эта проблема зависит от оболочки! Стандартная корневая оболочка - Bourne, если мы запускаем bash под sudo (sudo bash), с другой стороны,!env_preset сохранит среду (включая PATH и LD_LIBRARY_PATH). Я должен сказать, что это довольно запутанное поведение.

4 ответа4

43

Используйте внимательно, есть проблемы безопасности с sudo и переменными.

Из man sudoers я обнаружил, что вы должны использовать

Defaults        env_reset
Defaults        env_keep += "PYTHONPATH OTHERVARIABLE YETANOTHER"

В Ubuntu sudo сохраняет некоторые переменные. sudo -i больше похоже на вход в систему от имени пользователя root и последующее выполнение команды. И то, и другое может быть неудобно: первый для sudo nano myfile оставляет файлы, принадлежащие root, в вашем доме, а второй для sudo -i nano myfile попытается открыть /root /myfile.


Бежать

sudo printenv PATH

и посмотрим, что это даст. Здесь это дает

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

например. Теперь запустите sudo visudo и добавьте строку

Defaults        secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

заменив тем, что вы нашли прямо перед этим. Добавьте новый путь к нему, если вам нужно.

О библиотеках:

sudo LD_LIBRARY_PATH=/usr/lib/path/to/a/safe/library your command

В дистрибутивах Linux много внимания PATH , и вы действительно должны быть осторожны, прежде чем поиграть с ним. Будьте особенно осторожны при добавлении путей типа " . " Или /home/username , это небезопасно.

Одна из опасностей добавления путей заключается в том, что он открывает возможность запуска файлов по этим путям root , открывая окна в системе безопасности, которые могут быть использованы вредоносным программным обеспечением. Могут быть и другие опасности. Просто убедитесь, что вы знаете, что делаете. Обход мер безопасности sudo может сделать ваш Solaris таким же безопасным, как Windows XP.

8

Как говорят другие, возиться с sudoers нужно с осторожностью.

Более простой подход для более простых случаев, когда есть определенные переменные окружения, которые вы хотите сохранить, состоит в том, чтобы просто передать нужную переменную окружения непосредственно через sudo (это показано как [VAR=value] в справке sudo cmdline).

Посмотрите этот небольшой пример, где я также продемонстрировал его для более чем одной переменной.

$ export MY_V1=1
$ export MY_V2=2
$ printenv | grep MY_V
MY_V2=2
MY_V1=1
$ sudo MY_V1=$MY_V1 MY_V2=$MY_V2 printenv | grep MY_V
MY_V2=2
MY_V1=1

Для исходного примера PYTHONPATH в вопросе просто используйте следующее:

$ sudo PYTHONPATH=$PYTHONPATH python some_script.py
<script_output_here>

Создание псевдонима для этого типа вещей удобно. Вот так:

$ alias sudopy='sudo PYTHONPATH=$PYTHONPATH'
3

Ваши значения по Defaults !env_reset выглядит нормально, при условии, что вы также не вызываете sudo с опцией -E .

Вы можете попробовать удалить эту запись полностью.

Вы убедились, что редактируете правильный файл sudoers? Я предполагаю, что это может быть /etc/sudoers или /usr/local/etc/sudoers зависимости от того, как он был установлен. Вы редактировали его с помощью visudo?

Как у тебя работает sudo? sudo python , sudo su , sudo su - , sudo -s , что-то еще? Только sudo python и sudo su сохранят вашу среду.

Что делает env | grep PYTHONPATH сказать? Если ничего, убедитесь, что PYTHONPATH экспортирован, запустив export PYTHONPATH и попробуйте снова.

Что делает sudo env | grep PYTHONPATH сказать? Если он печатает ожидаемое значение, то что-то еще перезаписывает ваше значение PYTHONPATH. Может быть, root .bashrc или .bash_profile или общесистемные файлы конфигурации.

-1

Согласно документации Ubuntu для LD_LIBRARY_PATH:

Вы должны использовать /etc/ld.so.conf.d/*.conf файлы конфигурации

Затем:

  1. Добавьте файл конфигурации ld.so в /etc/ld.so.conf.d/ с путем к вашему LD_LIBRARY_PATH

  2. Обновите кеш:

    sudo ldconfig -v
    

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