使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解决计数原理问题的方法
Aug 04 Python
Python实现更改图片尺寸大小的方法(基于Pillow包)
Sep 19 Python
利用Python如何批量更新服务器文件
Jul 29 Python
numpy 对矩阵中Nan的处理:采用平均值的方法
Oct 30 Python
Empty test suite.(PyCharm程序运行错误的解决方法)
Nov 30 Python
python 消除 futureWarning问题的解决
Dec 25 Python
Python调用.NET库的方法步骤
Dec 27 Python
Python实现子类调用父类的初始化实例
Mar 12 Python
Django Admin设置应用程序及模型顺序方法详解
Apr 01 Python
完美解决pycharm 不显示代码提示问题
Jun 02 Python
Python+unittest+requests+excel实现接口自动化测试框架
Dec 23 Python
关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)
Apr 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
DOMXML函数笔记
2006/10/09 PHP
php连接与操作PostgreSQL数据库的方法
2014/12/25 PHP
thinkphp5框架实现数据库读取的数据转换成json格式示例
2019/10/10 PHP
PHP tp5中使用原生sql查询代码实例
2020/10/28 PHP
Javascript操作URL函数修改版
2013/11/07 Javascript
javascript正则匹配汉字、数字、字母、下划线
2014/04/10 Javascript
原生JS实现LOADING效果
2015/03/16 Javascript
如何动态加载外部Javascript文件
2015/12/02 Javascript
jQuery实现邮箱下拉列表自动补全功能
2016/09/08 Javascript
详解自动生成博客目录案例
2016/12/09 Javascript
JS查找英文文章中出现频率最高的单词
2017/03/20 Javascript
jQuery导航条固定定位效果实例代码
2017/05/26 jQuery
jQuery接受后台传递的List的实例详解
2017/08/02 jQuery
js数组实现权重概率分配
2017/09/12 Javascript
Vue组件开发之LeanCloud带图形校验码的短信发送功能
2017/11/07 Javascript
vue2 mint-ui loadmore实现下拉刷新,上拉更多功能
2018/03/21 Javascript
vue中当图片地址无效的时候,显示默认图片的方法
2018/09/18 Javascript
JS滚轮控制图片缩放大小和拖动的实例代码
2018/11/20 Javascript
小程序云开发获取不到数据库记录的解决方法
2019/05/18 Javascript
解决Vue.js应用回退或刷新界面时提示用户保存修改问题
2019/11/24 Javascript
Nuxt v-bind绑定img src不显示的解决
2019/12/05 Javascript
JS通用方法触发点击事件代码实例
2020/02/17 Javascript
Python学习思维导图(必看篇)
2017/06/26 Python
python去重,一个由dict组成的list的去重示例
2019/01/21 Python
浅谈keras中的目标函数和优化函数MSE用法
2020/06/10 Python
mac安装python3后使用pip和pip3的区别说明
2020/09/01 Python
解决Pyinstaller打包软件失败的一个坑
2021/03/04 Python
详解CSS3的perspective属性设置3D变换距离的方法
2016/05/23 HTML / CSS
生物医学工程专业学生求职信范文分享
2013/12/14 职场文书
中学生期末评语
2014/02/03 职场文书
学生感冒英文请假条
2014/02/04 职场文书
爸爸的花儿落了教学反思
2014/02/20 职场文书
参观接待方案
2014/03/17 职场文书
歌颂党的演讲稿
2014/09/10 职场文书
会议开幕致辞怎么写
2016/03/03 职场文书
原生JavaScript实现简单五子棋游戏
2021/06/28 Javascript