解决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抓取网页图片示例(python爬虫)
Apr 27 Python
以windows service方式运行Python程序的方法
Jun 03 Python
Python实现屏幕截图的代码及函数详解
Oct 01 Python
Python编程实现生成特定范围内不重复多个随机数的2种方法
Apr 14 Python
使用pandas模块读取csv文件和excel表格,并用matplotlib画图的方法
Jun 22 Python
Python如何发布程序的详细教程
Oct 09 Python
python实现证件照换底功能
Aug 20 Python
python自动化工具之pywinauto实例详解
Aug 26 Python
python图形开发GUI库pyqt5的基本使用方法详解
Feb 14 Python
Python3 selenium 实现QQ群接龙自动化功能
Apr 17 Python
解决Jupyter notebook中.py与.ipynb文件的import问题
Apr 21 Python
Python获取字典中某个key的value
Apr 13 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读取目录所有文件信息dir示例
2014/03/18 PHP
PHP IDE PHPStorm配置支持友好Laravel代码提示方法
2015/05/12 PHP
编写PHP脚本过滤用户上传的图片
2015/07/03 PHP
Javascript 复制数组实现代码
2009/11/26 Javascript
javascript 构建一个xmlhttp对象池合理创建和使用xmlhttp对象
2010/01/15 Javascript
Jquery中给animation加更多的运作效果实例
2013/09/05 Javascript
javascript中String对象的slice()方法分析
2014/12/20 Javascript
总结十个Angular.js由浅入深的面试问题
2016/08/26 Javascript
JavaScript探测CSS动画是否已经完成的方法
2016/08/30 Javascript
理解AngularJs篇:30分钟快速掌握AngularJs
2016/12/23 Javascript
jQuery源码分析之sizzle选择器详解
2017/02/13 Javascript
Express+Nodejs 下的登录拦截实现代码
2017/07/01 NodeJs
dropload.js插件下拉刷新和上拉加载使用详解
2017/10/20 Javascript
js技巧之十几行的代码实现vue.watch代码
2018/06/09 Javascript
解决vue中使用proxy配置不同端口和ip接口问题
2019/08/14 Javascript
基于vue和websocket的多人在线聊天室
2020/02/01 Javascript
JS实现简单打字测试
2020/06/24 Javascript
JavaScript实现鼠标经过表格某行时此行变色
2020/11/20 Javascript
python编写分类决策树的代码
2017/12/21 Python
解决python 输出是省略号的问题
2018/04/19 Python
python操作xlsx文件的包openpyxl实例
2018/05/03 Python
Python下调用Linux的Shell命令的方法
2018/06/12 Python
Python3模拟登录操作实例分析
2019/03/12 Python
Python 中 -m 的典型用法、原理解析与发展演变
2019/11/11 Python
解决json中ensure_ascii=False的问题
2020/04/03 Python
详解Django关于StreamingHttpResponse与FileResponse文件下载的最优方法
2021/01/07 Python
会计系中文个人求职信
2013/12/24 职场文书
乡镇信息公开实施方案
2014/03/23 职场文书
治庸问责心得体会
2014/09/12 职场文书
2014企业领导班子四风对照检查材料思想汇报
2014/09/17 职场文书
工作期间打牌检讨书范文
2014/11/20 职场文书
幼儿教师辞职信范文
2015/03/02 职场文书
边城读书笔记
2015/06/29 职场文书
Redis模仿手机验证码发送的实现示例
2021/11/02 Redis
Python中三种花式打印的示例详解
2022/03/19 Python
SQL解决未能删除约束问题drop constraint
2022/05/30 SQL Server