SSH Python脚本关闭太早了

时间:2016-07-30 18:51:32

标签: python paramiko

我正在尝试将一个python脚本编写到SSH框中并使用paramiko库运行命令。当谈到python时,我仍处于学习过程中,但本练习的目的是在此程序的基础上构建并在工作场所使用它。 我一直在测试程序,到目前为止一直很好,但是当脚本将命令传递给Linux框并且命令需要一段时间才能获得输出时,我的脚本不会返回任何内容。例如,我针对我们的一个存储服务器测试了脚本。我告诉脚本传入服务器的命令通常会返回一个输出,显示磁盘池的碎片。如果我要手动SSH到其中一个存储服务器并运行该命令,则通常需要5秒钟才能运行该命令并输出信息。所以我觉得我的python脚本在服务器完全运行命令之前关闭了SSH会话。 所以我的问题是,在关闭会话以试图从命令中获取所有输出之前,告诉脚本延迟的最佳方法是什么?以下是代码片段:

def ssh_command(ip, user, passwd , command):
   client = paramiko.SSHClient()
   client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
   client.connect(ip, username=user, password=passwd)
   ssh_session = client.get_transport().open_session()
   if ssh_session.active:
      ssh_session.exec_command(command)
      print ssh_session.recv(99999)
   return

我试过调整

print ssh_session.recv(99999)

到不同的价值但没有运气。我想我不完全理解这个功能。我知道它的功能告诉脚本将终端命令的输出返回给用户,但我不是100%确定99999代表什么。我以为这是一个延迟。

感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

print ssh_session.recv(99999)

告诉程序接收到该字符限制的响应。因此,如果服务器响应的长度为100,000,则程序将只接收前99,999,而不是最后一个字符。如果响应小于或等于99,999,则程序将打印整个响应。

如果您希望程序在收到回复之前延迟,可以使用:

import time

# do stuff
time.sleep(5) # delay the program for 5 seconds
print ssh_session.recv(99999)
# do more stuff

答案 1 :(得分:0)

我对paramiko并不完全熟悉,但看起来你正在为低级套接字对象获取某种包装,并手动执行操作,即使你得到的client对象具有函数为你照顾这个。 recv看起来像标准Socket调用recv,这是在返回之前从套接字读取的字节数。

根据pydocs,我建议使用client.exec_command,其中包含一个超时选项。以下是一些可能有用的文档页面: http://docs.paramiko.org/en/2.0/api/client.html

答案 2 :(得分:0)

这里使用的recv()方法实际上是期望来自套接字的99999字节。如果在一定时间内没有提供99999字节(即超时),则连接将被关闭,并且您将获得在此时间内提供的字节。

这可能是你情况发生的事情。

我已经编写了一个脚本来使用Paramiko更新多个服务器中的SSH密钥。如果您愿意,可以check it out为例。

在您的情况下,如果您想要运行命令的输出,只需获取在远程会话中执行的命令的stdin,stdout,stderr。

stdin, stdout, stderr = ssh_session.exec_command("ls -l")
output = stdout.readlines()

现在,您应该在变量stdout中拥有该命令的output