Запустите системную команду 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"