2017-12-27 14 views
0

Ich möchte ssh Remote-Server und einige Shell-Skripte (wie scp oder yum etc.) ausführen.Wie bekomme ich kontinuierlich mit Paramiko SSHClient

Alles ging gut, außer dass ich nicht kontinuierlich stdout von etw wie scp Fortschritt oder yum Download-Fortschritt bekommen kann. Die f.read wird blockiert und nichts kehrt zurück.

Ich vermute, Paramiko kann gefälschte Stdout Stream Zeile für Zeile übertragen, aber diese progressiven Ausgaben geben nicht Zeilentrennzeichen aber '\ r' aus.

Gibt es trotzdem dieses Problem zu lösen?

Hier ist, was jetzt im doning, wo ssh ist paramiko.SSHClient()

def read_buffer_line(f): 
    line = "" 
    while not f.channel.exit_status_ready(): 
     c = f.read(1) 
     if c == '\n': 
      yield line 
      line = '' 
     else: 
      line += c 
    yield line + f.read() 

def ssh_run(ssh, cmd): 
    stdin, stdout, sterr = ssh.exec_command(cmd, get_pty=True, bufsize=1) 
    for l in read_buffer_line(stdout): 
     print l 

Antwort

2

stdout.read(N) kehrt nur dann, wenn N Bytes gelesen wurde oder es wird EOF. Die stdout.channel.recv(N) kehrt zurück, sobald neue Daten verfügbar sind.

Dies funktioniert gut für mich:

stdin, stdout, sterr = ssh.exec_command(cmd, get_pty=True) 
while True: 
    v = stdout.channel.recv(1024) 
    if not v: 
     break 
    sys.stdout.write(v) 
    sys.stdout.flush() 
+0

es funktioniert. Vielen Dank.. –

Verwandte Themen