基于使用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 相关文章推荐
开始着手第一个Django项目
Jul 15 Python
使用python调用zxing库生成二维码图片详解
Jan 10 Python
Python 实现链表实例代码
Apr 07 Python
python中关于for循环的碎碎念
Jun 30 Python
PyQt5每天必学之带有标签的复选框
Apr 19 Python
python 定义n个变量方法 (变量声明自动化)
Nov 10 Python
pyqt5 使用cv2 显示图片,摄像头的实例
Jun 27 Python
python中while和for的区别总结
Jun 28 Python
python zip()函数使用方法解析
Oct 31 Python
pytorch 实现查看网络中的参数
Jan 06 Python
python GUI库图形界面开发之PyQt5信号与槽机制、自定义信号基础介绍
Feb 25 Python
在python中利用pycharm自定义代码块教程(三步搞定)
Apr 15 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
Notice: Trying to get property of non-object problem(PHP)解决办法
2012/03/11 PHP
PHP使用正则表达式获取微博中的话题和对象名
2015/07/18 PHP
PHP类与对象后期静态绑定操作实例详解
2018/12/20 PHP
Alliance vs AM BO3 第一场2.13
2021/03/10 DOTA
用正则表达式 动态创建/增加css style script 兼容IE firefox
2009/03/10 Javascript
jqGrid随窗口大小变化自适应大小的示例代码
2013/12/28 Javascript
调用jQuery滑出效果时闪烁的解决方法
2014/03/27 Javascript
jQuery下拉友情链接美化效果代码分享
2015/08/26 Javascript
angularjs学习笔记之双向数据绑定
2015/09/26 Javascript
纯js实现手风琴效果
2020/04/17 Javascript
Vuejs第九篇之组件作用域及props数据传递实例详解
2016/09/05 Javascript
jQuery实现表单动态加减、ajax表单提交功能
2018/06/08 jQuery
jQuery插件实现的日历功能示例【附源码下载】
2018/09/07 jQuery
一文了解Vue中的nextTick
2019/05/06 Javascript
node express使用HTML模板的方法示例
2019/08/22 Javascript
[57:29]Alliance vs KG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/17 DOTA
python批量修改文件后缀示例代码分享
2013/12/24 Python
在Python的Bottle框架中使用微信API的示例
2015/04/23 Python
python 文件操作删除某行的实例
2017/09/04 Python
11月编程语言排行榜 Python逆袭C#上升到第4
2017/11/15 Python
Python tkinter事件高级用法实例
2018/01/31 Python
Python学习笔记之图片人脸检测识别实例教程
2019/03/06 Python
python打开音乐文件的实例方法
2020/07/21 Python
Python reques接口测试框架实现代码
2020/07/28 Python
html5 Canvas画图教程(10)—把面拆成线条模拟出圆角矩形
2013/01/09 HTML / CSS
html5 自定义播放器核心代码
2013/12/20 HTML / CSS
解决HTML5中的audio在手机端和微信端的不能自动播放问题
2019/11/04 HTML / CSS
Linux内核的同步机制是什么?主要有哪几种内核锁
2016/07/11 面试题
物流管理应届生求职信
2013/11/07 职场文书
部队党性分析材料
2014/02/16 职场文书
节水口号标语
2014/06/19 职场文书
电子商务专业毕业生自荐书
2014/06/22 职场文书
处级领导干部四风问题自我剖析材料
2014/09/29 职场文书
详解Vue router路由
2021/11/20 Vue.js
SQL Server查询某个字段在哪些表中存在
2022/03/03 SQL Server
MySQL中order by的执行过程
2022/06/05 MySQL