Запустите системную команду linux в качестве суперпользователя, используя скрипт python

у меня есть postfix, установленный на моей машине, и я обновляю 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.). Итак, как мне запустить эту команду программно?

5 ответов


вы можете либо запустить свой скрипт python как сам root - тогда вам не нужно будет добавлять привилегии для перезагрузки postfix.

или вы можете настроить 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

или что-то подобное.


#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. Это позволит любому пользователю перезапустить postfix. Конечно, вы можете дополнительно ограничить разрешение execute определенными группами.


чтобы ответить на ошибку: "sudo: извините, у вас должен быть tty для запуска sudo", у нас есть параметр "Defaults requiretty" в файле sudoers. Я попытался комментировать это, и это сработало: D.


import os
os.popen("sudo -S /etc/init.d/postifx reload", 'w').write("yourpassword")

это, конечно, почти всегда не очень хорошая идея, так как пароль находится в обычном тексте.


Если вы собираетесь сделать это в python, вы должны просто сделать следующее:

напишите эту команду перед строкой, которую вы вызываете командой оболочки

os.setuid(os.geteuid())

затем вы вызываете команду оболочки без префикса "sudo"