Führen Sie einen Linux-System Befehl als Superuser, ein Python-Skript
Frage
Ich habe bekam postfix auf meinem Rechner installiert und ich virtual_alias programmatisch on the fly bin Aktualisierung (mit Python) (auf eine Aktion). Sobald ich den Eintrag aktualisieren in der Datei / etc / postfix / virtual_alias, ich bin mit dem Befehl:
sudo /usr/sbin/postmap /etc/postfix/virtual_alias 2>>/work/postfix_valias_errorfile
But Ich erhalte die Fehlermeldung: sudo: sorry, you must have a tty to run sudo
Ich mag den genannten Befehl sudo in einer nicht-menschlichen Art und Weise ausgeführt werden (das heißt, ich bin mit diesem System Befehl von einem Python-Skript.). So wie ich programmatisch diesen Befehl ausführen bekommen?
Lösung
Sie entweder Ihre Python-Skript als root ausführen können selbst. - dann werden Sie nicht brauchen Privileg hinzufügen postfix neu zu laden
Sie können auch sudo so konfigurieren, dass kein Passwort für /etc/init.d/postfix
benötigen.
sudo-Konfiguration (über visudo) ermöglicht NOPASSWD: Den Befehl ohne Passwort zu erlauben. Siehe http://www.sudo.ws/sudo/man/sudoers.html# nopasswd_and_passwd
<username> ALL = NOPASSWD: /etc/init.d/postfix
oder etwas ähnliches.
Andere Tipps
#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");
}
Wickeln Sie Ihren Befehl in setuid-ed-Programm. Dies wird jeden Benutzer Neustart postfix lassen. Sie können ferner natürlich beschränken die Erlaubnis, bestimmte Gruppen ausführen.
Um den Fehler zu beantworten: „sudo: sorry, müssen Sie einen tty haben sudo zu laufen“, haben wir eine Einstellung „Defaults requiretty“ in sudoers-Datei bezeichnet. Ich habe versucht, kommentieren Sie es aus und es hat funktioniert. D
import os
os.popen("sudo -S /etc/init.d/postifx reload", 'w').write("yourpassword")
Das ist natürlich fast immer keine gute Idee, da das Passwort im Klartext ist.
Wenn Sie Gonna tun dies in Python sollten Sie nur Folgendes tun:
schreiben Sie diesen Befehl vor der Zeile, die Sie den Shell-Befehl aufrufen
os.setuid(os.geteuid())
dann, können Sie den Shell-Befehl aufrufen, ohne "sudo" Präfix
Siehe StackLick
Sie benötigen einen Benutzer zu gewähren, laufen Befehl sudo ohne Passwort.