Как заставить 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 su
source ~/.bashrc
cd /home/my_nosudo_user

Как насчет

      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 файлы конфигурации

Затем:

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

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

    sudo ldconfig -v
    
Другие вопросы по тегам