基于使用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读文件逐行处理的示例代码分享
Dec 27 Python
Python学习笔记_数据排序方法
May 22 Python
Python入门篇之条件、循环
Oct 17 Python
Python数组定义方法
Apr 13 Python
2018年Python值得关注的开源库、工具和开发者(总结篇)
Jan 04 Python
Python实现抢购IPhone手机
Feb 07 Python
利用nohup来开启python文件的方法
Jan 14 Python
Pytorch 实现自定义参数层的例子
Aug 17 Python
Python实现串口通信(pyserial)过程解析
Sep 25 Python
Win10环境中如何实现python2和python3并存
Jul 20 Python
Python中logger日志模块详解
Aug 04 Python
Python+OpenCV实现在图像上绘制矩形
Mar 21 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
4.与数据库的连接
2006/10/09 PHP
奇怪的PHP引用效率问题分析
2012/03/23 PHP
php使用wordwrap格式化文本段落的方法
2015/03/17 PHP
记录一次排查PHP脚本执行卡住的问题
2016/12/27 PHP
JavaScript Event学习第二章 Event浏览器兼容性
2010/02/07 Javascript
JavaScript 5 新增 Array 方法实现介绍
2012/02/06 Javascript
jQuery 借助插件Lavalamp实现导航条动态美化效果
2013/09/27 Javascript
JavaScript利用正则表达式去除日期中的“-”
2014/07/01 Javascript
纯js实现无限空间大小的本地存储
2015/06/18 Javascript
微信小程序 生命周期详解
2016/10/12 Javascript
javascript简单链式调用案例分析
2017/05/10 Javascript
vue中component组件的props使用详解
2017/09/04 Javascript
jQuery实现动画、消失、显现、渐出、渐入效果示例
2018/09/06 jQuery
vue观察模式浅析
2018/09/25 Javascript
layui实现给某一列加点击事件
2019/10/26 Javascript
JS轮播图的实现方法2
2020/08/25 Javascript
python pickle 和 shelve模块的用法
2013/09/16 Python
python实现ftp客户端示例分享
2014/02/17 Python
跟老齐学Python之折腾一下目录
2014/10/24 Python
Python 中 Virtualenv 和 pip 的简单用法详解
2017/08/18 Python
人脸识别经典算法一 特征脸方法(Eigenface)
2018/03/13 Python
python单例设计模式实现解析
2020/01/07 Python
总结Pyinstaller的坑及终极解决方法(小结)
2020/09/21 Python
使用CSS3在触屏上为按钮实现激活效果
2013/09/27 HTML / CSS
比较基础的php面试题及答案-填空题
2014/04/26 面试题
商务助理岗位职责
2013/11/13 职场文书
幼儿园数学教学反思
2014/02/02 职场文书
物业总经理岗位职责
2014/02/28 职场文书
聚美优品广告词改编
2014/03/14 职场文书
《悯农》教学反思
2014/04/28 职场文书
实习护士自荐信
2014/06/21 职场文书
新闻发布会活动策划方案
2014/09/15 职场文书
司法局群众路线教育实践活动开展情况总结
2014/10/25 职场文书
小马王观后感
2015/06/11 职场文书
css布局巧妙技巧之css三角示例的运用
2022/03/16 HTML / CSS
《艾尔登法环》Boss腐烂树灵很有可能是《黑暗之魂3》的一个废案
2022/04/11 其他游戏