使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中利用Scipy包的SIFT方法进行图片识别的实例教程
Jun 03 Python
Python读写Json涉及到中文的处理方法
Sep 12 Python
Python 使用SMTP发送邮件的代码小结
Sep 21 Python
Python代码实现KNN算法
Dec 20 Python
Python之Scrapy爬虫框架安装及简单使用详解
Dec 22 Python
python3.4实现邮件发送功能
May 28 Python
解决pyqt5中QToolButton无法使用的问题
Jun 21 Python
Django 反向生成url实例详解
Jul 30 Python
Python numpy矩阵处理运算工具用法汇总
Jul 13 Python
python时间序列数据转为timestamp格式的方法
Aug 03 Python
Python中实现一行拆多行和多行并一行的示例代码
Sep 06 Python
在 Python 中使用 7zip 备份文件的操作
Dec 11 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
PHP新手用的Insert和Update语句构造类
2012/03/31 PHP
php中的动态调用实例分析
2015/01/07 PHP
学习jquery之一
2007/04/27 Javascript
ExtJS 设置级联菜单的默认值
2010/06/13 Javascript
使用js实现雪花飘落效果
2013/08/26 Javascript
推荐5 个常用的JavaScript调试技巧
2015/01/08 Javascript
Js实现中国公民身份证号码有效性验证实例代码
2017/05/03 Javascript
原生JS上传大文件显示进度条 php上传文件代码
2020/03/27 Javascript
图文介绍Vue父组件向子组件传值
2018/02/17 Javascript
微信小程序自定义头部导航栏和导航栏背景图片 navigationStyle问题
2019/07/26 Javascript
js实现网页版贪吃蛇游戏
2020/02/22 Javascript
JS中作用域以及变量范围分析
2020/07/18 Javascript
three.js 利用uv和ThreeBSP制作一个快递柜功能
2020/08/18 Javascript
浅谈JSON5解决了JSON的两大痛点
2020/12/14 Javascript
Python多进程机制实例详解
2015/07/02 Python
Python切换pip安装源的方法详解
2016/11/18 Python
python清除函数占用的内存方法
2018/06/25 Python
pygame游戏之旅 添加游戏界面按键图形
2018/11/20 Python
python web自制框架之接受url传递过来的参数实例
2018/12/17 Python
Python递归函数 二分查找算法实现解析
2019/08/12 Python
Python实现投影法分割图像示例(二)
2020/01/17 Python
python在CMD界面读取excel所有数据的示例
2020/09/28 Python
基于pycharm 项目和项目文件命名规则的介绍
2021/01/15 Python
CSS3制作圆角图片和椭圆形图片
2016/07/08 HTML / CSS
HTML5中的进度条progress元素简介及兼容性处理
2016/06/02 HTML / CSS
惠普美国官方商店:HP Official Store
2016/08/28 全球购物
几个Linux面试题笔试题
2012/12/01 面试题
十岁生日父母答谢词
2014/01/18 职场文书
毕业实习评语
2014/02/10 职场文书
年终晚会主持词
2014/03/25 职场文书
红色经典观后感
2015/06/18 职场文书
2015年工会工作总结范文
2015/07/23 职场文书
教师廉政准则心得体会
2016/01/20 职场文书
anaconda python3.8安装后降级
2021/06/11 Python
Spring Boot两种全局配置和两种注解的操作方法
2021/06/29 Java/Android
vue el-table实现递归嵌套的示例代码
2022/08/14 Vue.js