2016-05-04 46 views
0

私はリアルタイムのSSHライブラリを作成しようとしていますが、通常は物事に執着しているので、私はLong-running ssh commands in python paramiko module (and how to end them)からこのコードを取りました。 しかし、このコードは出力全体を出力しません。Paramikoはすべての出力を読む前にプロセスを終了します

whileループがchannel.exit_status_ready()で終了すると、チャネルにはまだ読み込むデータがあると思います。私はこれを修正しようとしてきましたが、修正はすべての入力にあったわけではありません。

どのようにしてこの種のコマンドをすべて印刷することができますか?

import paramiko 
import select 

client = paramiko.SSHClient() 
client.load_system_host_keys() 
client.connect('host.example.com') 
channel = client.get_transport().open_session() 
channel.exec_command("cd/&& ./test.sh") 
while True: 
    if channel.exit_status_ready(): 
     break 
    rl, wl, xl = select.select([channel], [], [], 0.0) 
    if len(rl) > 0: 
     print channel.recv(1024) 

test.sh:

echo 1 
wait 1 
echo 2 
wait 1 
echo 3 

出力:

1 

2 

Process finished with exit code 0 

感謝。

答えて

1

コマンドで問題を再現できませんでしたが、cat some_big_file.txtのようなコマンドで再現できます。

あなたの仮説が正しいように見えます。終了ステータスは、channelからすべてのものを読み取る前に準備できます。実際にselectを使用する必要があるかどうかは不明です。もしそうでなければ、私はループを書き換えるでしょう:

while True: 
    buf = channel.recv(1024) 
    if not buf: 
     break 
    print buf 

このようなループは、何らかのデータが入っている間、チャンネルを読み続けるでしょう。 selectを実際に使用したい場合は、上記のループをループの直後に置くことができます。残りのデータを読み取り、印刷します。

関連する問題