2017-12-27 38 views
0

リモートサーバーにsshして、scpやyumなどのシェルスクリプトを実行します。paramiko SSHClientを使用して継続的に出力する方法

すべてがうまくいったのは、scpの進行状況やyumのダウンロードの進行状況などのsthoutを連続的に取得できないことです。 f.readはブロックされ、何も返されません。

私はparamikoが偽のstdoutストリームを1行ずつ転送するかもしれないが、それらのプログレッシブ出力はラインセパレータではなく '\ r'を出力すると思います。

この問題を解決する方法はありますか。 sshがNバイトが読み込まれたか、EOFを取得するだけ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 

答えて

2

stdout.read(N)戻っているのはここ

は、イムは今doningものです。 stdout.channel.recv(N)は新しいデータが利用可能になるとすぐに戻ります。

これは私のために正常に動作します:

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

それが動作します。ありがとう.. –

関連する問題