Подтвердить что ты не робот

Запустите команду 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.). Итак, как я могу запустить эту команду программно?

4b9b3361

Ответ 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"