2011-11-08 16 views
10

paramikoで動作するように配管を行うことに問題があります。Paramiko:読み込み中にブロックが永久にブロックされる

これは動作します:

ssh = paramiko.SSHClient() 
[...] 
stdin, stdout, stderr = ssh.exec_command("find /tmp") 
stdout.read() 

このない仕事ん(stdout.readに永遠にブロックを()):

[...] 
stdin, stdout, stderr = ssh.exec_command("bash -") 
stdin.write("find /tmp\n") 
stdin.close() 
stdout.read() 

任意のアイデア?

EDIT:

私はparamikoのソースコードを見て、そしてChannelFile.closeは本当にコミュニケーションの面で何もしません。だから私は、チャネルのAPIを見て、これが動作しているようです:

stdin.write("find /tmp\n") 
stdin.flush() 
stdin.channel.shutdown_write() 
stdout.read() 

答えて

14

いくつかの調査で、stdin.close()が実際にbashのセッションを終了しないことが表示されます。あなたはbashのセッションが別のコマンドのために継続したい場合は、あなたがよ

stdin.channel.shutdown_write() 

:、あなたはbashコマンドexitstdin.write('exit\n'))を使用するか、またはstdinオブジェクトの下にparamiko Channelオブジェクトに掘ることができることを行うために、チャネルオブジェクトを直接使用する必要があります。 documentation for Channelにはrecv_ready(self)recv(self, nbytes)が記載されています。これを取得する前にデータを確認することはできません。

+0

ええ、私は自分自身をすでに理解していましたが、私は自分自身の疑問にまだ答えることはできません: – hmn

+1

BTW、こちらもアドレス:https://github.com/robey/paramiko/pull/43 – hmn

+1

正しいリンクはhttps://github.com/paramiko/paramiko/pull/43になりました –

関連する問題