Interaktive Befehle in Paramiko ausführen

Lesezeit: 5 Minuten

Interaktive Befehle in Paramiko ausfuhren
Scharmila

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?

ssh = paramiko.SSHClient()
ssh.connect(server, username=username, password=password)
ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command("psql -U factory -d factory -f /tmp/data.sql")

Weiß jemand, wie dies angegangen werden kann? Danke schön.

Interaktive Befehle in Paramiko ausfuhren
James Brady

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

1642808766 664 Interaktive Befehle in Paramiko ausfuhren
afrost

Ich hatte das gleiche Problem beim Versuch, eine interaktive SSH-Sitzung mit zu erstellen sch, eine Gabel von Paramiko.

Ich habe rumgesucht und diesen Artikel gefunden:

Link aktualisiert (letzte Version bevor der Link einen 404 generierte): http://web.archive.org/web/20170912043432/http://jessenoller.com/2009/02/05/ssh-programming-with-paramiko-completely-different/

Um Ihr Beispiel fortzusetzen, könnten Sie tun

ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command("psql -U factory -d factory -f /tmp/data.sql")
ssh_stdin.write('passwordn')
ssh_stdin.flush()
output = ssh_stdout.read()

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.

Ursprünglicher Link: http://jessenoller.com/2009/02/05/ssh-programming-with-paramiko-completely-different/

  • Der Link ist kaputt 🙁

    – Tushar Vazirani

    6. Dezember 17 um 12:37 Uhr

Sie brauchen Pexpect, um das Beste aus beiden Welten zu bekommen (Expect- und SSH-Wrapper).

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:

ssh_stdin.write('input value')
ssh_stdin.flush()

Informationen zu stdin:

http://docs.python.org/library/sys.html?highlight=stdin#sys.stdin

  • 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


1642808767 932 Interaktive Befehle in Paramiko ausfuhren
Pawel Wojtal

Schauen Sie sich das Beispiel an und gehen Sie ähnlich vor

(Quelle aus http://jessenoller.com/2009/02/05/ssh-programming-with-paramiko-completely-different/):

    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


Interaktive Befehle in Paramiko ausfuhren
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)

.

582440cookie-checkInteraktive Befehle in Paramiko ausführen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy