`/ etc / sudoers` - указать` env_keep` только для одной команды?

23

Есть ли способ указать, что sudoследует сохранять определенные переменные среды только для указанных команд? В некоторых целях я хотел бы, чтобы мой $HOMEenv. переменная сохраняется, когда я запускаю определенные команды. Для других целей и других команд я хочу сбросить его. Можно ли это сделать /etc/sudoers?

Редактировать:

Спасибо за ответы. Интересно, могу ли я задать дополнительный вопрос: «Почему же тогда это не работает?»

В примере я пытаюсь получить работу, я хочу sudo nanoпрочитать мой $HOME/.nanorc. Если я использую это:

Defaults:simon env_keep=HOME

это работает отлично. Если я использую это:

Defaults!/bin/nano env_keep=HOME

или это:

Cmnd_Alias      NANO = /usr/bin/nano,/bin/nano,/bin/rnano
Defaults!NANO   env_keep=HOME

это не работает вообще. Любые предложения относительно того, почему? (Кстати, я нахожусь на тестировании Debian.)

(Примечание: я не думаю, что это nanoконкретно, кстати - я могу воспроизвести поведение с помощью однострочного сценария bash, который просто echos $HOME).

Саймон
источник
1
Вместо того, чтобы пытаться заставить nano работать через sudo, чтобы использовать тот же файл конфигурации, используйте sudoeditвместо этого. sudoeditзапустит копирование содержимого файла в файл tmp и запустит редактор по вашему выбору в качестве вашего пользователя, при выходе из редактора проверит, изменили ли вы что-нибудь, и если да, замените оригинал на отредактированный. Вы можете выбрать, какой редактор вы хотите запустить, установив $EDITORпеременные или $ VISUAL` env.
Arrowmaster
@Arrowmaster - спасибо, кажется, это лучший подход, чем тот, с которым я возился. Поскольку я уже sudoиспользую свою собственную функцию, я просто добавил if [ "$1" == "$EDITOR" ]; thenблок и теперь sudoeditвместо этого
вызываю

Ответы:

21

Для переопределения env_keepтолько для /path/to/command(при вызове через любое правило любым пользователем) и для пользователя joe(независимо от того, какую команду он выполняет):

Defaults!/path/to/command env_keep=HOME
Defaults:joe env_keep=HOME

Вы можете использовать -=или, +=чтобы удалить или добавить запись в env_keepсписок.

Жиль "ТАК - перестань быть злым"
источник
молодец, спасибо. Я не мог найти правильный пример этого синтаксиса. Теперь, когда вы изложите это для меня, я вижу, как я должен был решить это со manстраницы, и я чувствую себя немного глупо. Без сомнения, этот ответ тоже поможет другим.
Симон
1
@simon: Не чувствуйте себя глупо, я также нахожу описание синтаксиса на sudoersстранице руководства трудным для понимания из формального описания и примеров, которые легче найти, если вы уже знаете, как их написать.
Жиль "ТАК - перестань быть злым"
хм - возможно, я говорил с скоро. Теперь, когда я попробую это, я не могу заставить его работать. Могу ли я побеспокоить вас взглянуть на мою ревизию?
Симон
1
@ Симон: Я предполагаю, что у вас также есть запись, которая позволяет вам делать все и не имеет этой env_keepнастройки ( simon ALL = ALL). Судо использует последнюю соответствующую запись.
Жиль "ТАК - перестань быть злым"
Осторожно, если установлен secure_path, вам также нужно будет добавить значения по умолчанию: joe! Secure_path
Jistanidiot
6
Cmnd_Alias      PBUILDER = /usr/sbin/pbuilder,/usr/sbin/cowbuilder
Defaults!PBUILDER       env_keep+=HOME

Эти строки взяты от меня, /etc/sudoersчтобы исправить проблему, которая pbuilderищет $HOMEсвой пользовательский конфигурационный файл, но должен быть запущен от имени пользователя root (перемещение его в /rootсвоего рода противоречит цели иметь как системный, так и пользовательский конфигурационный файл).

Arrowmaster
источник
да, это очень похоже на тот случай использования, который я имел в виду, спасибо!
Симон
у вас есть идея, почему примеры в моей ревизии не работают?
Симон
@simon sudo очень требователен к порядку записей в своей конфигурации, более поздние записи будут перезаписывать предыдущие. В вашей конфигурации может быть такой конфликт.
Arrowmaster
1

человек sudoers:

   env_reset       If set, sudo will reset the environment to only contain
                   the LOGNAME, SHELL, USER, USERNAME and the SUDO_*
                   variables.  Any variables in the caller’s environment
                   that match the env_keep and env_check lists are then
                   added.  The default contents of the env_keep and
                   env_check lists are displayed when sudo is run by root
                   with the -V option.  If the secure_path option is set,
                   its value will be used for the PATH environment
                   variable.  This flag is on by default.

Поэтому да, вы можете сделать это, используя env_reset, env_keepи env_checkв вашем / etc / sudoers.

Павел Бродацкий
источник