Paramiko,exec_command连续获取输出流

时间:2015-07-09 12:14:58

标签: python python-3.x paramiko

我在Python脚本上干了。我为给定的IP创建一个python脚本将通过Paramiko连接到服务器以执行另一个Python脚本。

以下是一些代码:

self._client = paramiko.SSHClient()
self._client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self._client.connect(self._ip, username=self._server['username'], password=self._server['password'])
channel = self._client.get_transport().open_session()
channel.exec_command('python3 /tmp/scrap.py /tmp/' + self._ip + '.txt 0 1')

脚本" scrap.py"在远程机器的控制台中每隔X秒返回一行,但我无法在上面的脚本中(在exec_command(...)的出口处)这些行恢复。

这可能吗?如果有,你知道怎么做?

提前谢谢。

4 个答案:

答案 0 :(得分:2)

这应该可以解决问题:

ValidTO

如读([size])文档中所指定的,如果您没有指定大小,它将读取直到EOF,这使得脚本等待命令结束,然后从read()返回并打印任何输出

答案 1 :(得分:1)

我不确定我的paramiko版本是否已过时,但 Lukas N.P. Egger 解决方案对我没有用,因为channel.exec_command没有返回三件事,只有一件。这对我有用:

print 'connecting'
transport = paramiko.Transport((IP_ADDRESS, 22))
transport.connect(username='USERNAME', password='PASSWORD')
print 'opening ssh channel'
channel = transport.open_session()
channel.set_combine_stderr(1)
channel.exec_command('cd render && python render.py')
while True:
  if channel.exit_status_ready():
    if channel.recv_ready():
      print 'done generating graph'
      break
  sys.stdout.write(channel.recv(1))
print 'closing ssh channel'
channel.close()

答案 2 :(得分:0)

对我有用的东西:
在您的readline-print循环中使用:sys.stdout.flush()

答案 3 :(得分:0)

我发现以下代码对我有用:

stdin,stdout,stderr = ssh.exec_command("YOUR DASH COMMAND")
while True:
    line = stdout.readline()
    if not line:
        break
    print(line.replace("\n",""))