基于使用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 相关文章推荐
利用numpy+matplotlib绘图的基本操作教程
May 03 Python
深入浅析Python的类
Jun 22 Python
Python根据已知邻接矩阵绘制无向图操作示例
Jun 23 Python
python3.6实现学生信息管理系统
Feb 21 Python
浅谈python编译pyc工程--导包问题解决
Mar 20 Python
python 计算一个字符串中所有数字的和实例
Jun 11 Python
django框架实现一次性上传多个文件功能示例【批量上传】
Jun 19 Python
python threading和multiprocessing模块基本用法实例分析
Jul 25 Python
Python+Redis实现布隆过滤器
Dec 08 Python
Python获取二维数组的行列数的2种方法
Feb 11 Python
如何基于Python实现word文档重新排版
Sep 29 Python
分享一个python的aes加密代码
Dec 22 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
php中使用DOM类读取XML文件的实现代码
2011/12/14 PHP
PHP排序算法的复习和总结
2012/02/15 PHP
php中通过eval实现字符串格式的计算公式
2017/03/18 PHP
javascript获取当前ip的代码
2009/05/10 Javascript
Jquery 学习笔记(一)
2009/10/13 Javascript
用Javascript来生成ftp脚本的小例子
2013/07/03 Javascript
JS网页播放声音实现代码兼容各种浏览器
2013/09/22 Javascript
js的参数有长度限制吗?发现不能超过2083个字符
2014/04/20 Javascript
玩转JavaScript OOP - 类的实现详解
2016/06/08 Javascript
JavaScript中Array的实用操作技巧分享
2016/09/11 Javascript
JS实用的带停顿的逐行文本循环滚动效果实例
2016/11/23 Javascript
JS实现二叉查找树的建立以及一些遍历方法实现
2017/04/17 Javascript
Angular2使用Angular CLI快速搭建工程(一)
2017/05/21 Javascript
浅谈事件冒泡、事件委托、jQuery元素节点操作、滚轮事件与函数节流
2017/07/22 jQuery
详解原生JS回到顶部
2019/03/25 Javascript
详解Vue demo实现商品列表的展示
2019/05/07 Javascript
微信小程序页面渲染实现方法
2019/11/06 Javascript
javascript实现视频弹幕效果(两个版本)
2019/11/28 Javascript
python登录豆瓣并发帖的方法
2015/07/08 Python
详解python:time模块用法
2019/03/25 Python
Python发展史及网络爬虫
2019/06/19 Python
使用Python画股票的K线图的方法步骤
2019/06/28 Python
python中从for循环延申到推导式的具体使用
2019/11/29 Python
pytorch: Parameter 的数据结构实例
2019/12/31 Python
Python的历史与优缺点整理
2020/05/26 Python
Python logging模块handlers用法详解
2020/08/14 Python
python smtplib发送多个email联系人的实现
2020/10/09 Python
Sentry错误日志监控使用方法解析
2020/11/12 Python
令人啧啧称赞的经理推荐信
2013/11/07 职场文书
银行领导证婚词
2014/01/11 职场文书
关于圣诞节的广播稿
2014/01/26 职场文书
2014年入党积极分子学习三中全会思想汇报
2014/09/13 职场文书
党员转正介绍人意见
2015/06/03 职场文书
2017春节晚会开幕词
2016/03/03 职场文书
导游词之天津古文化街
2019/11/09 职场文书
TensorFlow的自动求导原理分析
2021/05/26 Python