4

paramiko チャネルをインスタンス化してから、コマンドを実行して出力を取得します。

channel = transport.open_session()
channel.exec_command('service myservice restart')

stdout = channel.makefile('rb')

for line in stdout:
    print line,

ただし、コマンドを実行した後 (終了)、出力の繰り返しがブロックされます。

私はsshでテストしました:

ssh myhost service myservice restart     # terminal gets blocked
ssh -t myhost service myservice restart  # OK

そこで、paramiko で「-t」オプションをシミュレートしたいと思います。これまでのところ、私は試しました:

channel = transport.open_session()
channel.get_pty()
channel.invoke_shell()

stdin, stdout = channel.makefile('wb'), channel.makefile('rb')
stdin.write('service myservice restart\n')

for line in stdout:
    print line,

しかし、現在、stdout は閉じられず、for は決して終了しません。

何か案は?

4

2 に答える 2

0

invoke_shell()を返すようChannelに見えますが、Channel明示的に閉じる必要があるようです。あなたが開いているチャネルのいくつか、特に によって返されたチャネルを閉じようとしますinvoke_shell()

于 2012-12-16T17:29:16.127 に答える
-1

実行しようとしているスクリプトを見てください。このような行があるかどうかを確認してください。

/dev/null 2>&1

私はあなたと同じ問題を抱えています-私の場合、ビットナミ制御スクリプトをリモートで実行しようとしています。あなたの投稿の何かが私の記憶を揺さぶり、制御スクリプトにある出力リダイレクトを思い出させました (これらは以前に大きな頭痛の種でした)。

一般的に、それらはエラーを無視するか、特定の場所にログを記録するために使用されます-私はまだ試す機会がありませんでしたが、スクリプトの最後にそれらをパイプアウトするか、応答を気にしない場合は、作成されたものを手動でリダイレクトすることさえありますdata out >&2 が機能します。

于 2013-05-14T19:24:08.317 に答える