基于使用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爬虫之抓取百度贴吧代码分享
Nov 06 Python
怎么使用pipenv管理你的python项目
Mar 12 Python
Python基于Floyd算法求解最短路径距离问题实例详解
May 16 Python
解决Pycharm中import时无法识别自己写的程序方法
May 18 Python
python实现简单登陆系统
Oct 18 Python
Python PIL读取的图像发生自动旋转的实现方法
Jul 05 Python
python字符串分割及字符串的一些常规方法
Jul 24 Python
python修改FTP服务器上的文件名
Sep 11 Python
Python列表元素常见操作简单示例
Oct 25 Python
Python编程快速上手——Excel到CSV的转换程序案例分析
Feb 28 Python
教你使用Pandas直接核算Excel中快递费用
May 12 Python
Python Flask搭建yolov3目标检测系统详解流程
Nov 07 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安全之直接用$获取值而不$_GET 字符转义
2012/06/03 PHP
无JS,完全php面向过程数据分页实现代码
2012/08/27 PHP
mysqli_set_charset和SET NAMES使用抉择及优劣分析
2013/01/13 PHP
jQuery+php实现ajax文件即时上传的详解
2013/06/17 PHP
PHP解压tar.gz格式文件的方法
2016/02/14 PHP
YII分模块加载路由的实现方法
2018/10/01 PHP
js中数组排序sort方法的原理分析
2014/11/20 Javascript
JS仿淘宝实现的简单滑动门效果代码
2015/10/14 Javascript
angularJS与bootstrap结合实现动态加载弹出提示内容
2015/10/16 Javascript
AngularJS上拉加载问题解决方法
2016/05/23 Javascript
关于js二维数组和多维数组的定义声明(详解)
2016/10/02 Javascript
jQuery的 $.ajax防止重复提交的两种方法(推荐)
2016/10/14 Javascript
javascript设计模式之中介者模式学习笔记
2017/02/15 Javascript
Promise.all中对于reject的处理方法
2018/08/01 Javascript
js拖动滑块和点击水波纹效果实例代码
2018/10/16 Javascript
微信小程序 点击切换样式scroll-view实现代码实例
2019/10/11 Javascript
vue中父子组件的参数传递和应用示例
2021/01/04 Vue.js
利用JavaScript为句子加标题的3种方法示例
2021/01/05 Javascript
精确查找PHP WEBSHELL木马的方法(1)
2011/04/12 Python
python实现爬虫统计学校BBS男女比例(一)
2015/12/31 Python
Python中Threading用法详解
2017/12/27 Python
python ansible服务及剧本编写
2017/12/29 Python
解决Shell执行python文件,传参空格引起的问题
2018/10/30 Python
python实现AES加密与解密
2019/03/28 Python
Atom Python 配置Python3 解释器的方法
2019/08/28 Python
python 利用opencv实现图像网络传输
2020/11/12 Python
在HTML5中如何使用CSS建立不可选的文字
2014/10/17 HTML / CSS
澳洲Chemist Direct药房中文网:澳洲大型线上直邮药房
2019/11/04 全球购物
string = null 和string = ''的区别
2013/04/28 面试题
什么是会话Bean
2015/05/14 面试题
应届生程序员求职信
2013/11/05 职场文书
申请任职学生会干部自荐书范文
2014/02/13 职场文书
酒店管理毕业生自我鉴定
2014/03/02 职场文书
师德师风建设方案
2014/05/08 职场文书
导游词之太行山青龙峡
2020/01/14 职场文书
详解Go语言中配置文件使用与日志配置
2022/06/01 Golang