基于使用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 Web框架Flask下网站开发入门实例
Feb 08 Python
在Python的Flask中使用WTForms表单框架的基础教程
Jun 07 Python
浅谈Python 对象内存占用
Jul 15 Python
Python遍历pandas数据方法总结
Feb 09 Python
python统计字母、空格、数字等字符个数的实例
Jun 29 Python
Tensorflow加载预训练模型和保存模型的实例
Jul 27 Python
基于Pytorch SSD模型分析
Feb 18 Python
Python利用PyPDF2库获取PDF文件总页码实例
Apr 03 Python
对Matlab中共轭、转置和共轭装置的区别说明
May 11 Python
Django之富文本(获取内容,设置内容方式)
May 21 Python
python获取本周、上周、本月、上月及本季的时间代码实例
Sep 08 Python
Python数据清洗工具之Numpy的基本操作
Apr 22 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
关于Intype一些小问题的解决办法
2008/03/28 PHP
完美实现GIF动画缩略图的php代码
2011/01/02 PHP
PHP的简易冒泡法代码分享
2012/08/28 PHP
php实现水仙花数示例分享
2014/04/03 PHP
php中explode函数用法分析
2014/11/15 PHP
php实现图片上传、剪切功能
2016/05/07 PHP
浅析Laravel5中队列的配置及使用
2016/08/04 PHP
浅析PHP数据导出知识点
2018/02/17 PHP
使用jQuery实现星级评分代码分享
2014/12/09 Javascript
jquery手风琴特效插件
2015/02/04 Javascript
js代码验证手机号码和电话号码是否合法
2015/07/30 Javascript
JS使用post提交的两种方式
2015/12/03 Javascript
轻松5句话解决JavaScript的作用域
2016/07/15 Javascript
Bootstrap基本插件学习笔记之轮播幻灯片(23)
2016/12/08 Javascript
微信小程序 欢迎页面的制作(源码下载)
2017/01/09 Javascript
常用的js方法合集
2017/03/10 Javascript
JS中的JSON对象的定义和取值实现代码
2018/05/09 Javascript
jQuery实现checkbox全选功能完整实例
2018/07/12 jQuery
JS实现电脑虚拟键盘的操作
2020/06/24 Javascript
python编写暴力破解FTP密码小工具
2014/11/19 Python
python 专题九 Mysql数据库编程基础知识
2017/03/16 Python
Python实现注册登录系统
2017/08/08 Python
Python时间和字符串转换操作实例分析
2019/03/16 Python
如何使用Python实现自动化水军评论
2019/06/26 Python
Python安装及Pycharm安装使用教程图解
2019/09/20 Python
如何利用python web框架做文件流下载的实现示例
2020/06/02 Python
卸载tensorflow-cpu重装tensorflow-gpu操作
2020/06/23 Python
Django数据模型中on_delete使用详解
2020/11/30 Python
《骆驼和羊》教学反思
2014/02/27 职场文书
我的教育故事演讲稿
2014/05/04 职场文书
班级文化建设标语
2014/06/23 职场文书
道路施工安全责任书
2014/07/24 职场文书
2014年仓库保管员工作总结
2014/12/03 职场文书
考研复习计划
2015/01/19 职场文书
2015年大学宣传部工作总结
2015/05/26 职场文书
MySQL中order by的使用详情
2021/11/17 MySQL