Uruchom polecenie systemu linux jako superuser, używając skryptu Pythona

Mam zainstalowanego postfixa na moim komputerze i aktualizuję virtual_alias w locie programowo(za pomocą Pythona) (w jakiejś akcji). Po aktualizacji wpisu w /etc / postfix/ virtual_alias uruchamiam komendę:

sudo /usr/sbin/postmap /etc/postfix/virtual_alias 2>>/work/postfix_valias_errorfile
ale dostaję błąd:
sudo: sorry, you must have a tty to run sudo

Chcę uruchomić wspomniane polecenie sudo w sposób nie-ludzki(co oznacza, że uruchamiam to polecenie systemowe ze skryptu Pythona.). Więc jak mam to polecenie uruchomić programowo?

Author: None-da, 2009-02-24

5 answers

Możesz uruchomić skrypt Pythona jako root - wtedy nie będziesz musiał dodawać uprawnień, aby przeładować postfixa.

Lub możesz skonfigurować sudo tak, aby nie wymagało hasła do /etc/init.d/postfix.

Konfiguracja Sudo (poprzez visudo) pozwala NOPASSWD: zezwolić na polecenie bez hasła. Zobacz http://www.sudo.ws/sudo/man/sudoers.html#nopasswd_and_passwd

<username>  ALL = NOPASSWD: /etc/init.d/postfix
Albo coś podobnego.
 20
Author: Douglas Leeder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-24 21:19:55
#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");
}

Zawiń polecenie w program setuid-ed. Pozwoli to każdemu użytkownikowi na ponowne uruchomienie postfixa. Można oczywiście dodatkowo ograniczyć uprawnienia do wykonywania do określonych grup.

 5
Author: codelogic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-24 19:43:44

Aby odpowiedzieć na błąd: "sudo: sorry, you must have a tty to run sudo", mamy ustawienie o nazwie "Defaults requiretty" w pliku sudoers. Próbowałem to skomentować i wyszło: D.

 3
Author: None-da,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-06 13:20:55
import os
os.popen("sudo -S /etc/init.d/postifx reload", 'w').write("yourpassword")

To oczywiście prawie zawsze nie jest dobry pomysł, ponieważ hasło jest w zwykłym tekście.

 2
Author: CTT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-24 19:38:21

Jeśli chcesz to zrobić w Pythonie, powinieneś po prostu wykonać następujące czynności:

Napisz to polecenie przed linią, którą wywołujesz komendę powłoki

os.setuid(os.geteuid())

Następnie wywołujesz polecenie powłoki bez prefiksu "sudo"

 0
Author: torkashvan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-17 21:06:26