sudo без пароля в программе на СИ
Вопрос касается только языка СИ, только ОС Линукс.
Суть задачи. Моя основная программа запускается с sudo, запрашивается пароль и идет выполнение. Далее уже в самой этой программе выполняются вызовы к различным внешним программам с использованием sudo (например, "sudo rm ..."). Поскольку время действия сессии sudo ограничено, первые несколько вызовов sudo из программы выполняются нормально. Но потом, когда время сессии заканчивается (а моя программа работает в течение нескольких часов), команды на выполнение внешних программ с sudo выполняться перестают. Примечание. Запуск внешних программ изнутри моей делается с помощью popen(...).
Что делалось для решения проблемы: а) устанавливался большой timestamp_timeout; б) основная программа запускалась после ввода sudo -s
Проблема не была решена. Видимо, запуск внешних программ изнутри моей основной программы рассматривается не как продолжение сессии sudo основной программы. Полностью отменять запрос пароля sudo для текущего пользователя я не хочу. Требуется решение, которое позволит запускать внешние программы изнутри моей основной программы в не зависимости от времени действия сессии sudo. Либо как запускать внешние программы с одновременной передачей пароля sudo.
Заранее благодарю за конструктивные ответы.
Ответы (4 шт):
если программа запущена с root правами, то они останутся до ее завершения, внутри нее не нужно использовать sudo
sudo visudo
Меняем %sudo ALL=(ALL:ALL) ALL
на %sudo ALL=(ALL:ALL) NOPASSWD: ALL
Получаем выполнение sudo от имени пользователя члена группы sudo без ввода пароля
Может вместо sudo в popen переставлять uid через setuid, setreuid, setresuid или setfsuid (https://jlk.fjfi.cvut.cz/arch/manpages/man/seteuid.2.en)
Также чтоб не запскать программу под sudo поставить разрешение на бинарный файл через Capabilities
setcap CAP_SETUID ./program
или
chown root ./program
chmod u+s ./program
У вас явно какой-то неправильный воркфлоу. Но для такого неправильного воркфлоу есть решение. sudo -S program <<<"YourPassWord" или echo "YourPassWord"|sudo -S program
