基于使用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 27 Python
用Python中的__slots__缓存资源以节省内存开销的方法
Apr 02 Python
Python中使用第三方库xlutils来追加写入Excel文件示例
Apr 05 Python
Python代码调试的几种方法总结
Apr 15 Python
Python实现压缩与解压gzip大文件的方法
Sep 18 Python
Python数据结构之栈、队列的实现代码分享
Dec 04 Python
python with提前退出遇到的坑与解决方案
Jan 05 Python
python的Crypto模块实现AES加密实例代码
Jan 22 Python
Python开发网站目录扫描器的实现
Feb 21 Python
基于Tensorflow高阶读写教程
Feb 10 Python
Python unittest基本使用方法代码实例
Jun 29 Python
基于Pygame实现简单的贪吃蛇游戏
Dec 06 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
Smarty的配置与高级缓存技术分享
2012/06/05 PHP
yii2分页之实现跳转到具体某页的实例代码
2016/06/02 PHP
php写入文件不覆盖的实例讲解
2019/09/17 PHP
Javascript 中 null、NaN和undefined的区别总结
2013/04/10 Javascript
jquery dialog open后,服务器端控件失效的快速解决方法
2013/12/19 Javascript
js数组中如何随机取出一个值
2014/06/13 Javascript
jQuery的ready方法详解
2014/11/27 Javascript
PHPMyAdmin导入时提示文件大小超出PHP限制的解决方法
2015/03/30 Javascript
javascript元素动态创建实现方法
2015/05/13 Javascript
理解javascript中try...catch...finally
2015/12/25 Javascript
微信公众平台开发教程(五)详解自定义菜单
2016/12/02 Javascript
js放大镜放大购物图片效果
2017/01/18 Javascript
vue2.0路由切换后页面滚动位置不变BUG的解决方法
2018/03/14 Javascript
vue观察模式浅析
2018/09/25 Javascript
ES6中Set和Map数据结构,Map与其它数据结构互相转换操作实例详解
2019/02/28 Javascript
Weex开发之WEEX-EROS开发踩坑(小结)
2019/10/16 Javascript
使用axios发送post请求,将JSON数据改为form类型的示例
2019/10/31 Javascript
json解析大全 双引号、键值对不在一起的情况
2019/12/06 Javascript
Vue获取页面元素的相对位置的方法示例
2020/02/05 Javascript
JS+CSS+HTML实现“代码雨”类似黑客帝国文字下落效果
2020/03/17 Javascript
Vue结合路由配置递归实现菜单栏功能
2020/06/16 Javascript
[06:20]2015国际邀请赛第三日top10
2015/08/08 DOTA
动态创建类实例代码
2009/10/07 Python
详解Python字符串切片
2019/05/20 Python
Python logging日志模块 配置文件方式
2020/07/12 Python
Python应用自动化部署工具Fabric原理及使用解析
2020/11/30 Python
如何利用python正则表达式匹配版本信息
2020/12/09 Python
影视制作岗位职责
2013/12/04 职场文书
后勤采购员岗位职责
2013/12/19 职场文书
2014年计算机专业个人自我评价
2014/01/19 职场文书
品质口号大全
2014/06/17 职场文书
关于工作经历的证明书
2014/10/11 职场文书
党支部承诺书
2015/01/20 职场文书
2015年学校安全工作总结
2015/04/22 职场文书
电力安全教育培训心得体会
2016/01/11 职场文书
JavaScript如何利用Promise控制并发请求个数
2021/05/14 Javascript