基于使用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 相关文章推荐
利用Fn.py库在Python中进行函数式编程
Apr 22 Python
python通过函数属性实现全局变量的方法
May 16 Python
wxPython使用系统剪切板的方法
Jun 16 Python
通过数据库向Django模型添加字段的示例
Jul 21 Python
详解Python的Flask框架中的signals信号机制
Jun 13 Python
Python实现PS滤镜特效Marble Filter玻璃条纹扭曲效果示例
Jan 29 Python
python和pygame实现简单俄罗斯方块游戏
Feb 19 Python
tensorflow实现图像的裁剪和填充方法
Jul 27 Python
python:按行读入,排序然后输出的方法
Jul 20 Python
Tensorflow 使用pb文件保存(恢复)模型计算图和参数实例详解
Feb 11 Python
如何更换python默认编辑器的背景色
Aug 10 Python
详解Django的MVT设计模式
Apr 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文件操作的详细诠释
2013/06/21 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(九)
2014/06/24 PHP
PHP实现连接设备、通讯和发送命令的方法
2015/10/13 PHP
PHP大神的十大优良习惯
2016/09/14 PHP
php判断str字符串是否是xml格式数据的方法示例
2017/07/26 PHP
YII框架中使用memcache的方法详解
2017/08/02 PHP
Ajax,UTF-8还是GB2312 eval 还是execScript
2008/11/13 Javascript
javascript showModalDialog 多层模态窗口实现页面提交及刷新的代码
2009/11/28 Javascript
javascript笔记 String类replace函数的一些事
2011/09/22 Javascript
javascript 实现map集合
2015/04/03 Javascript
JavaScript中函数(Function)的apply与call理解
2015/07/08 Javascript
JS判断iframe是否加载完成的方法
2016/08/03 Javascript
Vue-resource实现ajax请求和跨域请求示例
2017/02/23 Javascript
封装运动框架实战左右与上下滑动的焦点轮播图(实例)
2017/10/17 Javascript
详解在Vue中使用TypeScript的一些思考(实践)
2018/07/06 Javascript
vue中子组件的methods中获取到props中的值方法
2018/08/27 Javascript
vue+express+jwt持久化登录的方法
2019/06/14 Javascript
js+canvas实现两张图片合并成一张图片的方法
2019/11/01 Javascript
jquery将信息遍历到界面上实例代码
2020/01/21 jQuery
vue实现匀速轮播效果
2020/06/29 Javascript
Python模块学习 re 正则表达式
2011/05/19 Python
Python实现将目录中TXT合并成一个大TXT文件的方法
2015/07/15 Python
Python文件夹与文件的相关操作(推荐)
2016/07/25 Python
Python字符串拼接的几种方法整理
2017/08/02 Python
Python实现破解猜数游戏算法示例
2017/09/25 Python
关于win10在tensorflow的安装及在pycharm中运行步骤详解
2020/03/16 Python
三步解决python PermissionError: [WinError 5]拒绝访问的情况
2020/04/22 Python
python opencv pytesseract 验证码识别的实现
2020/08/28 Python
班队活动设计方案
2014/01/30 职场文书
房地产开发项目建议书
2014/05/16 职场文书
暑期培训班招生方案
2014/08/26 职场文书
学校师德师风自我剖析材料
2014/09/29 职场文书
2015年试用期工作总结范文
2015/05/28 职场文书
火烧圆明园观后感
2015/06/03 职场文书
小学英语听课心得体会
2016/01/14 职场文书
100句人生哲理语录集锦:强者征服今天,懒汉坐等明天
2019/10/18 职场文书