2

リモート マシンにログオンし、コマンドを実行して出力を返すスクリプトを作成しようとしています。paramiko ライブラリを使用して、Python でこれを行っています。ただし、何らかの理由で完全な出力が生成されず、1 行しか生成されません。

問題を切り分けるために、simple という名前のローカル スクリプトを作成しました。このスクリプトはコマンドを実行し、出力をファイル remote_test_output.txt に送信します。次に、代わりにファイルを単純に sftp します。ファイルには同じ 1 行しか含まれていませんでした。出力の唯一の行は毎回同じです: コマンドの応答コードです。

これをすべて手動で行うと(sshでログインし、./simpleを実行します)、すべて意図したとおりに機能し、出力ファイルは正しいです。ただし、私のマシンのスクリプトを使用して実行すると、1行しか返されません。

私のコード:

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.load_host_keys(os.path.expanduser(os.path.join("~", ".ssh", "known_hosts")))
ssh.connect(host, username, password)

ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command('LD_LIBRARY_PATH=/opt/bin ./simple\n')

print "output:", ssh_stdout.read()+"end" #Reading output of the executed command
print "err:", ssh_stderr.read()#Reading the error stream of the executed command


sftp = ssh.open_sftp()
sftp.get('remote_test_output.txt', 'local_test_output.txt')
sftp.close()

返されるもの:

response code: 128

返すべきもの:

field1:value1
field2:value2
response code: 128
field3:value3
field4:value4
etc

私が呼び出そうとしているコマンドが正常に出力されない理由は誰にもわかりますか?

LD_LIBRARY_PATH 変数の割り当てを含める必要があります。そうしないと、ライブラリが存在しないというエラーが発生します。

4

1 に答える 1

0

paramiko のドキュメントによると、「exec_command」メソッドは Channel オブジェクトを返します。最初の質問: bufsize パラメーターを 1 に設定しようとしましたか? Channel オブジェクトは「ソケットのように動作します」。したがって、ドキュメントには次のように記載されています。

http://www.facebook.com/photo.php?fbid=149324975212197&set=a.128010850676943.34896.126277080850320&type=1&ref=nf

これは、recv() (および場合によっては read()) が読み取りバッファーにあるデータのみを読み取ることを意味します。したがって、 read() 呼び出しが返されるたびに、プロセスがリモート側で既に実行されていることを意味するわけではありません。コマンドが実行されたかどうかを確認するには、 exit_status_ready() メソッドを使用する必要があります。

http://www.lag.net/paramiko/docs/paramiko.Channel-class.html#exit_status_ready

その後、すべてのデータを読み取ることができます。まあ、これは私が推測するものです。私は間違っているかもしれませんが、今のところ自分の理論を検証することはできません.

于 2012-09-28T09:08:51.143 に答える