sudo -i больше не работает с определенными разрешениями через файл sudoers

У меня был скрипт bash, который вызывал sudo -i -u user /bin/bla/whatever. Это работало нормально до последнего обновления CentOS 5.8. Это соответствующая запись в файле sudoers:

Runas_Alias TEST = user1, user2
Defaults:test always_set_home
test ALL=(TEST) NOPASSWD: /bin/bash -c /bin/bla/whatever, /bin/bla/whatever

Если бы я использовал sudo -i, кажется, он вызвал команду

"/bin/bash -c /bin/bla/whatever"

(относительно безопасного журнала). Теперь, после обновления, он, кажется, звонит

"/bin/bash -c \/bin\/bla\/whatever"

и поэтому не разрешено. Я попытался изменить строку в файле sudoers на

test ALL=(TEST) NOPASSWD: /bin/bash -c /bin/bla/whatever, /bin/bla/whatever, /bin/bash -c \/bin\/bla\/whatever

но это недопустимый синтаксис, поэтому я попробовал:

test ALL=(TEST) NOPASSWD: /bin/bash -c /bin/bla/whatever, /bin/bla/whatever, /bin/bash -c \\/bin\\/bla\\/whatever

Это допустимый синтаксис, но он тоже не работает.

Если я использую sudo -H -u user /bin/bla/whatever, он работает нормально. Даже если я разрешаю /bin/bash в файле sudoers, но это позволит что угодно.....

Любые идеи?

Эрик


person erik    schedule 01.06.2012    source источник
comment
В вашем вопросе, похоже, опечатка: насколько я могу судить, команды, вызываемые до и после, идентичны.   -  person Bram    schedule 01.06.2012
comment
Да, швы, я должен это процитировать, потому что там несколько обратных слэшей, исправьте это...   -  person erik    schedule 01.06.2012


Ответы (2)


Только что проверил справочную страницу sudo в моей системе fedora 16, и там написано:

   -i [command]
               The -i (simulate initial login) option runs the shell specified by the password database entry of the target user as a login shell.  This means
               that login-specific resource files such as .profile or .login will be read by the shell.  If a command is specified, it is passed to the shell
               for execution via the shell's -c option.

Таким образом, нет необходимости указывать bash -c в определении команды sudoers.

Если вы вызываете команду как sudo -i /bin/bla/whatever, вам не нужно ничего, кроме следующего в вашем файле sudoers:

test ALL=(TEST) NOPASSWD: /bin/bla/whatever

Я могу воспроизвести проблему в своей системе Fedora 16, никакие изменения в файле sudoers, которые я пробовал, не повлияли. Я не могу найти никакой другой конфигурации, необходимой для этой работы. Все, что я могу сказать, это использовать '-H -u...'.

person Bram    schedule 01.06.2012
comment
Спасибо за ответ. Я не вызываю bash -c. Кажется, что если я использую sudo -i sudo выполнит файл с /bin/bash -c. В моем случае это также работает с sudo-H, но я использовал sudo -i, потому что он дал мне оболочку входа в систему и, следовательно, больше переменных env.... Кстати: вызываемый скрипт - это скрипт perl. - person erik; 01.06.2012
comment
Да, это то, что я сделал. Я просто искал решение, потому что раньше так работало. Так что, похоже, мне придется жить с обходным путем. Спасибо :) - person erik; 04.06.2012

Вы запускали sudo -i -u user /bin/bla/whatever с аргументами? От man sudoers:

Простое имя файла позволяет пользователю запускать команду с любыми аргументами, которые он/она пожелает. Однако вы также можете указать аргументы командной строки (включая подстановочные знаки). В качестве альтернативы вы можете указать «», чтобы указать, что команду можно запускать только без аргументов командной строки.

Таким образом, как только вы добавите /bin/bash -c, вы зададите аргументы, и они должны точно совпадать.

Вот пример строки sudoers:

test ALL=(ALL) NOPASSWD: /bin/bash -c /bin/true, /bin/bash -c /bin/true *, /bin/true *

С этим я могу сделать:

sudo /bin/true
sudo /bin/true foo
sudo -u /bin/true
sudo -u /bin/true foo

Но не sudo true, потому что это становится bash -c true, которое не соответствует bash -c /bin/true.

person nnutter    schedule 13.02.2014