基于使用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获取外网ip地址的方法总结
Jul 02 Python
Python实现对文件进行单词划分并去重排序操作示例
Jul 10 Python
Python全排列操作实例分析
Jul 24 Python
python文本数据处理学习笔记详解
Jun 17 Python
python 反编译exe文件为py文件的实例代码
Jun 27 Python
Python求离散序列导数的示例
Jul 10 Python
python实现数据清洗(缺失值与异常值处理)
Dec 02 Python
python3中numpy函数tile的用法详解
Dec 04 Python
Python使用指定字符长度切分数据示例
Dec 05 Python
python 错误处理 assert详解
Apr 20 Python
解决python中import文件夹下面py文件报错问题
Jun 01 Python
Python关于OS文件目录处理的实例分享
May 23 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
PhpMyAdmin出现export.php Missing parameter: what /export_type错误解决方法
2012/08/09 PHP
php一些错误处理的方法与技巧总结
2013/08/10 PHP
thinkphp数据查询和遍历数组实例
2014/11/28 PHP
thinkphp3.2.3版本的数据库增删改查实现代码
2016/09/22 PHP
php结合ajax实现手机发红包的案例
2016/10/13 PHP
laravel框架分组控制器和分组路由实现方法示例
2020/01/25 PHP
用js得到网页中所有的div的id
2020/10/19 Javascript
让textarea控件的滚动条怎是位与最下方
2007/04/20 Javascript
jQuery Ajax 全解析
2009/02/08 Javascript
Mootools 1.2教程(3) 数组使用简介
2009/09/14 Javascript
jQuery语法总结和注意事项小结
2012/11/11 Javascript
下拉菜单点击实现连接跳转功能的js代码
2013/05/19 Javascript
javascript中call和apply的用法示例分析
2015/04/02 Javascript
JQuery使用index方法获取Jquery对象数组下标的方法
2015/05/18 Javascript
js实现文本框支持加减运算的方法
2015/08/19 Javascript
想学习javascript JS和jQuery哪个重要 先学哪个
2016/12/11 Javascript
JQuery Dialog对话框 不能通过Esc关闭的原因分析及解决办法
2017/01/18 Javascript
vuejs手把手教你写一个完整的购物车实例代码
2017/07/06 Javascript
详解React-Native解决键盘遮挡问题(Keyboard遮挡问题)
2017/07/13 Javascript
jQuery实现checkbox的简单操作
2017/11/18 jQuery
对angular 实时更新模板视图的方法$apply详解
2018/10/09 Javascript
vue + any-touch实现一个iscroll 实现拖拽和滑动动画效果
2019/04/08 Javascript
Vue源码学习之关于对Array的数据侦听实现
2019/04/23 Javascript
jQuery实现移动端扭蛋机抽奖
2020/11/08 jQuery
vue3 watch和watchEffect的使用以及有哪些区别
2021/01/26 Vue.js
Python 自动安装 Rising 杀毒软件
2009/04/24 Python
python 利用百度API识别图片文字(多线程版)
2020/12/14 Python
美国沃尔玛网上超市:Walmart
2020/08/14 全球购物
商场中秋节活动方案
2014/02/07 职场文书
会计助理岗位职责
2014/02/17 职场文书
养生餐厅创业计划书范文
2014/03/26 职场文书
代理人委托书
2014/09/16 职场文书
小学生禁毒教育心得体会
2016/01/15 职场文书
在Java中Collection的一些常用方法总结
2021/06/13 Java/Android
Nginx使用Lua模块实现WAF的原理解析
2021/09/04 Servers
xhunter1.sys可以删除嘛? win11提示xhunter1.sys驱动不兼容解决办法
2022/09/23 数码科技