我正在尝试编写一个登录远程计算机的脚本,运行命令并返回输出。我正在使用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变量赋值或者我得到一个库不存在错误。
答案 0 :(得分:0)
根据paramiko的文档," exec_command"方法返回一个Channel对象。第一个问题:您是否尝试将bufsize参数设置为1? Channel对象"表现得像一个套接字"。所以在文档中说:
这意味着recv()(以及可能的read())只会读取读缓冲区中的数据。因此,每当read()调用返回时,并不意味着该进程已在远程端执行。您应该使用exit_status_ready()方法来检查您的命令是否已执行:
http://www.lag.net/paramiko/docs/paramiko.Channel-class.html#exit_status_ready
只有在那之后才能阅读所有数据。嗯,这就是我猜的。我可能错了,但现在我无法测试我的理论。