使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之for循环语句
Oct 02 Python
Python实现的排列组合计算操作示例
Oct 13 Python
人机交互程序 python实现人机对话
Nov 14 Python
Python排序搜索基本算法之选择排序实例分析
Dec 09 Python
Python使用matplotlib模块绘制图像并设置标题与坐标轴等信息示例
May 04 Python
解决在pycharm中显示额外的 figure 窗口问题
Jan 15 Python
Python实现的爬取百度文库功能示例
Feb 16 Python
如何使用django的MTV开发模式返回一个网页
Jul 22 Python
Python Opencv提取图片中某种颜色组成的图形的方法
Sep 19 Python
python爬虫中采集中遇到的问题整理
Nov 27 Python
python中使用np.delete()的实例方法
Feb 01 Python
Django实现翻页的示例代码
May 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
一些操作和快捷键的理解和讨论
2020/03/04 星际争霸
虫族 Zerg 历史背景
2020/03/14 星际争霸
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
2009/03/13 PHP
PHP mail()函数使用及配置方法
2014/01/14 PHP
PHP实现的QQ空间g_tk加密算法
2015/07/09 PHP
在WordPress的后台中添加顶级菜单和子菜单的函数详解
2016/01/11 PHP
PHP框架自动加载类文件原理详解
2017/06/06 PHP
php DES加密算法实例分析
2019/09/18 PHP
Notify - 基于jquery的消息通知插件
2011/10/18 Javascript
举例讲解AngularJS中的模块
2015/06/17 Javascript
JavaScript去除数组里重复值的方法
2015/07/13 Javascript
AngularJS过滤器详解及示例代码
2016/08/16 Javascript
JS键盘版计算器的制作方法
2016/12/03 Javascript
AngularJS中的拦截器实例详解
2017/04/07 Javascript
详解webpack+gulp实现自动构建部署
2017/06/29 Javascript
vue-router 组件复用问题详解
2018/01/22 Javascript
浅谈vue中.vue文件解析流程
2018/04/24 Javascript
layui使用label标签的方法
2019/09/14 Javascript
js实现点赞按钮功能的实例代码
2020/03/06 Javascript
python分割和拼接字符串
2013/11/01 Python
Python通过RabbitMQ服务器实现交换机功能的实例教程
2016/06/29 Python
python实时分析日志的一个小脚本分享
2017/05/07 Python
python中map()函数的使用方法示例
2017/09/29 Python
SVM基本概念及Python实现代码
2017/12/27 Python
Python 将Matrix、Dict保存到文件的方法
2018/10/30 Python
Keras预训练的ImageNet模型实现分类操作
2020/07/07 Python
轻化专业学生实习自我鉴定
2013/09/20 职场文书
期末总结的个人自我评价
2013/11/02 职场文书
高中生活自我鉴定
2014/01/18 职场文书
安全生产责任书
2014/03/12 职场文书
道路交通安全实施方案
2014/03/12 职场文书
自我推荐信范文
2014/05/09 职场文书
2014教师个人自我评价范文
2014/09/13 职场文书
2014年师德师风工作总结
2014/11/25 职场文书
MySQL中distinct和count(*)的使用方法比较
2021/05/26 MySQL
Nginx中使用Lua脚本与图片的缩略图处理的实现
2022/03/18 Servers