2016-07-28 29 views
0

Hier ist mein Code:Python subprocess sudo kehrt Fehler: ERROR: [ 'sudo: sorry, müssen Sie einen tty haben sudo n laufen']

import subprocess 

HOST = 'host_name' 
PORT = '111' 
USER = 'user_name' 
CMD = 'sudo su - ec2-user; ls' 

process = subprocess.Popen(['ssh','{}@{}'.format(USER, HOST), 
         '-p', PORT, CMD], 
         shell=False, 
         stdout=subprocess.PIPE, 
         stderr=subprocess.PIPE) 

result = process.stdout.readlines() 

if not result: 
    print "Im an error" 
    err = process.stderr.readlines() 
    print('ERROR: {}'.format(err)) 
else: 
    print "I'm a success" 
    print(result) 

Als ich das laufen erhalte ich folgende Ausgabe in meinem Terminal:

dredbounds-computer: documents$ python terminal_test.py 
Im an error 
ERROR: ['sudo: sorry, you must have a tty to run sudo\n'] 

ich habe mehrere Dinge ausprobiert, aber ich immer, dass Fehler immer „sudo: sorry, müssen Sie einen tty müssen sudo laufen“. Es funktioniert gut, wenn ich es manuell durch das Terminal mache, aber ich muss das automatisieren. Ich lese, dass ein Workaround sein könnte, '-t' oder '-tt' in meinem ssh-Aufruf zu verwenden, aber ich konnte das noch nicht erfolgreich im Unterprozess implementieren (Terminal hängt nur für mich). Weiß jemand, wie ich meinen Code reparieren oder umgehen kann? Idealerweise würde ich gerne ssh, dann zum sudo-Benutzer wechseln und dann eine Datei von dort ausführen (ich habe ls einfach zu Testzwecken benutzt).

+0

Warum 'sudo su - EC2-Benutzer; ls' statt nur 'sudo -u ec2-user ls'? – miken32

Antwort

1

sudo fordert Sie zur Eingabe eines Kennworts auf, benötigt dafür jedoch ein Terminal. Übergeben -t oder -tt bietet ein Terminal für den Remote-Befehl ausgeführt werden, aber jetzt wartet es auf Sie ein Kennwort eingeben.

process = subprocess.Popen(['ssh','-tt', '{}@{}'.format(USER, HOST), 
          '-p', PORT, CMD], 
          shell=False, 
          stdout=subprocess.PIPE, 
          stderr=subprocess.PIPE, 
          stdin=subprocess.PIPE) 
process.stdin.write("password\r\n") 

Beachten Sie aber, dass die ls erst nach die Schale von su Ausfahrten gestartet läuft. Sie sollten sich entweder als ec2-user direkt bei der Maschine anmelden (wenn möglich), oder einfach sudo verwenden, um den gewünschten Befehl auszuführen, ohne zuerst su zu durchlaufen.

+0

Danke für die Antwort. Ich habe versucht mit process.stdin.write ("Passwort"), wie Sie vorgeschlagen, aber ich bekomme: "AttributeError: 'NoneType' Objekt hat kein Attribut 'schreiben'" , wenn ich das ausführen. – dredbound

+0

Haben Sie 'stdin = subprocess.PIPE' als Argument übergeben? – chepner

+0

Das habe ich verpasst, aber jetzt bringt mich das nur zu meiner ursprünglichen Ausgabe von der Konsole zurück. "FEHLER: ['sudo: Entschuldigung, Sie müssen ein tty haben, um sudo auszuführen \ n']" – dredbound

0

Sie können sagen, dass sudo funktioniert, ohne dass ein Passwort erforderlich ist. Fügen Sie das einfach zu /etc/sudoers auf dem Remote-Server host_name hinzu.

user ALL = (ec2-user) NOPASSWD: ls 

Dies ermöglicht dem Benutzer user nannte den Befehl ls als ec2-user auszuführen, ohne ein Kennwort einzugeben.

Dies vorausgesetzt, dass Sie Ihren Befehl ändern wie folgt aussehen, was mir mehr sinnvoll erscheint:

CMD = 'sudo -u ec2-user ls'