使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操作MySQL数据库9个实用实例
Dec 11 Python
Python3 循环语句(for、while、break、range等)
Nov 20 Python
Python实现判断一个字符串是否包含子串的方法总结
Nov 21 Python
python获取程序执行文件路径的方法(推荐)
Apr 26 Python
python使用插值法画出平滑曲线
Dec 15 Python
Python中pymysql 模块的使用详解
Aug 12 Python
利用Python绘制有趣的万圣节南瓜怪效果
Oct 31 Python
Django admin禁用编辑链接和添加删除操作详解
Nov 15 Python
python使用pandas抽样训练数据中某个类别实例
Feb 28 Python
jupyter修改文件名方式(TensorFlow)
Apr 21 Python
Python txt文件常用读写操作代码实例
Aug 03 Python
学习Python需要哪些工具
Sep 04 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脚本的10个技巧(6)
2006/10/09 PHP
php面向对象全攻略 (十六) 对象的串行化
2009/09/30 PHP
PHP解决URL中文GBK乱码问题的两种方法
2014/06/03 PHP
详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
2015/07/31 PHP
thinkphp实现图片上传功能
2016/01/13 PHP
两个select之间option的互相添加操作(jquery实现)
2009/11/12 Javascript
JavaScript写的一个自定义弹出式对话框代码
2010/01/17 Javascript
JavaScript 空位补零实现代码
2010/02/26 Javascript
js判断屏幕分辨率的代码
2013/07/16 Javascript
jQuery中:input选择器用法实例
2015/01/03 Javascript
js实现遮罩层弹出框的方法
2015/01/15 Javascript
jQuery判断对象是否存在的方法
2015/02/05 Javascript
vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理
2017/03/06 Javascript
一个有意思的鼠标点击文字特效jquery代码
2017/09/23 jQuery
vue语法之拼接字符串的示例代码
2017/10/25 Javascript
Windows安装Node.js报错:2503、2502的解决方法
2017/10/25 Javascript
element ui 对话框el-dialog关闭事件详解
2018/02/26 Javascript
angular6.0开发教程之如何安装angular6.0框架
2018/06/29 Javascript
5分钟快速掌握JS中var、let和const的异同
2018/09/19 Javascript
vue、react等单页面项目部署到服务器的方法及vue和react的区别
2018/09/29 Javascript
layer.open的自适应及居中及子页面标题的修改方法
2019/09/05 Javascript
Vue.js 无限滚动列表性能优化方案
2019/12/02 Javascript
Python打包方法Pyinstaller的使用
2018/10/09 Python
pytorch 使用单个GPU与多个GPU进行训练与测试的方法
2019/08/19 Python
jupyter notebook tensorflow打印device信息实例
2020/04/20 Python
keras得到每层的系数方式
2020/06/15 Python
Python如何爬取51cto数据并存入MySQL
2020/08/25 Python
非常震撼的纯CSS3人物行走动画
2016/02/24 HTML / CSS
用HTML5制作视频拼图的教程
2015/05/13 HTML / CSS
一套SQL笔试题
2016/08/14 面试题
应届毕业生求职信范例分享
2013/12/17 职场文书
食品采购员岗位职责
2014/04/14 职场文书
群众路线个人对照检查材料2014
2014/09/26 职场文书
2015年学校远程教育工作总结
2015/07/20 职场文书
python flask开发的简单基金查询工具
2021/06/02 Python
使用Ajax实现进度条的绘制
2022/04/07 Javascript