基于使用paramiko执行远程linux主机命令(详解)


Posted in Python onOctober 16, 2017

paramiko是python的SSH库,可用来连接远程linux主机,然后执行linux命令或者通过SFTP传输文件。

关于使用paramiko执行远程主机命令可以找到很多参考资料了,本文在此基础上做一些封装,便于扩展与编写脚本。

下面直接给出代码:

# coding: utf-8

import paramiko
import re
from time import sleep

# 定义一个类,表示一台远端linux主机
class Linux(object):
  # 通过IP, 用户名,密码,超时时间初始化一个远程Linux主机
  def __init__(self, ip, username, password, timeout=30):
    self.ip = ip
    self.username = username
    self.password = password
    self.timeout = timeout
    # transport和chanel
    self.t = ''
    self.chan = ''
    # 链接失败的重试次数
    self.try_times = 3

  # 调用该方法连接远程主机
  def connect(self):
    while True:
      # 连接过程中可能会抛出异常,比如网络不通、链接超时
      try:
        self.t = paramiko.Transport(sock=(self.ip, 22))
        self.t.connect(username=self.username, password=self.password)
        self.chan = self.t.open_session()
        self.chan.settimeout(self.timeout)
        self.chan.get_pty()
        self.chan.invoke_shell()
        # 如果没有抛出异常说明连接成功,直接返回
        print u'连接%s成功' % self.ip
        # 接收到的网络数据解码为str
        print self.chan.recv(65535).decode('utf-8')
        return
      # 这里不对可能的异常如socket.error, socket.timeout细化,直接一网打尽
      except Exception, e1:
        if self.try_times != 0:
          print u'连接%s失败,进行重试' %self.ip
          self.try_times -= 1
        else:
          print u'重试3次失败,结束程序'
          exit(1)

  # 断开连接
  def close(self):
    self.chan.close()
    self.t.close()

  # 发送要执行的命令
  def send(self, cmd):
    cmd += '\r'
    # 通过命令执行提示符来判断命令是否执行完成
    p = re.compile(r':~ #')

    result = ''
    # 发送要执行的命令
    self.chan.send(cmd)
    # 回显很长的命令可能执行较久,通过循环分批次取回回显
    while True:
      sleep(0.5)
      ret = self.chan.recv(65535)
      ret = ret.decode('utf-8')
      result += ret
      if p.search(ret):
        print result
        return result

下面进行测试:

# 主机IP错误,无法连接的情况
if __name__ == '__main__':
  host = Linux('192.168.180.12', 'root', 'xxxx')
  host.connect()
   6   host.send('ls -l')
  host.close()
按 Ctrl+C 复制代码按 Ctrl+C 复制代码
连接192.168.180.12失败,进行重试
连接192.168.180.12失败,进行重试
连接192.168.180.12失败,进行重试
重试3次失败,结束程序

Process finished with exit code 1
# 链接正常的情况
if __name__ == '__main__':
  host = Linux('192.168.180.128', 'root', 'love')
  host.connect()
  host.send('ls -l')
  host.close()

运行结果:
连接192.168.180.128成功
Last login: Sat May 21 07:25:39 2016 from 192.168.180.1
Have a lot of fun...

ls -l
192:~ # ls -l
total 28
-rw------- 1 root root 18 May 21 07:17 .bash_history
drwxr-xr-x 1 root root 28 May 21 06:02 .config
drwx------ 1 root root 22 May 21 05:57 .dbus
drwx------ 1 root root 0 Sep 25 2014 .gnupg
drwxr-xr-x 1 root root 10 May 21 06:15 .local
-rw------- 1 root root 55 May 21 06:03 .xauth5mesuo
-rw------- 1 root root 55 May 21 07:22 .xauthEYqDmK
-rw------- 1 root root 55 May 21 07:25 .xauthGTrohO
-rw------- 1 root root 55 May 21 07:09 .xauthP90TnG
-rw------- 1 root root 48 May 21 07:40 .xauthjW8pI9
-rw------- 1 root root 48 May 21 07:40 .xauthx8T4ED
drwxr-xr-x 1 root root 0 Sep 25 2014 bin
drwxr-xr-x 1 root root 38 May 21 05:43 inst-sys
192:~ # 

Process finished with exit code 0

以上这篇基于使用paramiko执行远程linux主机命令(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
比较详细Python正则表达式操作指南(re使用)
Sep 06 Python
pygame播放音乐的方法
May 19 Python
Python字符编码判断方法分析
Jul 01 Python
python基础教程之五种数据类型详解
Jan 12 Python
浅谈用VSCode写python的正确姿势
Dec 16 Python
python numpy 按行归一化的实例
Jan 21 Python
Python后台开发Django的教程详解(启动)
Apr 08 Python
python画图的函数用法以及技巧
Jun 28 Python
python nmap实现端口扫描器教程
May 28 Python
大数据分析用java还是Python
Jul 06 Python
Pycharm github配置实现过程图解
Oct 13 Python
python更新数据库中某个字段的数据(方法详解)
Nov 18 Python
python中文件变化监控示例(watchdog)
Oct 16 #Python
python中import reload __import__的区别详解
Oct 16 #Python
使用Python操作excel文件的实例代码
Oct 15 #Python
python出现"IndentationError: unexpected indent"错误解决办法
Oct 15 #Python
python 二分查找和快速排序实例详解
Oct 13 #Python
Python实现的排列组合计算操作示例
Oct 13 #Python
python numpy函数中的linspace创建等差数列详解
Oct 13 #Python
You might like
Excel数据导入Mysql数据库的实现代码
2008/06/05 PHP
PHP在linux上执行外部命令的方法
2017/02/06 PHP
PHP快速导出百万级数据到CSV或者EXCEL文件
2020/11/27 PHP
Javascript和Ajax中文乱码吐血版解决方案
2009/12/21 Javascript
可在线编辑网页文字效果代码(单击)
2013/03/02 Javascript
如何使用jquery动态加载js,css文件实现代码
2013/04/03 Javascript
调整小数的格式保留小数点后两位
2014/05/14 Javascript
详解JavaScript函数
2015/12/01 Javascript
移动端js触摸事件详解
2016/09/18 Javascript
利用Node.js编写跨平台的spawn语句详解
2017/02/12 Javascript
js实现模糊匹配功能
2017/02/15 Javascript
vue实现消息的无缝滚动效果的示例代码
2017/12/05 Javascript
你可能不知道的前端算法之文字避让(inMap)
2018/01/12 Javascript
js实现下拉框二级联动
2018/12/04 Javascript
vue elementui el-form rules动态验证的实例代码详解
2019/05/23 Javascript
Vue指令之 v-cloak、v-text、v-html实例详解
2019/08/08 Javascript
js事件机制----捕获与冒泡机制实例分析
2020/05/22 Javascript
js canvas实现五子棋小游戏
2021/01/22 Javascript
Python线程中对join方法的运用的教程
2015/04/09 Python
python中文分词,使用结巴分词对python进行分词(实例讲解)
2017/11/14 Python
python中的二维列表实例详解
2018/06/19 Python
Python进阶之全面解读高级特性之切片
2019/02/19 Python
Django之编辑时根据条件跳转回原页面的方法
2019/08/21 Python
Python面向对象程序设计之私有变量,私有方法原理与用法分析
2020/03/23 Python
python小程序之4名牌手洗牌发牌问题解析
2020/05/15 Python
Python爬取微信小程序Charles实现过程图解
2020/09/29 Python
谷歌浏览器小字体处理方案即12px以下字体
2013/12/17 HTML / CSS
使用HTML5加载音频和视频的实现代码
2020/11/30 HTML / CSS
日本最大的眼镜购物网站:Oh My Glasses
2016/11/13 全球购物
综合素质的自我鉴定
2013/10/07 职场文书
小学生读书感言
2014/02/12 职场文书
售后客服工作职责
2014/06/16 职场文书
工程部经理岗位职责
2015/02/02 职场文书
小学体育跳绳课教学反思
2016/02/16 职场文书
Mysql数据库表中为什么有索引却没有提高查询速度
2022/02/24 MySQL
使用Python获取字典键对应值的方法
2022/04/26 Python