使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交换变量
Sep 06 Python
浅谈python中的占位符
Nov 09 Python
简述:我为什么选择Python而不是Matlab和R语言
Nov 14 Python
Flask框架使用DBUtils模块连接数据库操作示例
Jul 20 Python
python时间序列按频率生成日期的方法
May 14 Python
Python3.8中使用f-strings调试
May 22 Python
python之拟合的实现
Jul 19 Python
python爬取王者荣耀全皮肤的简单实现代码
Jan 31 Python
对tensorflow 中tile函数的使用详解
Feb 07 Python
python中有帮助函数吗
Jun 19 Python
Python爬虫过程解析之多线程获取小米应用商店数据
Nov 14 Python
Python 处理表格进行成绩排序的操作代码
Jul 26 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命令行脚本接收传入参数的三种方式
2014/08/20 PHP
PHP页面转UTF-8中文编码乱码的解决办法
2015/10/20 PHP
PHP执行shell脚本运行程序不产生core文件的方法
2016/12/28 PHP
laravel 之 Eloquent 模型修改器和序列化示例
2019/10/17 PHP
分享几种好用的PHP自定义加密函数(可逆/不可逆)
2020/09/15 PHP
JavaScript 字符串连接性能优化
2008/12/20 Javascript
jQuery dialog 异步调用ashx,webservice数据的代码
2010/08/03 Javascript
使用ExtJS技术实现的拖动树结点
2010/08/05 Javascript
以JSON形式将JS中Array对象数组传至后台的方法
2014/01/06 Javascript
Google Maps基础及实例解析
2016/08/06 Javascript
bootstrap模态框实现拖拽效果
2016/12/14 Javascript
判断横屏竖屏(三种)
2017/02/13 Javascript
for循环 + setTimeout 结合一些示例(前端面试题)
2017/08/30 Javascript
vue环形进度条组件实例应用
2018/10/10 Javascript
如何从零开始手写Koa2框架
2019/03/22 Javascript
angular多语言配置详解
2019/05/16 Javascript
Layui表格行工具事件与数据回填方法
2019/09/13 Javascript
javascript设计模式之装饰者模式
2020/01/30 Javascript
一篇文章带你使用Typescript封装一个Vue组件(简单易懂)
2020/06/05 Javascript
解决vue无法侦听数组及对象属性的变化问题
2020/07/17 Javascript
列举Python中吸引人的一些特性
2015/04/09 Python
python爬虫scrapy框架的梨视频案例解析
2021/02/20 Python
使用css3匹配手机屏幕横竖状态
2014/01/27 HTML / CSS
浅谈css3新单位vw、vh、vmin、vmax的使用详解
2017/12/01 HTML / CSS
详解移动端h5页面根据屏幕适配的四种方案
2020/04/15 HTML / CSS
JACK & JONES英国官方网站:欧洲领先的男装生产商
2017/09/27 全球购物
澳大利亚儿童和婴儿产品在线商店:Lime Tree Kids
2017/10/05 全球购物
美国隐形眼镜销售网站:ContactsDirect
2017/10/28 全球购物
现代绅士日常奢侈品:Todd Snyder
2019/12/13 全球购物
电影T恤、80年代T恤和80年代服装:TV Store Online
2020/01/05 全球购物
秋季运动会加油稿200字
2014/01/11 职场文书
初中三年毕业生的自我评价分享
2014/02/14 职场文书
学徒工职责
2014/03/06 职场文书
2016元旦文艺汇演主持词
2015/07/06 职场文书
技术入股合作协议书
2016/03/21 职场文书
创业计划书之酒吧
2019/12/02 职场文书