基于使用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的id()函数解密过程
Dec 25 Python
Python计时相关操作详解【time,datetime】
May 26 Python
Python实现基于二叉树存储结构的堆排序算法示例
Dec 08 Python
浅谈numpy数组的几种排序方式
Dec 15 Python
批量将ppt转换为pdf的Python代码 只要27行!
Feb 26 Python
Python 十六进制整数与ASCii编码字符串相互转换方法
Jul 09 Python
浅谈python写入大量文件的问题
Nov 09 Python
Ubuntu下升级 python3.7.1流程备忘(推荐)
Dec 10 Python
Linux上使用Python统计每天的键盘输入次数
Apr 17 Python
python异常触发及自定义异常类解析
Aug 06 Python
在jupyter notebook中调用.ipynb文件方式
Apr 14 Python
Django Path转换器自定义及正则代码实例
May 29 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具体实现代码
2010/10/12 PHP
生成随机字符串和验证码的类的PHP实例
2013/12/24 PHP
php的PDO事务处理机制实例分析
2017/02/16 PHP
Prototype Function对象 学习
2009/07/12 Javascript
Asp.net下使用Jquery Ajax传送和接收DataTable的代码
2010/09/12 Javascript
广泛收集的jQuery拖放插件集合
2012/04/09 Javascript
jquerymobile checkbox及时刷新才能获取其准确值
2012/04/14 Javascript
ajax请求乱码的解决方法(中文乱码)
2014/04/10 Javascript
JavaScript模拟可展开、拖动与关闭的聊天窗口实例
2015/05/12 Javascript
JavaScript中exec函数用法实例分析
2015/06/08 Javascript
Angularjs中的事件广播 —全面解析$broadcast,$emit,$on
2016/05/17 Javascript
js通过指定下标或指定元素进行删除数组的实例
2017/01/12 Javascript
jquery pagination分页插件使用详解(后台struts2)
2017/01/22 Javascript
自定义事件解决重复请求BUG的问题
2017/07/11 Javascript
微信JSSDK实现打开摄像头拍照再将相片保存到服务器
2019/11/15 Javascript
[03:16]DOTA2完美大师赛主赛事首日集锦
2017/11/23 DOTA
[49:56]VG vs Optic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python2和Python3中print的用法示例总结
2017/10/25 Python
Python机器学习之SVM支持向量机
2017/12/27 Python
django用户注册、登录、注销和用户扩展的示例
2018/03/19 Python
Python 给屏幕打印信息加上颜色的实现方法
2019/04/24 Python
详解Python的循环结构知识点
2019/05/20 Python
Django Rest framework解析器和渲染器详解
2019/07/25 Python
用openCV和Python 实现图片对比,并标识出不同点的方式
2019/12/19 Python
python 截取XML中bndbox的坐标中的图像,另存为jpg的实例
2020/03/10 Python
医院总经理岗位职责
2014/02/04 职场文书
创业计划书模版
2014/02/05 职场文书
物理专业大学生职业生涯规划书
2014/02/07 职场文书
活动总结格式
2014/08/30 职场文书
典型事迹材料范文
2014/12/29 职场文书
义诊活动总结
2015/02/04 职场文书
求职简历自我评价范文
2015/03/10 职场文书
2016清明节森林防火广播稿
2015/12/17 职场文书
继续教育心得体会(共6篇)
2016/01/19 职场文书
承诺书的签字人,需不需要承担相应的责任?
2019/07/09 职场文书
「偶像大师 MILLION LIVE!」七尾百合子手办开订
2022/03/21 日漫