使paramiko库执行命令时在给定的时间强制退出功能的实现


Posted in Python onMarch 03, 2021

使用paramiko库ssh连接到远端云主机上时,非常偶现卡死现象,连接无法退出(可以是执行命令时云主机重启等造成)。需要给定一段时间,不管命令执行是否卡住,都退出连接,显示命令执行超时错误。

实现方式:

线程+事件,在线程中执行ssh命令,给事件配置超时时间。

代码示例:

1 from threading import Thread, Event

2 import paramiko

class SshClient(object):

  def __init__(self, ip, port, username, password):
    self.ip = ip
    self.host = host
    self.username = username
    self.password = password

  def exec_command(cmd, timeout):
    log.info(u"在ip:%s上执行命令%s" % (self.ip, cmd))
    sc = paramiko.SSHClient()
    sc.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    # 用来接收stdout stderror status信息
    res = [None, None, None]

    def get_return(start_event, res_list):
      _, cmd_stdout, cmd_stderr = sc.exec_command(command=cmd, timeout=timeout)
      channel = cmd_stdout.channel
      cmd_status = channel.recv_exit_status()
      res_list[0] = cmd_stdout
      res_list[1] = cmd_stderr
      res_list[2] = cmd_status
      start_event.set()  # 表示线程已经执行完毕

    try:
      sc.connect(hostname=self.ip, port=self.port, username=self.username, password=self.password, timeout=30)  # 这里的timeout是连接使用的,与我们要的不同
      start_evt = Event()
      t = Thread(target=get_return, args=(start_evt, res))
      t.start()
      start_evt.wait(timeout=timeout)
      # 执行到这里说明线程已经退出
      if None in res:
        raise Exception(u"命令超时退出")
      stdout, stderr, status = res
      if status != 0:
        raise Exception(u"命令执行返回非0!返回值为%s,错误信息为%s" % (status, stdout.read() + stderr.read()))
      return stdout.read() + stderr.read()
    finally:
      sc.close()
}

知识点补充:

python paramiko的使用介绍

一: 使用paramiko

#设置ssh连接的远程主机地址和端口
t=paramiko.Transport((ip,port))
#设置登录名和密码
t.connect(username=username,password=password)
#连接成功后打开一个channel
chan=t.open_session()
#设置会话超时时间
chan.settimeout(session_timeout)
#打开远程的terminal
chan.get_pty()
#激活terminal
chan.invoke_shell()

然后就可以通过chan.send('command')和chan.recv(recv_buffer)来远程执行命令以及本地获取反馈。

 二: paramiko的两个模块介绍

paramiko有两个模块SSHClient()和SFTPClient()

SSHClient()的使用代码:

import paramiko

ssh = paramiko.SSHClient() # 创建SSH对象
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='192.168.2.103', port=22, username='root', password='123456')

stdin, stdout, stderr = ssh.exec_command('ls') # 执行命令
result = stdout.read() # 获取命令结果
print (str(result,encoding='utf-8'))
ssh.close() # 关闭连接

SSHClient()里有个transport变量,是用于获取连接,我们也可单独的获取到transport变量,然后执行连接操作

import paramiko

transport = paramiko.Transport(('192.168.2.103', 22))
transport.connect(username='root', password='123456')

ssh = paramiko.SSHClient()
ssh._transport = transport

stdin, stdout, stderr = ssh.exec_command('df')
print (str(stdout.read(),encoding='utf-8'))

transport.close()

用transport实现上传下载以及命令的执行:

#coding:utf-8
import paramiko
import uuid

class SSHConnection(object):

def __init__(self, host='192.168.2.103', port=22, username='root',pwd='123456'):
self.host = host
self.port = port
self.username = username
self.pwd = pwd
self.__k = None

def connect(self):
transport = paramiko.Transport((self.host,self.port))
transport.connect(username=self.username,password=self.pwd)
self.__transport = transport

def close(self):
self.__transport.close()

def upload(self,local_path,target_path):
# 连接,上传
# file_name = self.create_file()
sftp = paramiko.SFTPClient.from_transport(self.__transport)
# 将location.py 上传至服务器 /tmp/test.py
sftp.put(local_path, target_path)

def download(self,remote_path,local_path):
sftp = paramiko.SFTPClient.from_transport(self.__transport)
sftp.get(remote_path,local_path)

def cmd(self, command):
ssh = paramiko.SSHClient()
ssh._transport = self.__transport
# 执行命令
stdin, stdout, stderr = ssh.exec_command(command)
# 获取命令结果
result = stdout.read()
print (str(result,encoding='utf-8'))
return result

ssh = SSHConnection()
ssh.connect()
ssh.cmd("ls")
ssh.upload('s1.py','/tmp/ks77.py')
ssh.download('/tmp/test.py','kkkk',)
ssh.cmd("df")
ssh.close()

到此这篇关于使paramiko库执行命令时,在给定的时间强制退出的文章就介绍到这了,更多相关paramiko库执行命令内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python数组条件过滤filter函数使用示例
Jul 22 Python
python中类的一些方法分析
Sep 25 Python
在Python中操作时间之tzset()方法的使用教程
May 22 Python
Python中表达式x += y和x = x+y 的区别详解
Jun 20 Python
django 常用orm操作详解
Sep 13 Python
python版微信跳一跳游戏辅助
Jan 11 Python
Python玩转Excel的读写改实例
Feb 22 Python
python中yield的用法详解——最简单,最清晰的解释
Apr 04 Python
用openCV和Python 实现图片对比,并标识出不同点的方式
Dec 19 Python
pytorch 模拟关系拟合——回归实例
Jan 14 Python
浅析Python 条件控制语句
Jul 15 Python
linux中nohup和后台运行进程查看及终止
Jun 24 Python
python上下文管理的使用场景实例讲解
Mar 03 #Python
pip install命令安装扩展库整理
Mar 02 #Python
python实现杨辉三角的几种方法代码实例
Mar 02 #Python
python爬虫破解字体加密案例详解
Mar 02 #Python
python包的导入方式总结
Mar 02 #Python
numpy实现RNN原理实现
Mar 02 #Python
解决tensorflow模型压缩的问题_踩坑无数,总算搞定
Mar 02 #Python
You might like
Windows下PHP5和Apache的安装与配置
2006/09/05 PHP
PHP生成UTF8文件的方法
2010/05/15 PHP
PHP生成随机字符串(3种方法)
2015/09/25 PHP
在Ubuntu上安装最新版本的Node.js
2014/07/14 Javascript
jquery实现的Accordion折叠面板效果代码
2015/09/02 Javascript
jQuery实现简洁的导航菜单效果
2015/11/23 Javascript
小心!AngularJS结合RequireJS做文件合并压缩的那些坑
2016/01/09 Javascript
通过jquery-ui中的sortable来实现拖拽排序的简单实例
2016/05/24 Javascript
JavaScript实现移动端滑动选择日期功能
2016/06/21 Javascript
EasyUI Pagination 分页的两种做法小结
2016/07/09 Javascript
浅析Ajax语法
2016/12/05 Javascript
微信小程序封装http访问网络库实例代码
2017/05/24 Javascript
详解Node项目部署到云服务器上
2017/07/12 Javascript
使用OPENLAYERS3实现点选的方法
2020/09/24 Javascript
VUEX-action可以修改state吗
2019/11/19 Javascript
vue实现淘宝购物车功能
2020/04/20 Javascript
ajax jquery实现页面某一个div的刷新效果
2021/03/04 jQuery
Python 关于反射和类的特殊成员方法
2017/09/14 Python
Python3 Tkinter选择路径功能的实现方法
2019/06/14 Python
PyQt5实现QLineEdit添加clicked信号的方法
2019/06/25 Python
Python如何使用OS模块调用cmd
2020/02/27 Python
python批量替换文件名中的共同字符实例
2020/03/05 Python
波兰家具和室内装饰品购物网站:Vivre
2018/04/10 全球购物
 Alo Yoga官网:购买瑜伽服装
2018/06/17 全球购物
乌克兰最大的家用电器和电子产品连锁店:Eldorado
2019/10/02 全球购物
SQL数据库笔试题
2016/03/08 面试题
应届实习生的自我评价范文
2014/01/05 职场文书
群众路线剖析材料
2014/02/02 职场文书
酒店行政人事部经理职务说明书
2014/02/26 职场文书
我的祖国演讲稿
2014/05/04 职场文书
社会实践先进工作者事迹材料
2014/05/06 职场文书
奉献家乡演讲稿
2014/09/13 职场文书
2016入党积极分子党课学习心得体会
2015/10/09 职场文书
2016年教师党员创先争优承诺书
2016/03/24 职场文书
教你使用pyinstaller打包Python教程
2021/05/27 Python
Oracle删除归档日志及添加定时任务
2022/06/28 Oracle