基于使用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实现QQ游戏大家来找茬辅助工具
Sep 14 Python
pygame学习笔记(2):画点的三种方法和动画实例
Apr 15 Python
windows下ipython的安装与使用详解
Oct 20 Python
python实现简单聊天应用 python群聊和点对点均实现
Sep 14 Python
pandas中Timestamp类用法详解
Dec 11 Python
Python基于多线程实现抓取数据存入数据库的方法
Jun 22 Python
Numpy之文件存取的示例代码
Aug 03 Python
pandas的排序和排名的具体使用
Jul 31 Python
python3 下载网络图片代码实例
Aug 27 Python
Jupyter notebook无法导入第三方模块的解决方式
Apr 15 Python
python爬虫scrapy图书分类实例讲解
Nov 23 Python
python常见的占位符总结及用法
Jul 02 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设计模式 FlyWeight (享元模式)
2011/06/26 PHP
php文件夹与文件目录操作函数介绍
2013/09/09 PHP
php绘制一个矩形的方法
2015/01/24 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
2019/02/16 PHP
JavaScript中把数字转换为字符串的程序代码
2013/06/19 Javascript
JS 毫秒转时间示例代码
2013/09/22 Javascript
jquery获得当前html页面源码的方法
2015/07/14 Javascript
详解javascript的变量与标识符
2016/01/04 Javascript
JavaScript提升性能的常用技巧总结【经典】
2016/06/20 Javascript
通过jquery实现页面的动画效果(实例代码)
2016/09/18 Javascript
vue双向绑定的简单实现
2016/12/22 Javascript
简单谈谈关于Angular Cli打包的事
2017/09/05 Javascript
基于jQuery的$.getScript方法去加载javaScript文档解析
2017/11/08 jQuery
打通前后端构建一个Vue+Express的开发环境
2018/07/17 Javascript
Vue通过for循环随机生成不同的颜色或随机数的实例
2019/11/09 Javascript
[01:38]DOTA2 2015国际邀请赛中国区预选赛 Showopen
2015/06/01 DOTA
[01:00:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第三场 1月10日
2021/03/11 DOTA
python 布尔操作实现代码
2013/03/23 Python
Python实现变量数值交换及判断数组是否含有某个元素的方法
2017/09/18 Python
Python给你的头像加上圣诞帽
2018/01/04 Python
对python 调用类属性的方法详解
2019/07/02 Python
Python求离散序列导数的示例
2019/07/10 Python
Window10下python3.7 安装与卸载教程图解
2019/09/30 Python
Python递归实现打印多重列表代码
2020/02/27 Python
利用HTML5实现使用按钮控制背景音乐开关
2015/09/21 HTML / CSS
使用索引(Index)有哪些需要考虑的因素
2016/10/19 面试题
英语师范专业毕业生自荐信
2013/09/21 职场文书
大学生就业推荐信范文
2013/11/29 职场文书
教师个人鉴定材料
2014/02/08 职场文书
大学生自我评价范文分享
2014/02/21 职场文书
小组口号大全
2014/06/09 职场文书
2014年卫生保健工作总结
2014/12/08 职场文书
幼儿园教师暑期培训心得体会
2016/01/09 职场文书
Redis读写分离搭建的完整步骤
2021/09/14 Redis
Python+Matplotlib+LaTeX玩转数学公式
2022/02/24 Python
Win11 22H2 2022怎么更新? 获得Win1122H22022版本升级技巧
2022/09/23 数码科技