Ich versuche, einen interaktiven Befehl über paramiko auszuführen. Die cmd-Ausführung versucht, zur Eingabe eines Passworts aufzufordern, aber ich weiß nicht, wie ich das Passwort über den exec_command von paramiko angeben soll, und die Ausführung hängt. Gibt es eine Möglichkeit, Werte an das Terminal zu senden, wenn eine cmd-Ausführung interaktiv Eingaben erwartet?
Die vollständige Paramiko-Distribution wird mit viel Gutem ausgeliefert Demos.
Im Demos-Unterverzeichnis demo.py und interactive.py haben Sie vollständige interaktive TTY-Beispiele, die für Ihre Situation wahrscheinlich übertrieben wären.
In deinem obigen Beispiel ssh_stdin verhält sich wie ein Standard-Python-Dateiobjekt, also ssh_stdin.write sollte funktionieren, solange der Kanal noch offen ist.
Ich musste nie in stdin schreiben, aber die Dokumentation schlägt vor, dass ein Kanal geschlossen wird, sobald ein Befehl beendet wird, also den Standard verwenden stdin.write Methode zum Senden eines Passworts wird wahrscheinlich nicht funktionieren. Es gibt Paramiko-Befehle auf niedrigerer Ebene auf dem Kanal selbst, die Ihnen mehr Kontrolle geben – sehen Sie, wie die SSHClient.exec_command Methode ist für alle blutigen Details implementiert.
Und für diejenigen unter Ihnen, die hierher gekommen sind und nur sehen möchten, was die Ausgabe eines Befehls sein könnte, könnte ein Code so aussehen: (stdin, stdout, stderr) = Client.exec_command('ls -la') print("nstdout is:n" + stdout.read() + "nstderr is:n" + stderr.read())
– Paul Hoffmann
11. April 11 um 17:46 Uhr
Fehlerhafter Link behoben.
– schlau
16. November 17 um 19:34 Uhr
afrost
Ich hatte das gleiche Problem beim Versuch, eine interaktive SSH-Sitzung mit zu erstellen sch, eine Gabel von Paramiko.
Der Artikel geht tiefer in die Tiefe und beschreibt eine vollständig interaktive Shell um exec_command herum. Ich fand das viel einfacher zu verwenden als die Beispiele in der Quelle.
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(server_IP,22,username, password)
stdin, stdout, stderr = ssh.exec_command('/Users/lteue/Downloads/uecontrol-CXC_173_6456-R32A01/uecontrol.sh -host localhost ')
alldata = ""
while not stdout.channel.exit_status_ready():
solo_line = ""
# Print stdout data when available
if stdout.channel.recv_ready():
# Retrieve the first 1024 bytes
solo_line = stdout.channel.recv(1024)
alldata += solo_line
if(cmp(solo_line,'uec> ') ==0 ): #Change Conditionals to your code here
if num_of_input == 0 :
data_buffer = ""
for cmd in commandList :
#print cmd
stdin.channel.send(cmd) # send input commmand 1
num_of_input += 1
if num_of_input == 1 :
stdin.channel.send('q n') # send input commmand 2 , in my code is exit the interactive session, the connect will close.
num_of_input += 1
print alldata
ssh.close()
Warum stdout.read() hängen bleibt, wenn es direkt verwendet wird, ohne stdout.channel.recv_ready() zu überprüfen: in while stdout.channel.exit_status_ready():
In meinem Fall wartet die Sitzung nach dem Ausführungsbefehl auf dem Remote-Server auf Benutzereingaben, nach der Eingabe von ‘q’ wird die Verbindung geschlossen. Aber vor der Eingabe von ‘q’ wartet stdout.read() auf EOF, scheint diese Methode nicht zu funktionieren, wenn der Puffer größer ist.
Ich habe stdout.read(1) in while ausprobiert, es funktioniert
Ich habe stdout.readline() in while ausprobiert, es funktioniert auch.
stdin, stdout, stderr = ssh.exec_command(‘/Benutzer/lteue/Downloads/uecontrol’)
stdout.read() wird hängen bleiben
Ich bin mit Paramiko nicht vertraut, aber das könnte funktionieren:
HINWEIS: Stellen Sie immer sicher, dass Sie jeden Puffer, in den Sie schreiben, so leeren, wie es dieses Beispiel korrekt zeigt; Dies zu vergessen (oder nicht zu wissen), ist eine häufige Ursache für Frustration.
– akulich
28. November 11 um 9:08 Uhr
Pawel Wojtal
Schauen Sie sich das Beispiel an und gehen Sie ähnlich vor
ssh.connect('127.0.0.1', username="jesse",
password='lol')
stdin, stdout, stderr = ssh.exec_command(
"sudo dmesg")
stdin.write('loln')
stdin.flush()
data = stdout.read.splitlines()
for line in data:
if line.split(':')[0] == 'AirPort':
print line
HINWEIS: Stellen Sie immer sicher, dass Sie jeden Puffer, in den Sie schreiben, so leeren, wie es dieses Beispiel korrekt zeigt; Dies zu vergessen (oder nicht zu wissen), ist eine häufige Ursache für Frustration.
– akulich
28. November 11 um 9:08 Uhr
creyD
Sie können diese Methode verwenden, um eine beliebige Bestätigungsnachricht wie “OK” oder das Passwort zu senden. Dies ist meine Lösung mit einem Beispiel:
def SpecialConfirmation(command, message, reply):
net_connect.config_mode() # To enter config mode
net_connect.remote_conn.sendall(str(command)+'n' )
time.sleep(3)
output = net_connect.remote_conn.recv(65535).decode('utf-8')
ReplyAppend=''
if str(message) in output:
for i in range(0,(len(reply))):
ReplyAppend+=str(reply[i])+'n'
net_connect.remote_conn.sendall(ReplyAppend)
output = net_connect.remote_conn.recv(65535).decode('utf-8')
print (output)
return output
CryptoPkiEnroll=['','','no','no','yes']
output=SpecialConfirmation ('crypto pki enroll TCA','Password' , CryptoPkiEnroll )
print (output)
.
5824400cookie-checkInteraktive Befehle in Paramiko ausführenyes
Die Frage ist alt, aber für die Leute, die immer noch über die Google-Suche hierher kommen, möchte ich ihnen diese geben. Der Schlüssel ist, Ihre eigene zu bekommen Kanal Ausführen interaktiver Befehle in Python durch Paramiko Teil 1 Ausführen interaktiver Befehle in Python durch Paramiko Teil 2 In diesen beiden Videos wird erklärt, wie man interaktive Befehle über Paramiko ausführt, besonders das zweite Video ist großartig und wahrscheinlich das, was Sie brauchen.
– Mino_e
26. Januar 15 um 16:50 Uhr