基于使用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命令行交互提示符的方法
Jan 14 Python
Python操作使用MySQL数据库的实例代码
May 25 Python
利用python的socket发送http(s)请求方法示例
May 07 Python
Python字典的基本用法实例分析【创建、增加、获取、修改、删除】
Mar 05 Python
Python实现定制自动化业务流量报表周报功能【XlsxWriter模块】
Mar 11 Python
深入解析python中的实例方法、类方法和静态方法
Mar 11 Python
Python编写通讯录通过数据库存储实现模糊查询功能
Jul 18 Python
Python dict和defaultdict使用实例解析
Mar 12 Python
如何将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
Apr 22 Python
python 3.8.3 安装配置图文教程
May 21 Python
python如何利用Mitmproxy抓包
Oct 10 Python
用Python爬取英雄联盟的皮肤详细示例
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
php分页函数示例代码分享
2014/02/24 PHP
php类中的$this,static,final,const,self这几个关键字使用方法
2015/12/14 PHP
PHP实现链式操作的三种方法详解
2017/11/16 PHP
CodeIgniter框架数据库基本操作示例
2018/05/24 PHP
关于IE、Firefox、Opera页面呈现异同 写脚本很痛苦
2009/08/28 Javascript
jQuery AJAX 调用WebService实现代码
2010/03/24 Javascript
两个Javascript小tip资料
2010/11/23 Javascript
jquery实现公告翻滚效果
2015/02/27 Javascript
jQuery的 $.ajax防止重复提交的两种方法(推荐)
2016/10/14 Javascript
vue.js指令v-model实现方法
2016/12/05 Javascript
bootstrap 模态框(modal)实现水平垂直居中显示
2017/01/23 Javascript
js实现倒计时效果(小于10补零)
2017/03/08 Javascript
react性能优化达到最大化的方法 immutable.js使用的必要性
2017/03/09 Javascript
Vue 全家桶实现移动端酷狗音乐功能
2018/11/16 Javascript
学习python的几条建议分享
2013/02/10 Python
python实现的DES加密算法和3DES加密算法实例
2015/06/03 Python
Django数据库操作的实例(增删改查)
2017/09/04 Python
Python使用sqlalchemy模块连接数据库操作示例
2019/03/13 Python
Python学习笔记之自定义函数用法详解
2019/06/08 Python
Django 响应数据response的返回源码详解
2019/08/06 Python
关于Keras模型可视化教程及关键问题的解决
2020/01/24 Python
HTML5 通信API 跨域门槛将不再高、数据推送也不再是梦
2013/04/25 HTML / CSS
高清屏中使用Canvas绘图出现模糊的问题及解决方法
2019/06/03 HTML / CSS
h5页面背景图很长要有滚动条滑动效果的实现
2021/01/27 HTML / CSS
澳大利亚香水在线商店:City Perfume
2020/09/02 全球购物
什么是servlet
2012/05/08 面试题
大学毕业生个人自荐信范文
2014/01/08 职场文书
综治维稳工作承诺书
2014/08/30 职场文书
会议室管理制度范本
2015/08/06 职场文书
2016中秋节月饼促销广告语
2016/01/28 职场文书
读后感怎么写?书写读后感的基本技巧!
2019/12/10 职场文书
redis连接被拒绝的解决方案
2021/04/12 Redis
Pytorch 中net.train 和 net.eval的使用说明
2021/05/22 Python
《雀魂PONG☆》4月1日播出 PV角色设定情报
2022/03/20 日漫
聊聊mysql都有哪几种分区方式
2022/04/13 MySQL
Django框架模板用法详解
2022/06/10 Python