Мне нужно запустить important_script.sh, как и sudo -i без пароля.
Если у меня в sudoers:
apache ALL = (root) NOPASSWD: /blah/important_script.sh
и запустите "sudo /blah/important_script.sh" Я могу запустить его без пароля.
Однако, если я запускаю "sudo -i /blah/important_script.sh", мне нужно ввести пароль для apache.
Если я изменю строку в sudoers на:
apache ALL = (root) NOPASSWD:ALL
Я могу запустить команду sudo -i /blah/important_script.sh без пароля.
Но я хочу иметь возможность запускать только /blah/important_script.sh, а не ВСЕ команды.
Итак, как я настроил, чтобы только /blah/important_script.sh мог запускаться с sudo -i без пароля.
Когда я пытаюсь это сделать, я получаю сообщение об ошибке, которое дает ключ к разгадке проблемы.
Sorry, user bob is not allowed to execute '/bin/bash -c /blah/important_script.sh' as root on host.
Обратите внимание, что нам отказано в доступе к команде /bin/bash -c...
который отличается от того, который мы указали в файле sudoers /blah/important_script...
. Когда вы говорите sudo разрешить пользователю запускать определенную команду, они должны использовать точную командную строку, указанную в sudoers, поэтому нам нужно изменить sudoers соответствующим образом.
bob ALL=(root) NOPASSWD: /bin/bash -c /blah/important_script.sh
Теперь это работает для Боба
$ sudo -i /bin/bash -c /blah/important_script.sh
Так почему он это делает? На странице руководства по sudo есть ответ
‑I [команда] Параметр ‑i (имитировать начальный вход в систему) запускает оболочку, указанную в записи базы данных паролей целевого пользователя, в качестве оболочки входа. Это означает, что файлы ресурсов для входа в систему, такие как .profile или .login, будут прочитаны оболочкой. Если команда указана, она передается в оболочку для выполнения через параметр оболочки ‑c. Если команда не указана, выполняется интерактивная оболочка ...