2009-02-24 4 views
16

Ich habe Postfix auf meinem Computer installiert und ich aktualisiere virtual_alias im laufenden Betrieb programmgesteuert (mit Python) (bei einigen Aktionen). Sobald ich den Eintrag aktualisieren in der Datei/etc/postfix/virtual_alias, ich bin mit dem Befehl: Führen Sie einen Linux-Systembefehl als Superuser mit einem Python-Skript

sudo /usr/sbin/postmap /etc/postfix/virtual_alias 2>>/work/postfix_valias_errorfile
Aber ich erhalte die Fehlermeldung:
sudo: sorry, you must have a tty to run sudo

ich den erwähnten Befehl sudo in einem nicht-menschlichen Art und Weise (Bedeutung ausgeführt werden soll, Ich führe diesen Systembefehl von einem Python-Skript aus. Wie bekomme ich diesen Befehl programmgesteuert?

Antwort

19

Sie können Ihr Python-Skript entweder selbst als root ausführen - dann müssen Sie keine Berechtigung zum Nachladen von Postfix hinzufügen.

Oder Sie können Sudo konfigurieren, um kein Kennwort für /etc/init.d/postfix zu benötigen.

sudo Konfiguration (über visudo) ermöglicht NOPASSWD: um den Befehl ohne ein Passwort zu ermöglichen. Siehe http://www.sudo.ws/sudo/man/sudoers.html#nopasswd_and_passwd

<username> ALL = NOPASSWD: /etc/init.d/postfix 

oder etwas ähnliches.

+0

+1: Führen Sie das Sudo außerhalb des Python-Skripts aus. –

+0

Douglas! Wie konfiguriere ich Sudo, um kein Passwort für das Skript (/etc/init.d/postfix reload) zu benötigen? –

+0

Die Erstellung von Sudo muss nicht von Passwörtern abhängig gemacht werden, und sudo kann außerhalb des Bereichs der Programmierfrage pro Programm pro Benutzer konfiguriert werden. – myroslav

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

Dies ist natürlich fast immer keine gute Idee, da das Passwort im Klartext ist.

+2

Ein Sudo-Passwort im Klartext ist eine schreckliche Idee, es gibt viel mehr sichere Möglichkeiten. Das Setuid-Bit adressiert dieses Problem besonders. – codelogic

+0

Nur-Text-Passwort? Eeek! Stellen Sie NOPASSWD in/etc/sudoers für den Benutzer oder die Gruppe ein, sodass sudo kein Passwort benötigt wird. –

+0

Es ist nicht so eine schlechte Idee, wenn Sie eine schnelle und schmutzige Lösung auf Ihrem eigenen PC haben wollen. In einer Produktionsumgebung ist es einfach schlecht. – answerSeeker

5
#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. Dadurch kann jeder Benutzer Postfix neu starten. Sie können die Ausführungsberechtigung natürlich auf bestimmte Gruppen einschränken.

+0

Ich sprach über Python-Skript! –

+0

Da Sie Postfix-Konfigurationsänderungen vornehmen, nahm ich an, dass dies für einen Server ist und dass Sicherheit viel wichtiger wäre als die Verwendung einer bestimmten Programmiersprache. Sie können setuid() Skripte nicht wegen der Art, wie sie ausgeführt werden, daher diese Lösung (eine sehr häufige). – codelogic

+0

sudo gilt als überlegener Weg, root-Rechte zu erhalten. Es ändert sich die Idee der Streuung von Setuid-Bits über das Dateisystem zu einer einzelnen ausführbaren Datei, die zu dieser Funktionalität fähig ist (sudo), mit einer zentralen Konfiguration, flexibleren Richtlinien mit einer revisionssicheren Verwendung. – myroslav

3

Um den Fehler zu beantworten: "Sudo: Entschuldigung, Sie müssen ein tty Sudo zu laufen haben", haben wir eine Einstellung namens "Defaults erforderlich" in sudoers Datei. Ich habe versucht es zu kommentieren und es hat funktioniert: D.

+0

Die andere Möglichkeit besteht darin, ein Ausrufezeichen vor der Anforderung zu setzen, d. H. "Defaults! Requiretty". So kann jeder, der die sudoers-Datei liest, sehen, dass du Sudo explizit ohne tty erlaubst –

0

wenn Sie jetzt tun dies in Python sollten Sie nur Folgendes tun:

schreiben Dieser Befehl vor der Zeile, die Sie den Shell-Befehl dann

os.setuid(os.geteuid()) 

nennen, rufen Sie den Shell-Befehl ohne "sudo" Präfix

Verwandte Themen