python paramiko模块中设置执行命令超时值

简介:

经常使用paramiko工具对几百台设备进行管理,但是由于服务器本身或是网络原因,有时返回值回不来,然后程序就看在那里一直等待,这个时候后需要设置一个超时值。paramiko模块中执行命令代码如下:

stdin, stdout , stderr = s.exec_command(command)

   这个地方在模块中只有一个参数,paramiko默认在这个是并不能设置超时值。

其实paramiko本身是可以在这个地方设置超时值的,只是默认情况下是没有这个选项的,需要在paramiko的安装目录中修改他的源代码,让他支持,在代码中是有这个接口的。之所以他没有这个这个超时值,我想是因为开发方考虑有些有些命令可能执行的时间比较长,比如大文件的压缩等,需要很长的时间才能执行完,超时值如果设置的话,有可能会中断命令的执行,索性留下接口,并不设置超时值。但是我们用这个模块批量的去操作多台设备的话,有时超时值是很有必要的。

修改paramiko源代码方法如下:

找到C:\Python27\Lib\site-packages\paramiko目录,下面有个client.py文件,文件中找到这段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def  exec_command( self , command, bufsize = - 1 ):
     """
     Execute a command on the SSH server.  A new L{Channel} is opened and
     the requested command is executed.  The command's input and output
     streams are returned as python C{file}-like objects representing
     stdin, stdout, and stderr.
     @param command: the command to execute
     @type command: str
     @param bufsize: interpreted the same way as by the built-in C{file()} function in python
     @type bufsize: int
     @return: the stdin, stdout, and stderr of the executing command
     @rtype: tuple(L{ChannelFile}, L{ChannelFile}, L{ChannelFile})
     @raise SSHException: if the server fails to execute the command
     """
     chan  =  self ._transport.open_session()
     chan.exec_command(command)
     stdin  =  chan.makefile( 'wb' , bufsize)
     stdout  =  chan.makefile( 'rb' , bufsize)
     stderr  =  chan.makefile_stderr( 'rb' , bufsize)
     return  stdin, stdout, stderr

修改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def  exec_command( self , command, bufsize = - 1 ,timeout  =  None ):
     """
     Execute a command on the SSH server.  A new L{Channel} is opened and
     the requested command is executed.  The command's input and output
     streams are returned as python C{file}-like objects representing
     stdin, stdout, and stderr.
     @param command: the command to execute
     @type command: str
     @param bufsize: interpreted the same way as by the built-in C{file()} function in python
     @type bufsize: int
     @return: the stdin, stdout, and stderr of the executing command
     @rtype: tuple(L{ChannelFile}, L{ChannelFile}, L{ChannelFile})
     @raise SSHException: if the server fails to execute the command
     """
     chan  =  self ._transport.open_session()
     if  timeout  is  not  None :
         chan.settimeout(timeout)
     chan.exec_command(command)
     stdin  =  chan.makefile( 'wb' , bufsize)
     stdout  =  chan.makefile( 'rb' , bufsize)
     stderr  =  chan.makefile_stderr( 'rb' , bufsize)
     return  stdin, stdout, stderr

主要就修改了两个地方:

1、def exec_command(self, command, bufsize=-1,timeout = None)定义时加一个timeout = None;

2、在chan = self._transport.open_session()下面添加一个判断

if timeout is not None:

   chan.settimeout(timeout)


那么在使用paramiko模块执行命令时的代码如下:

stdin, stdout , stderr = s.exec_command(command, timeout=10)

这样就有一个超时值,执行命令的超时时间为10s



本文转自 lover00751CTO博客,原文链接:http://blog.51cto.com/wangwei007/1212492,如需转载请自行联系原作者

相关文章
|
4天前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。
|
14天前
|
Python
在Python中,可以使用内置的`re`模块来处理正则表达式
在Python中,可以使用内置的`re`模块来处理正则表达式
35 5
|
24天前
|
Java 程序员 开发者
Python的gc模块
Python的gc模块
|
27天前
|
数据采集 Web App开发 JavaScript
python-selenium模块详解!!!
Selenium 是一个强大的自动化测试工具,支持 Python 调用浏览器进行网页抓取。本文介绍了 Selenium 的安装、基本使用、元素定位、高级操作等内容。主要内容包括:发送请求、加载网页、元素定位、处理 Cookie、无头浏览器设置、页面等待、窗口和 iframe 切换等。通过示例代码帮助读者快速掌握 Selenium 的核心功能。
81 5
|
28天前
|
Python
SciPy 教程 之 SciPy 模块列表 13
SciPy教程之SciPy模块列表13:单位类型。常量模块包含多种单位,如公制、二进制(字节)、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例代码展示了如何使用`constants`模块获取零摄氏度对应的开尔文值(273.15)和华氏度与摄氏度的转换系数(0.5556)。
18 1
|
26天前
|
Python
SciPy 教程 之 SciPy 模块列表 16
SciPy教程之SciPy模块列表16 - 单位类型。常量模块包含多种单位,如公制、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例代码展示了力学单位的使用,如牛顿、磅力和千克力等。
17 0
|
27天前
|
JavaScript Python
SciPy 教程 之 SciPy 模块列表 15
SciPy 教程之 SciPy 模块列表 15 - 功率单位。常量模块包含多种单位,如公制、质量、时间等。功率单位中,1 瓦特定义为 1 焦耳/秒,表示每秒转换或耗散的能量速率。示例代码展示了如何使用 `constants` 模块获取马力值(745.6998715822701)。
16 0
|
27天前
|
JavaScript Python
SciPy 教程 之 SciPy 模块列表 15
SciPy教程之SciPy模块列表15:单位类型。常量模块包含多种单位,如公制、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。功率单位以瓦特(W)表示,1W=1J/s。示例代码展示了如何使用`constants`模块获取马力(hp)的值,结果为745.6998715822701。
18 0
|
28天前
|
Python
SciPy 教程 之 SciPy 模块列表 13
SciPy 教程之 SciPy 模块列表 13 - 单位类型。常量模块包含多种单位:公制、二进制(字节)、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例:`constants.zero_Celsius` 返回 273.15 开尔文,`constants.degree_Fahrenheit` 返回 0.5555555555555556。
14 0
|
29天前
|
Python
SciPy 教程 之 SciPy 模块列表 11
SciPy教程之SciPy模块列表11:单位类型。常量模块包含公制单位、质量单位、角度换算、时间单位、长度单位、压强单位、体积单位、速度单位、温度单位、能量单位、功率单位、力学单位等。体积单位示例展示了不同体积单位的换算,如升、加仑、流体盎司、桶等。
25 0
下一篇
无影云桌面