Python SSH没有提供完整的输出

时间:2012-07-09 23:00:19

标签: python ssh paramiko

我正在尝试编写一个登录远程计算机的脚本,运行命令并返回输出。我正在使用paramiko库在python中执行此操作。但是,由于某种原因,没有产生完整的输出,只有它的一行。

为了隔离问题,我创建了一个名为simple的本地脚本,它运行命令并将输出发送到文件remote_test_output.txt。然后我简单地将文件翻过来。该文件仅包含相同的一行。唯一的输出行每次都是相同的:命令的响应代码。

当我手动执行此操作(ssh over,登录和运行./simple)时,它都按预期工作,输出文件正确。但是,通过我的机器上的脚本执行它,它只返回单行。

我的代码:

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变量赋值或者我得到一个库不存在错误。

1 个答案:

答案 0 :(得分: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

只有在那之后才能阅读所有数据。嗯,这就是我猜的。我可能错了,但现在我无法测试我的理论。