Einen Befehl als Superuser aus einem Python-Skript ausführen

Also versuche ich, einen Prozess zu bekommen, der als Superuser aus einem Python-Skript mit Unterprozeß ausgeführt wird. In der ipython-Shell etwas wie

proc = subprocess.Popen('sudo apach2ctl restart', shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

Funktioniert gut, aber sobald ich es in ein Skript sudo: apach2ctl: command not found ich an zu bekommen: sudo: apach2ctl: command not found

Ich würde vermuten, das ist aufgrund der Art und Weise sudo Griffe Umgebungen auf Ubuntu. (Ich habe auch versucht, sudo -E apche2ctl restart und sudo env path=$PATH apache2ctl restart ohne Erfolg)

Also meine Frage ist grundsätzlich, wenn ich apache2ctl restart als Super User ausführen apache2ctl restart , der den Benutzer für das Super User Passwort bei Bedarf auffordert, wie soll ich das machen? Ich habe keine Absicht, Passwörter im Skript zu speichern.

Bearbeiten:

Ich habe versucht, in den Befehlen als String und in eine Liste zu verteilen. In der Python-Interpreter, mit einem String bekomme ich die Passwort-Eingabeaufforderung richtig (funktioniert immer noch nicht in einem Python-Skript wie in meinem ursprünglichen Problem), eine Liste gibt nur die Hilfe-Bildschirm für sudo.

Bearbeiten 2:

Also, was ich sammle, ist, dass während Popen mit einigen Befehlen genauso wie Strings arbeiten wird, wenn Shell = True, es dauert

 proc = subprocess.Popen(['sudo','/usr/sbin/apache2ctl','restart']) 

Ohne 'shell = True' zu bekommen sudo zu arbeiten.

Vielen Dank!

4 Solutions collect form web for “Einen Befehl als Superuser aus einem Python-Skript ausführen”

Versuchen Sie, den vollständigen Pfad zu apache2ctl zu geben.

Versuchen:

subprocess.call(['sudo', 'apach2ctl', 'restart'])

Der Teilprozeß muss auf das echte stdin / out / err zugreifen, damit es in der Lage ist, Sie zu veranlassen und Ihr Passwort zu lesen. Wenn du sie als Rohre aufstellst, musst du das Passwort selbst in die Pfeife eintragen.

Wenn du sie nicht definierst, dann packt es sys.stdout, etc …

Ein weiterer Weg ist, um Ihren Benutzer ein Passwort-weniger sudo user .

Geben Sie auf der Befehlszeile Folgendes ein:

 sudo visudo 

Dann füge folgendes hinzu und ersetze den <username> mit deinem:

 <username> ALL=(ALL) NOPASSWD: ALL 

Dies ermöglicht es dem Benutzer, den Befehl sudo auszuführen, ohne dass er nach einem Passwort fragen muss (einschließlich der vom Benutzer gestarteten Anwendung). Dies könnte jedoch ein Sicherheitsrisiko sein

Du musst Popen so verwenden:

 cmd = ['sudo', 'apache2ctl', 'restart'] proc = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

Es erwartet eine Liste.

  • Kann ich verhindern, dass Stoff mich für ein Sudo-Passwort veranlasst?
  • Kann keine .py-Datei aus Kitt ausführen, Syntaxfehler: Wort unerwartet (erwartet ")")
  • Mac OS X Python GUI Administrator Eingabeaufforderung
  • Ausführen von Befehlen aus Python, die Root-Zugriff benötigen
  • Auf OS X El Capitan Ich kann nicht aktualisieren ein Python-Paket abhängig von den sechs Kompatibilität Utilities NOR kann ich sechs entfernen
  • Kann nicht einen Sudo-Prozess beenden, der mit Python erstellt wurde, in Ubuntu 15.10
  • Drop-Root-Berechtigungen für bestimmte Operationen in Python
  • Python pexpect & pxssh mit sudo und EOF
  • Python ist die beste Programmiersprache der Welt.