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

90451
aknuds1

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

45
http://stackoverflow.com/questions/8633461/how-to-keep-environment-variables-when-using-sudo Ciro Santilli 新疆改造中心 六四事件 法轮功 8 лет назад 0

4 ответа на вопрос

41
user39559

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

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

По умолчанию env_reset По умолчанию env_keep + = "PYTHONPATH ДРУГОГО ИЗМЕНЕНИЯ 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.

Спасибо за предложение. По крайней мере, в Solaris кажется, что env_keep работает только частично, поскольку игнорирует PATH и LD_LIBRARY_PATH. Может быть, sudo построен с настройками, которые позволяют отказаться от сохранения «опасных» переменных? aknuds1 13 лет назад 0
Работал ли он с другим, как AKNUDS? Вы также можете запустить sudo sudo -V (да, дважды sudo!) И посмотреть, что там написано. Здесь вышеупомянутое решение прекрасно работает с PYTHONPATH, но PATH действительно кажется особенным. Истинная проблема с PATH. В Ubuntu они строят sudo, намеренно сбрасывая PATH. user39559 13 лет назад 0
env_keep сохранил PYTHONPATH и HOME для меня, так что явно происходит некоторая фильтрация. aknuds1 13 лет назад 0
В своем пересмотренном решении вы предлагаете жестко связать PATH sudo, изменив secure_path, верно? Я не думаю, что хочу сделать это. Мы, вероятно, близки к ответу на мой вопрос, хотя; Я думаю, что sudo построен, чтобы игнорировать reset_env и игнорировать переменные, такие как PATH и LD_LIBRARY_PATH, когда это указано с помощью env_keep. Я думаю, что могу обойтись без сохранения PATH / LD_LIBRARY_PATH под sudo, это не важно, но все равно интересно знать, почему это не сработает :) aknuds1 13 лет назад 0
Это не сработает, потому что авторы `sudo 'старались помешать вам сделать это. Вы не хотите, чтобы вредоносная библиотека загружалась, потому что они были найдены в пути, используемом sudo. Так вот почему он сбрасывается. Если вы кодируете материал, предназначенный для запуска пользователем root, скопируйте его в соответствующий системный каталог. user39559 13 лет назад 0
Если вы увидите редакцию моего вопроса, вы увидите, что по какой-то причине это поведение зависит от используемой оболочки, по крайней мере, от Solaris. aknuds1 13 лет назад 0
Выполнить `sudo sudo -V | less`, и это даст вам много информации, в том числе о том, переопределен ли `PATH`. Вы можете проверить, действительно ли ваша `PATH` передается в` sudo bash`, но не в `sudo bourne`, а не в то, что указано самим bash. Если вы действительно уверены, что это так (что кажется маловероятным), то это серьезная ошибка `sudo`, которую я действительно не пойму. Что касается вашего первоначального вопроса, безопасный и правильный способ сделать это - поместить ваши исполняемые файлы и библиотеки в стандартные системные каталоги, которые уже доступны для `sudo`, а не для изменения` PATH`. user39559 13 лет назад 0
Спасибо за предложение, я попробую sudo -V, когда вернусь на работу. Помещение исполняемых файлов / библиотек в стандартный путь - не всегда то, что вы хотите сделать; в моем случае я хотел установить расширения для изолированной установки Python, доступ к которой имел только root. Я бы не хотел, чтобы это был Python по умолчанию для любого пользователя sudo в системе. aknuds1 13 лет назад 0
sudo sudo -V в Solaris говорит, что, например, PYTHONPATH входит в число «переменных среды для удаления». Установка должна быть настроена так, чтобы игнорировать эту и некоторые другие переменные, даже если env_reset выключен. aknuds1 13 лет назад 0
Я думаю, что было бы намного полезнее объяснить опасности, а не предупреждать «осторожно». Вы имели в виду, что, добавляя пути в среду sudo, злоумышленник может переопределить системные двоичные файлы, изменив путь в пространстве пользователя? ubershmekel 11 лет назад 0
Это открывает большое окно. Одна из возможностей - та, которую вы упоминаете. Я не могу притворяться, чтобы сделать полный список. user39559 11 лет назад 0
@ user39559 `sudo sudo -V` говорит, что он хранит` PATH`, но в действительности `sudo` по-прежнему ничего не знает о моих двоичных файлах. mcandre 11 лет назад 0
@mcandre Это связано с активностью `secure_path`. `sudo sudo -V` перечисляет этот путь, но все еще утверждает, что` PATH` сохранен (что, я полагаю, является ошибкой). kynan 10 лет назад 0
Решил мою проблему [Ошибка сервера] (http://serverfault.com/questions/541847/why-doesnt-sudo-know-where-psql-is)! Благодарю. Iain Samuel McLean Elder 10 лет назад 0
приоритет secure_path выше, чем keep_env, поэтому просто добавить keep_env + = "PATH" не работает. okwap 7 лет назад 0
8
Russ

Возиться с 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
Mikel

Ваша 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 или общесистемные файлы конфигурации.

Я почти уверен, что редактирую правильный sudoers с префиксом установки, соответствующим sudo. Я запускаю sudo как "sudo su". Я должен ответить вам через несколько дней, к сожалению, по поводу остальных ваших предложений. Спасибо! aknuds1 13 лет назад 1
Попробуйте изменить неважную настройку, такую ​​как `editor` или` passprompt`, чтобы увидеть, есть ли у вас правильный файл. Или используйте strace, dtrace, truss или подобное и посмотрите, какие файлы он открывает. Mikel 13 лет назад 1
env | grep PYTHONPATH, поскольку мой пользователь печатает ожидаемое значение, однако под sudo ничего не печатается. Редактируя sudoers, я могу гарантировать, что PYTHONPATH сохранится, изменив "env_keep". Однако env_keep не будет сохранять PATH или LD_LIBRARY_PATH. Я предполагаю, что у sudo есть ограничение безопасности, чтобы не сохранять переменные, такие как PATH и LD_LIBRARY_PATH? Возможно, время установки? aknuds1 13 лет назад 0
Если sudo был скомпилирован с --with-secure-path, это изменило бы PATH, но в документах не говорится, что это касается LD_LIBRARY_PATH. Mikel 13 лет назад 0
Что насчет env_delete? Также на странице руководства написано: Обратите внимание, что многие операционные системы удаляют потенциально опасные переменные из среды любого процесса setuid (например, sudo). Mikel 13 лет назад 0
Не уверен, почему вы должны изменить env_keep, чтобы сохранить PYTHONPATH. Если действует! Env_reset и нет записей env_delete, этого должно быть достаточно AFAIUI. Mikel 13 лет назад 0
Насколько я могу судить,! env_reset игнорируется, но завтра я могу перепроверить. Я совершенно уверен, что env_delete не устанавливается, но я тоже могу это проверить. aknuds1 13 лет назад 1
Я подтвердил, что! Env_reset игнорируется, а env_delete не устанавливается. aknuds1 13 лет назад 1
-1
OlPo

Согласно документации 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 
Хорошо, но вопрос не об Ubuntu. Подсказка: в следующий раз посмотрите на теги под вопросом. DavidPostill 7 лет назад 0