Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SSH Python脚本关闭太早_Python_Paramiko - Fatal编程技术网

SSH Python脚本关闭太早

SSH Python脚本关闭太早,python,paramiko,Python,Paramiko,我正在尝试将一个python脚本写入到一个框中,并使用paramiko库运行一个命令。谈到python,我仍在学习过程中,但本练习的目的是在这个程序的基础上进行构建,并在工作场所使用它。 我一直在测试这个程序,到目前为止还不错,但是当脚本将一个命令传递到Linux机器,并且命令需要一段时间才能得到输出时,我的脚本不会返回任何东西。例如,我针对我们的一台存储服务器测试了脚本。我告诉脚本传递到服务器的命令通常会返回一个显示磁盘池碎片的输出。如果我手动SSH到其中一个存储服务器并运行该命令,则该命令运

我正在尝试将一个python脚本写入到一个框中,并使用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代表什么。我以为这是一个延迟

谢谢你的帮助

print ssh_session.recv(99999)
告诉程序接收最多字符数的响应。因此,如果服务器的响应长度为100000,那么程序将只接收前99999个字符,而不是最后一个字符。如果响应小于或等于99999,则程序将打印整个响应

如果希望程序在收到响应之前延迟,可以使用:

import time

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

我对paramiko不太熟悉,但看起来您正在为较低级别的套接字对象获取某种包装,并手动执行操作,即使您获得的
客户机
对象有函数可以为您处理这些操作
recv
看起来像标准的
Socket
调用
recv
,即返回前从Socket读取的字节数

基于pydocs,我建议使用
client.exec\u命令
,其中包括一个超时选项。以下是一些可能有帮助的文档页面:

这里使用的
recv()
方法实际上期望从套接字中获得99999字节。如果在一定时间内(即超时)未提供99999字节,则连接将关闭,并将在此时间内为您提供所提供的字节

这可能就是你目前的处境

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

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

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

现在您应该在变量
output
中有命令的
stdout
。太好了,谢谢你,我会看看如何使用client.exec_命令,然后给你回复!谢谢你,马特。我试图在打印ssh_session.recv(99999)之前延迟,但不幸的是,我仍然有同样的问题。感谢您回答(99999)的含义!谢谢nukacolacolic。我看过你在GitHub上的工作。我仔细考虑了你的建议,把代码改为:
stdin,stdout,stderr=client.exec_命令(command)print stdout.read()
,效果好多了。如果我将“ps”作为命令传递,我将获得完整的输出,但当我使用defrag命令运行它时,它不起作用。我尝试在
打印stdout.read()
之前使用time.sleep(8),但仍然没有任何乐趣。我不知道
碎片整理
命令。您是指
e4defrag
?如果是这样的话,您可以用
-v
试试,这样可以提供详细的输出吗?恐怕不行。该命令是属于IBMs Spectrum Scale SAN的命令。该命令为mmdefragfs mmfs1-i。该命令的输出应显示SAN中磁盘的碎片