解决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实现一个简单的能够发送带附件的邮件程序的教程
Apr 08 Python
Python中is与==判断的区别
Mar 28 Python
python图像常规操作
Nov 11 Python
AI人工智能 Python实现人机对话
Nov 13 Python
python读取LMDB中图像的方法
Jul 02 Python
python整小时 整天时间戳获取算法示例
Feb 20 Python
Python利用sqlacodegen自动生成ORM实体类示例
Jun 04 Python
python爬虫神器Pyppeteer入门及使用
Jul 13 Python
Python自动巡检H3C交换机实现过程解析
Aug 14 Python
Python如何使用ElementTree解析xml
Oct 12 Python
Python语言编写智力问答小游戏功能
Oct 13 Python
如何在 Matplotlib 中更改绘图背景的实现
Nov 26 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
mysql 全文搜索 技巧
2007/04/27 PHP
在PHP中PDO解决中文乱码问题的一些补充
2010/09/06 PHP
网站用php实现paypal整合方法
2010/11/28 PHP
php高级编程-函数-郑阿奇
2011/07/04 PHP
一个简洁的PHP可逆加密函数(分享)
2013/06/06 PHP
MacOS 安装 PHP的图片裁剪扩展Tclip
2015/03/25 PHP
PHP使用fopen与file_get_contents读取文件实例分享
2016/03/04 PHP
CI框架实现优化文件上传及多文件上传的方法
2017/01/04 PHP
PHP基于timestamp和nonce实现的防止重放攻击方案分析
2019/07/26 PHP
一个可以显示阴历的JS代码
2007/03/05 Javascript
JavaScript实现的购物车效果可以运用在好多地方
2014/05/09 Javascript
javascript定时器完整实例
2015/02/10 Javascript
js实现模拟银行卡账号输入显示效果
2015/11/18 Javascript
JavaScript制作简单的日历效果
2016/03/10 Javascript
新入门node.js必须要知道的概念(必看篇)
2016/08/10 Javascript
jQuery Ajax Post 回调函数不执行问题的解决方法
2016/08/15 Javascript
简单的jQuery拖拽排序效果的实现(增强动态)
2017/02/09 Javascript
原生js实现秒表计时器功能
2017/02/16 Javascript
JS匹配日期和时间的正则表达式示例
2017/05/12 Javascript
JavaScript实现的搜索及高亮显示功能示例
2017/08/14 Javascript
微信小程序结合mock.js实现后台模拟及调试
2019/03/28 Javascript
Node.js API详解之 console模块用法详解
2020/05/12 Javascript
vue模块移动组件的实现示例
2020/05/20 Javascript
JavaScript类的继承多种实现方法
2020/05/30 Javascript
在ubuntu16.04中将python3设置为默认的命令写法
2018/10/31 Python
Python3.5运算符操作实例详解
2019/04/25 Python
python numpy 反转 reverse示例
2019/12/04 Python
TensorFlow Saver:保存和读取模型参数.ckpt实例
2020/02/10 Python
python 判断txt每行内容中是否包含子串并重新写入保存的实例
2020/03/12 Python
通俗易懂了解Python装饰器原理
2020/09/17 Python
澳大利亚宠物商店:Petbarn
2017/11/18 全球购物
Peter Millar官网:美国高档生活服饰品牌
2018/07/02 全球购物
Boolean b = new Boolean(“abcde”); 会编译错误码
2013/11/27 面试题
销售人员获奖感言
2014/02/05 职场文书
创业者迈进成功第一步:如何写创业计划书?
2014/03/22 职场文书
公务员群众路线专题民主生活会发言材料
2014/09/17 职场文书