Запустите команду linux system в качестве суперпользователя, используя python script
У меня есть постфикс, установленный на моей машине, и я обновляю virtual_alias на лету программно (используя python) (по некоторым действиям). Как только я обновляю запись в файле /etc/postfix/virtual _alias, я запускаю команду:
sudo /usr/sbin/postmap /etc/postfix/virtual_alias 2>>/work/postfix_valias_errorfile
Но я получаю сообщение об ошибке:
sudo: sorry, you must have a tty to run sudo
Я хочу запустить указанную команду sudo нечеловеческим способом (это означает, что я запускаю эту системную команду из python script.). Итак, как я могу запустить эту команду программно?
Ответы
Ответ 1
Вы можете запустить свой python script как сам root, тогда вам не нужно будет добавлять привилегии для перезагрузки постфикса.
Или вы можете настроить sudo на отсутствие пароля для /etc/init.d/postfix
.
Конфигурация sudo (через visudo) позволяет NOPASSWD: разрешить команду без пароля. См. http://www.sudo.ws/sudo/man/sudoers.html#nopasswd_and_passwd
<username> ALL = NOPASSWD: /etc/init.d/postfix
или что-то подобное.
Ответ 2
#include <unistd.h>
#include <stdlib.h>
// gcc -o reload_postfix reload_postfix.c
// chown root reload_postfix
// chmod +s reload_postfix
int main( int argc, char **argv ) {
setuid( geteuid() );
system("/etc/init.d/postifx reload");
}
Завершите свою команду в программе setuid-ed. Это позволит любому пользователю перезапустить постфикс. Вы, конечно же, можете ограничить разрешение выполнения для определенных групп.
Ответ 3
Чтобы ответить на ошибку: "sudo: извините, у вас должно быть tty для запуска sudo", у нас есть параметр "Defaults requiretty" в файле sudoers. Я попытался прокомментировать это, и это сработало: D.
Ответ 4
import os
os.popen("sudo -S /etc/init.d/postifx reload", 'w').write("yourpassword")
Это, конечно, почти всегда не очень хорошая идея, поскольку пароль находится в обычном тексте.
Ответ 5
если вы собираетесь делать это на python, вы должны просто сделать следующее:
напишите эту команду перед строкой, которую вы вызываете командой оболочки
os.setuid(os.geteuid())
то вы вызываете команду оболочки без префикса "sudo"