基于使用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实现一个简单的银行转账操作
Mar 06 Python
深入理解python中的select模块
Apr 23 Python
Python3下错误AttributeError: ‘dict’ object has no attribute’iteritems‘的分析与解决
Jul 06 Python
python微信跳一跳系列之色块轮廓定位棋盘
Feb 26 Python
解决Python3 被PHP程序调用执行返回乱码的问题
Feb 16 Python
WxPython建立批量录入框窗口
Feb 27 Python
Python Opencv实现图像轮廓识别功能
Mar 23 Python
这可能是最好玩的python GUI入门实例(推荐)
Jul 19 Python
Python如何使用k-means方法将列表中相似的句子归类
Aug 08 Python
python super的使用方法及实例详解
Sep 25 Python
Python读取多列数据以及用matplotlib制作图表方法实例
Sep 23 Python
Python加密技术之RSA加密解密的实现
Apr 08 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 FLEA中二叉树数组的遍历输出
2012/09/26 PHP
php隐藏IP地址后两位显示为星号的方法
2014/11/21 PHP
SSO单点登录的PHP实现方法(Laravel框架)
2016/03/23 PHP
Yii2创建控制器(createController)方法详解
2016/07/23 PHP
PHP实现的二分查找算法实例分析
2017/12/19 PHP
laravel 模型查询按照whereIn排序的示例
2019/10/16 PHP
JQuery与Ajax常用代码实现对比
2009/10/03 Javascript
JavaScript Sort 表格排序
2009/10/31 Javascript
jQuery窗口拖动功能的实现代码
2017/02/04 Javascript
vue渲染时闪烁{{}}的问题及解决方法
2018/03/28 Javascript
在vue中获取token,并将token写进header的方法
2018/09/26 Javascript
vue router 通过路由来实现切换头部标题功能
2019/04/24 Javascript
使用微信SDK自定义分享的方法
2019/07/03 Javascript
layui 上传图片 返回图片地址的方法
2019/09/26 Javascript
天翼开放平台免费短信验证码接口使用实例
2013/12/18 Python
Python编程中用close()方法关闭文件的教程
2015/05/24 Python
Python base64编码解码实例
2015/06/21 Python
深入理解Python变量与常量
2016/06/02 Python
Python程序运行原理图文解析
2018/02/10 Python
python 3利用Dlib 19.7实现摄像头人脸检测特征点标定
2018/02/26 Python
超简单使用Python换脸实例
2019/03/27 Python
Python 异步协程函数原理及实例详解
2019/11/13 Python
tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式
2020/01/24 Python
python实现输入三角形边长自动作图求面积案例
2020/04/12 Python
Python2.x与3​​.x版本有哪些区别
2020/07/09 Python
使用Python判断一个文件是否被占用的方法教程
2020/12/16 Python
Lancome兰蔻官方旗舰店:来自法国的世界知名美妆品牌
2018/06/14 全球购物
估算杭州有多少软件工程师
2015/08/11 面试题
人力资源经理的岗位职责
2014/03/02 职场文书
教师批评与自我批评总结
2014/10/16 职场文书
党的群众路线教育实践活动心得体会(乡镇)
2014/11/03 职场文书
英语教师个人总结
2015/02/09 职场文书
公司仓管员岗位职责
2015/04/01 职场文书
党校团干班培训心得体会
2016/01/06 职场文书
工作简历的自我评价
2019/05/16 职场文书
广告文案的撰写技巧(实用干货)
2019/08/23 职场文书