使paramiko库执行命令时,在给定的时间强制退出
原因:
使用paramiko库ssh连接到远端云主机上时,非常偶现卡死现象,连接无法退出(可以是执行命令时云主机重启等造成)。需要给定一段时间,不管命令执行是否卡住,都退出连接,显示命令执行超时错误。
实现方式:
线程+事件,在线程中执行ssh命令,给事件配置超时时间。
代码示例:
1 from threading import Thread, Event
2 import paramiko
1 class SshClient(object):
2
3 def __init__(self, ip, port, username, password):
4 self.ip = ip
5 self.host = host
6 self.username = username
7 self.password = password
8
9 def exec_command(cmd, timeout):
10 log.info(u"在ip:%s上执行命令%s" % (self.ip, cmd))
11 sc = paramiko.SSHClient()
12 sc.set_missing_host_key_policy(paramiko.AutoAddPolicy())
13
14 # 用来接收stdout stderror status信息
15 res = [None, None, None]
16
17 def get_return(start_event, res_list):
18 _, cmd_stdout, cmd_stderr = sc.exec_command(command=cmd, timeout=timeout)
19 channel = cmd_stdout.channel
20 cmd_status = channel.recv_exit_status()
21 res_list[0] = cmd_stdout
22 res_list[1] = cmd_stderr
23 res_list[2] = cmd_status
24 start_event.set() # 表示线程已经执行完毕
25
26 try:
27 sc.connect(hostname=self.ip, port=self.port, username=self.username, password=self.password, timeout=30) # 这里的timeout是连接使用的,与我们要的不同
28 start_evt = Event()
29 t = Thread(target=get_return, args=(start_evt, res))
30 t.start()
31 start_evt.wait(timeout=timeout)
32 # 执行到这里说明线程已经退出
33 if None in res:
34 raise Exception(u"命令超时退出")
35 stdout, stderr, status = res
36 if status != 0:
37 raise Exception(u"命令执行返回非0!返回值为%s,错误信息为%s" % (status, stdout.read() + stderr.read()))
38 return stdout.read() + stderr.read()
39 finally:
40 sc.close()
41 }
使paramiko库执行命令时,在给定的时间强制退出的更多相关文章
- PHP 执行命令时sudo权限的配置
PHP 执行命令时sudo权限的配置 1.先写一个PHP文件 <?php system('whoami'); 先看自己的apache2的用户是谁,下面是笔者的截图,笔者使用apche2的用户是w ...
- 远程ssh执行命令时提示找不到命令
最开始的时候碰到这种问题,是在hadoop003上配置了jdk1.8, 在hadoop002上执行ssh hadoop003 java -version提示没有命令,先ssh hadoop003然后执 ...
- Ubuntu执行命令时,不sudo提示权限不足,sudo提示找不到该命令
问题:Ubuntu执行命令时,不sudo提示权限不足,sudo提示找不到该命令 补充描述:尝试将命令所在路径添加到/etc/profile中(所有用户环境变量),结果sudo -i切换到root用户后 ...
- 使用paramiko远程执行命令、下发文件
写部署脚本时,难免涉及到一些远程执行命令或者传输文件. 之前一直使用sh库,调用sh.ssh远程执行一些命令,sh.scp传输文件,但是实际使用中还是比较麻烦的,光是模拟用户登陆这一点,还需要单独定义 ...
- Python学习总结 06 paramiko 远程执行命令
有时会需要在远程的机器上执行一个命令,并获得其返回结果.对于这种情况,python 可以很容易的实现. 1 工具 Python paramiko 1) Paramiko模块安装 在Linux的Term ...
- python之paramiko 远程执行命令
有时会需要在远程的机器上执行一个命令,并获得其返回结果.对于这种情况,python 可以很容易的实现. 1 .工具 Python paramiko 1) Paramiko模块安装 在Linux的Ter ...
- sh脚本变量赋值时同时执行命令时的环境问题
在v2ex看到一个问题: 允许在一个命令之前立即发生一个或多个变量赋值,这些赋值为跟随着的命令更改环境变量,这个赋值的影响是暂时的. 那为什么: int=100 int=10 echo $(($int ...
- Ubuntu在终端执行命令时出现的错误
1.在安装jdk时无意间结束了安装进程,然后就提示这个错误 E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用)E: 无法锁定管理目录(/var/lib/d ...
- python在执行命令时添加环境变量或指定执行路径
cwd: 命令的执行路径,相当于os.chdir('/home')提前切换到对应路径 env: 环境变量,某些执行路径需要添加必须的环境变量,例如fastboot依赖与adb路径下的环境变量 impo ...
随机推荐
- Codeforces Global Round 9 D. Replace by MEX
题目链接:https://codeforces.com/contest/1375/problem/D 题意 给出一个大小为 $n$,元素值位于 $[0,n]$ 之间的数组,每次可以将一个元素替换为数组 ...
- AtCoder Beginner Contest 173
比赛链接:https://atcoder.jp/contests/abc173/tasks A - Payment 题意 计算只用 $1000$ 元支付某个价格 $n$ 的找零是多少. 代码 #inc ...
- 【uva 1610】Party Games(算法效率--构造 dfs)
题意:有一个N个字符串(N≤1000,N为偶数)的集合,要求找一个长度最短的字符串(可不在集合内)S,使得集合中恰好一半的串小于等于S,另一半大于S.如果有多解,要求输出字典序最小的解. 解法:本来我 ...
- hdu4325 Flowers
Problem Description As is known to all, the blooming time and duration varies between different kind ...
- 最小生成树 Prim和Kruskal
感觉挺简单的,Prim和Dijkstra差不多,Kruskal搞个并查集就行了,直接上代码吧,核心思路都是找最小的边. Prim int n,m; int g[N][N]; int u,v; int ...
- Linux 设置简单密码
centos: echo 密码 | passwd --stdin 用户名 ubuntu:(需先设置一个密码) sudo passwd username https://blog.csdn.net/mi ...
- VMware ESXi 开启嵌套虚拟化
VMware ESXi 默认不支持嵌套虚拟化功能,需要修改相关配置文件才能支持. 1.Esxi主机开启ssh,修改 /etc/vmware/config 配置文件,在配置文件后面加入如下配置:vhv. ...
- spring再学习之注解
1.使用注解配置spring <?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi= ...
- 使用 js 实现一个简易版的模版引擎
使用 js 实现一个简易版的模版引擎 regex (function test() { this.str = str; })( window.Test = ...; format() { let ar ...
- React & Special Props Warning
React & Special Props Warning key & ref demo index.js:1 Warning: Comment: key is not a prop. ...