Как заставить sudo сохранить переменные среды?

47

Используя 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). Я должен сказать, что это довольно запутанное поведение.

aknuds1
источник
stackoverflow.com/questions/8633461/…
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件

Ответы:

44

Используйте внимательно, есть проблемы безопасности с 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.

user39559
источник
Спасибо за предложение. По крайней мере, в Solaris кажется, что env_keep работает только частично, поскольку игнорирует PATH и LD_LIBRARY_PATH. Может быть, sudo построен с настройками, которые позволяют отказаться от сохранения «опасных» переменных?
aknuds1
Работал ли он с другим, как AKNUDS? Вы также можете запустить sudo sudo -V (да, дважды sudo!) И посмотреть, что там написано. Здесь вышеупомянутое решение прекрасно работает с PYTHONPATH, но PATH действительно кажется особенным. Истинная проблема с PATH. В Ubuntu они строят sudo, намеренно сбрасывая PATH.
user39559
env_keep сохранил PYTHONPATH и HOME для меня, так что явно происходит некоторая фильтрация.
aknuds1
В своем пересмотренном решении вы предлагаете жестко связать PATH sudo, изменив secure_path, верно? Я не думаю, что хочу сделать это. Мы, вероятно, близки к ответу на мой вопрос, хотя; Я думаю, что sudo построен, чтобы игнорировать reset_env и игнорировать переменные, такие как PATH и LD_LIBRARY_PATH, когда это указано с помощью env_keep. Я думаю, что могу обойтись без сохранения PATH / LD_LIBRARY_PATH под sudo, это не важно, но все равно интересно знать, почему это не сработает :)
aknuds1
Это не сработает, потому что sudoписатели старались помешать вам сделать это. Вы не хотите загружать вредоносную библиотеку, потому что они были найдены в пути, используемом sudo Так вот почему он сбрасывается. Если вы кодируете материал, предназначенный для запуска пользователем root, скопируйте его в соответствующий системный каталог.
user39559
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 python'
Russ
источник
1
может быть полезно сделать это - псевдоним sudopy = 'sudo PYTHONPATH = $ PYTHONPATH python' - затем использовать его sudopy some_script.py
Able Mac
@AbleMac Вы правы. Это была ошибка ... Я исправлю это. Спасибо!
Расс
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 или общесистемные файлы конфигурации.

Mikel
источник
1
Я почти уверен, что редактирую правильный sudoers с префиксом установки, соответствующим sudo. Я запускаю sudo как "sudo su". Я должен буду вернуться к вам, через несколько дней, к сожалению, по поводу остальных ваших предложений. Спасибо!
aknuds1
1
Попробуйте изменить неважные настройки, такие как editorили, passpromptчтобы проверить, есть ли у вас правильный файл. Или используйте strace, dtrace, truss или подобное и посмотрите, какие файлы он открывает.
Микель
env | grep PYTHONPATH, поскольку мой пользователь печатает ожидаемое значение, однако под sudo ничего не печатается. Редактируя sudoers, я могу гарантировать, что PYTHONPATH сохранится, изменив "env_keep". Однако env_keep не будет сохранять PATH или LD_LIBRARY_PATH. Я предполагаю, что у sudo есть ограничение безопасности, чтобы не сохранять переменные типа PATH и LD_LIBRARY_PATH? Возможно, время установки?
aknuds1
1
Насколько я могу судить,! env_reset игнорируется, но я могу проверить еще раз завтра. Я совершенно уверен, что env_delete не устанавливается, но я тоже могу это проверить.
aknuds1
1
Я подтвердил, что! Env_reset игнорируется, а env_delete не устанавливается.
aknuds1
-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
    
OlPo
источник
Хорошо, но вопрос не об Ubuntu. Подсказка: в следующий раз посмотрите на теги под вопросом.
DavidPostill