Python Paramiko - 在退出之前等待传递命令的更多输出

时间:2018-06-06 18:13:18

标签: python linux ssh paramiko

我有以下代码

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.client.AutoAddPolicy())
privatekeyfile = 'PK_FILE_PATH'
username ="USERNAME"
mykey = paramiko.RSAKey.from_private_key_file(privatekeyfile)
client.connect(hostname= IP, username=username, pkey=mykey)
command = SERVER_COMMAND

stdin, stdout, stderr = client.exec_command(command)
while not stdout.channel.exit_status_ready():
  if stdout.channel.recv_ready():
    stdoutLines = stdout.readlines()
print stdoutLines

我执行的命令大约需要10秒才能在服务器上运行。它最初返回一些信息(用户配置文件和模块版本),然后运行一些代码来检查一些本地服务器资源的状态。

Paramiko在收到初始标头信息后关闭连接。我需要它等待serverside命令的完整输出返回。我尝试过实施tintin's solution here, with the same result

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

  

Paramiko在收到初始标头信息后正在关闭连接。

我认为这不是真的。尝试运行像

这样的命令
command = 'echo first && sleep 60 && echo second'
while not stdout.channel.exit_status_ready():
  if stdout.channel.recv_ready():
    stdoutLines = stdout.readlines()
    print stdoutLines

你会得到两条线(还要注意我在循环中打印线条,所以你可以看到线条)。

一定是你的命令,如:

  • 该命令在stderr上打印最终输出,而不是stdout
  • 在没有TTY的情况下执行时,该命令不会打印最终输出。
  • 该命令是在后台执行子命令的脚本,因此脚本在子命令之前完成。

答案 1 :(得分:1)

添加get_pty=True 这将等到命令执行完成。 stdin,stdout,stderr = self.ssh.exec_command(command,get_pty=True)