解决paramiko执行命令超时的问题


Posted in Python onApril 16, 2020

问题:paramiko远程执行命令,需要等到命令返回信息,如果命令执行时间比较长,返回信息就需要等很久

方案:

1、使用nohup + 待执行命令 + & ,使用后台执行的方式,应该可以快速返回

2、设置paramiko的执行命令等待超时时间

stdin, stdout, stderr = self.client.exec_command(cmd,timeout=10,get_pty=True)

其实上面的两种方案都不可行:方案1,需要优化,下面这种直接调用的方式会导致test.sh启动不起来

stdin, stdout, stderr = self.client.exec_command(‘sh ~/test.sh &',get_pty=True)

方案2,对于需要等待很久的命令,如果timeout小于程序的执行时间,还是会失败,命令执行失败

最终的解决方案来自参考1

把执行很久的sh文件A放入另一个sh文件B中,然后paramiko执行文件B。摘录原文:

paramiko远程执行后台脚本“阻塞”问题

我写的远程命令通道上线之后,发现在远程脚本中后台再执行另一个脚本,通道会一直等待后台脚本执行完成才会返回,有时甚至会僵死。

1、复现过程如下:

①、编写测试脚本

脚本1:test.sh

#!/bin/bash
sleep 30
echo test end
exit 0

脚本2:run.sh

#!/bin/bash
bash /tmp/test.sh &
echo run ok!
exit 0

脚本3:test.py

import paramiko
client = paramiko.SSHClient()
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname='192.168.1.10', port=22, username='root', password='123456', timeout=300,allow_agent=False,look_for_keys=False)       
stdin,stdout,stderr=client.exec_command("bash /tmp/run.sh") 
            
result_info = ""

for line in stdout.readlines():
 result_info += line

print result_info

将test.sh和run.sh传到远程服务器上,比如放到192.168.1.10:/tmp/下。

②、发起远程执行

在本地执行 python test.py,会发现整个脚本不会立即打印run ok,而是等30s之后才打印包括test.sh的所有输出信息。

2、解决办法

将远程脚本的标准输出stdout重定向到错误输出stderr即可,test.py 修改如下:

import paramiko
client = paramiko.SSHClient()
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname='192.168.1.10', port=22, username='root', password='123456', timeout=300,allow_agent=False,look_for_keys=False)       
stdin,stdout,stderr=client.exec_command("bash /tmp/run.sh 1>&2") 
            
result_info = ""

for line in stderr.readlines():
 result_info += line

print result_info

现在执行,就能立即得到结果了。其实原因很简单,因为bash /tmp/test.sh & 虽然是后台执行,但是依然会产生标准输出,一旦产生标准输出,paramiko就会认为命令还未执行完成,且stdout的buffer大于stderr,因此产生等待问题。

这里只要将脚本执行的标准输出重定向到错误输出(1>&2),然后paramiko就可以使用stderr快速读取远程打屏信息了。

基于上面paramiko的原理:有stdout输出,就认为命令没有执行完成。得出下面的解决方案,对于需要执行很久test.sh,我们首先把标准输出都发给标准错误输出(1>&2),然后后台启动(&)

stdin, stdout, stderr = self.client.exec_command(‘bash ~/test.sh 1>&2 &',get_pty=True)

项目实践,还有下面的方案:去掉参数get_pty,这样就不会回传标准输出信息和标准错误信息

self.client.exec_command(‘bash ~/test.sh')

以上这篇解决paramiko执行命令超时的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python sys模块sys.path使用方法示例
Dec 04 Python
简单介绍Python中的round()方法
May 15 Python
tensorflow 打印内存中的变量方法
Jul 30 Python
python3.6 如何将list存入txt后再读出list的方法
Jul 02 Python
Python udp网络程序实现发送、接收数据功能示例
Dec 09 Python
Python3直接爬取图片URL并保存示例
Dec 18 Python
python GUI库图形界面开发之PyQt5控件QTableWidget详细使用方法与属性
Feb 25 Python
parser.add_argument中的action使用
Apr 20 Python
Java爬虫技术框架之Heritrix框架详解
Jul 22 Python
Python 如何操作 SQLite 数据库
Aug 17 Python
Python类绑定方法及非绑定方法实例解析
Oct 09 Python
Python编写万花尺图案实例
Jan 03 Python
python nohup 实现远程运行不宕机操作
Apr 16 #Python
通过python 执行 nohup 不生效的解决
Apr 16 #Python
在python中使用nohup命令说明
Apr 16 #Python
VS2019+python3.7+opencv4.1+tensorflow1.13配置详解
Apr 16 #Python
python实现程序重启和系统重启方式
Apr 16 #Python
Mac PyCharm中的.gitignore 安装设置教程
Apr 16 #Python
jupyter notebook 重装教程
Apr 16 #Python
You might like
利用PHP实现与ASP Banner组件相似的类
2006/10/09 PHP
PHP实现利用MySQL保存session的方法
2014/08/23 PHP
使用php方法curl抓取AJAX异步内容思路分析及代码分享
2014/08/25 PHP
php实现表单多按钮提交action的处理方法
2015/10/24 PHP
CI框架扩展系统核心类的方法分析
2016/05/23 PHP
jQuery实现图片信息的浮动显示实例代码
2013/08/28 Javascript
jquery如何实现在加载完iframe的内容后再进行操作
2013/09/10 Javascript
AngularJs bootstrap搭载前台框架——基础页面
2016/09/01 Javascript
将html页面保存成图片,图片写入pdf的实现方法(推荐)
2016/09/17 Javascript
bootstrap table 数据表格行内修改的实现代码
2017/02/13 Javascript
jQury Ajax使用Token验证身份实例代码
2017/09/22 Javascript
详解vue-cli 本地开发mock数据使用方法
2018/05/29 Javascript
详解微信小程序的 request 封装示例
2018/08/21 Javascript
vue的过滤器filter实例详解
2018/09/17 Javascript
微信小程序如何刷新当前界面的实现方法
2019/06/07 Javascript
vue+mock.js实现前后端分离
2019/07/24 Javascript
Vue项目移动端滚动穿透问题的实现
2020/05/19 Javascript
vue基于better-scroll仿京东分类列表
2020/06/30 Javascript
python数据结构之二叉树的统计与转换实例
2014/04/29 Python
在Python下使用Txt2Html实现网页过滤代理的教程
2015/04/11 Python
python解决方案:WindowsError: [Error 2]
2016/08/28 Python
python负载均衡的简单实现方法
2018/02/04 Python
Python Requests模拟登录实现图书馆座位自动预约
2018/04/27 Python
python循环定时中断执行某一段程序的实例
2019/06/29 Python
python中翻译功能translate模块实现方法
2020/12/17 Python
时尚的CSS3进度条效果
2012/02/22 HTML / CSS
金属材料工程个人求职的自我评价
2013/12/04 职场文书
十佳班主任事迹材料
2014/01/18 职场文书
年终总结会主持词
2014/03/25 职场文书
普通话演讲稿
2014/09/03 职场文书
办护照工作证明
2014/10/01 职场文书
工作检讨书500字
2014/10/19 职场文书
大专护理专业自荐信
2015/03/25 职场文书
大学生社会实践感想
2015/08/11 职场文书
Nginx的rewrite模块详解
2021/03/31 Servers
div与span之间的区别与使用介绍
2021/12/06 HTML / CSS