Как заставить sudo сохранить переменные среды?
Используя 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). Я должен сказать, что это довольно запутанное поведение.
6 ответов
Используйте внимательно, есть проблемы безопасности с sudo и переменными.
От man sudoers
Я обнаружил, что вы должны использовать
По умолчанию env_reset По умолчанию env_keep += "PYTHONPATH OTHERVARIABLE YETANOTHER"
В Ubuntu sudo
действительно сохраняет некоторые переменные. sudo -i
больше похоже на вход в систему как root и затем запуск команды. Оба могут быть неудобными, первый для sudo nano myfile
оставляет корневые файлы в вашем доме, а последний для 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.
Возиться с 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'
Ваш 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 или общесистемные файлы конфигурации.
Как насчет
sudo -E ...
Отman sudo
:
-E, --preserve-env Indicates to the security policy that the user wishes to >preserve their existing environment variables. The security policy may return an >error if the user does not have permission to preserve the environment.
Согласно документации Ubuntu для LD_LIBRARY_PATH:
Вы должны использовать /etc/ld.so.conf.d/*.conf файлы конфигурации
Затем:
Добавить
ld.so
файл конфигурации в/etc/ld.so.conf.d/
с пути вашегоLD_LIBRARY_PATH
Обновите кеш:
sudo ldconfig -v