python通过ssh-powershell监控windows的方法


Posted in Python onJune 02, 2015

本文实例讲述了python通过ssh-powershell监控windows的方法。分享给大家供大家参考。具体分析如下:

对于服务器的监控来说,监控linux不管是自己动手写脚本还是用一些开源的工具比如nagios,zenoss什么的。但毕竟还是有些公司有windows做服务器的,相对linux来说,windows没有方便的shell,cmd下提供的命令对于监控来说远远没有linux方便。但是现在windows上如果安装了powershell(win7,2008自带),就比以前方便多了,linux上的命令基本都能在powershell里执行,比如查看进程还是ps.

自己封装了一个python通过ssh(通过pexpect模块)调用powershell的脚本,里面包快ps,netstat,ping检测,查看硬盘,cpu信息和负载,内存信息。通过创建ssh_win32类对象,然后调用它的方法,返回的都是解析好的python对象。

ssh_powershell.py:

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import re
from pexpect import *
class ssh_win32:
  def __init__(self, user, host, password=None,systemroot='c',papath='',timeout=5,verbose=0):
    self.user = user#监控机器的username
    self.host = host#监控机器的ip
    self.verbose = verbose
    self.password = password#密码
    self.timeout=timeout#执行命令的timeout
    self.systemroot=systemroot#windows 所安装的盘符
    if not papath:#powershell.exe的路径
self.powershell_path=self.systemroot+':/WINDOWS/system32/WindowsPowerShell/v1.0/powershell.exe '
    self.key = [
      'authenticity',
      'assword:',
      '@@@@@@@@@@@@',
      'Command not found.',
      EOF,
      ]
    self.f = open('ssh.out','w')
  def ssh(self,command):
    cmd='ssh -l %s %s %s'%(self.user,self.host,command)
    print "cmd:",cmd
    con=spawn(cmd,timeout=self.timeout)
    seen=con.expect(self.key)
    if seen == 0:
      con.sendline('yes')
      seen = con.expect(self.key)
    if seen == 1:
  #    if not self.password:
  #      self.password = getpass.getpass('Remote password: ')
      con.sendline(self.password)
      try:
        res=con.read()
      except Exception ,e:
        res=con.before
#      print "res:",res
    return res
  def ssh_disk(self):
    cmd=self.powershell_path+"Get-WmiObject win32_logicaldisk"
    res=self.ssh(cmd)
    disk={}
    if res:
      res=res.split('No such file or directory')[-1].replace('\r','').split('\n')
      res=[c for c in res if c]
#      print 'res:',res
    predisk='C'
    for d in res:
#      print d
      key,value=d.split(':',1)
#      print d
#      print 'key:',key,'value:',value
      key=key.strip()
      value=value.strip()
      if key=='DeviceID' and value not in disk.keys():
        predisk=value
        disk[predisk]={}
        disk[predisk][key]=value
      else:
        if key in ['FreeSpace','Size']:
          if value:
            value=int(value)/1024/1024/1024
        disk[predisk][key]=value
    for d in disk.keys():
      if disk[d]['DriveType']!='3':
        disk.pop(d)
#    print 'disk:',disk
    return disk
  def ssh_cpu(self): 
    cmd=self.powershell_path+'gwmi -computername localhost win32_Processor'
    res=self.ssh(cmd)
    res=res.split('No such file or directory')[-1].replace('\r','').split('\n')
    res=[r for r in res if r]
#    print res
    cpu={}
    for i in res:
#      print '='*10
#      print i
      i=i.split(':')
    #  print i
      if len(i)==2:
        key,value=i
      else:
        continue
      key=key.strip()
      value=value.strip()
#      print 'key:',key
#      print 'value:',value
      cpu[key]=value
    return cpu
  def ssh_memory(self):
    totalmem=self.powershell_path+'Get-WmiObject win32_OperatingSystem TotalVisibleMemorySize'
    freemem=self.powershell_path+'Get-WmiObject win32_OperatingSystem FreePhysicalMemory'
    memory={}
    for cmd in [totalmem,freemem]:
      res=self.ssh(cmd)
      if 'Win32_OperatingSystem' in res:
        res=res=res.replace('\r','').split('\n')
        res=[m for m in res if m][-1]
        print 'res:',res
        key,value=res.split(':')
        key=key.strip()
        value=value.strip()
        memory[key]=value
      else:
        print "not return data"
        return None
    return memory
  def ssh_ping(self,host):
    cmd='ping -n 1 %s'%host
    patt=r'.+?(\d*)% loss.*'
    res=self.ssh(cmd).replace('\r','').replace('\n','')
    print res
    m=re.match(patt,res)
    if m:
      lost_percent=m.group(1)
      print 'lost_percent:',lost_percent
      return int(lost_percent)
    else:
      return None
  def ssh_ps(self):
    cmd=self.powershell_path+'ps'
    res=self.ssh(cmd)
    ps=[]
    if '-- -----------' in res:
      res=res.replace('\r','').split('-- -----------')[-1].split('\n')
      res=[d for d in res if d.strip()]
      for p in res:
        process={}
        row=[para for para in p.split(' ') if para.strip()]
        process['handles']=row[0]
        process['npm']=row[1]
        process['pm']=row[2]
        process['ws']=row[3]
        process['vm']=row[4]
        process['cpu']=row[5]
        process['id']=row[6]
        process['process_name']=row[-1]
        ps.append(process)
#      print ps
      return ps
    else:
      return None
  def ssh_netstat(self):
    cmd='netstat -ao'
    res=self.ssh(cmd)
    netstat=[]
    if 'PID' in res:
      res=res.replace('\r','').split('PID')[-1].split('\n')
      res=[d for d in res if d.strip()]
      for p in res:
        process={}
        row=[para for para in p.split(' ') if para.strip()]
        process['proto']=row[0]
        process['local_address']=row[1]
        process['foreign_address']=row[2]
        process['state']=row[3]
        process['pid']=row[-1]
        netstat.append(process)
#      print netstat
      return netstat
    else:
      return None
if __name__ == "__main__":
cmd="c:/WINDOWS/system32/WindowsPowerShell/v1.0/powershell.exe ps"
  user='admin'
  host='192.168.123.105'
  password='123456'
  ssh=ssh_win32(user,host,password,systemroot='c',timeout=5)
#  print ssh.ssh_cpu()
#  print "\n\n\n\n"
#  print ssh.ssh_disk()
#  print "\n\n\n\n"
#  print ssh.ssh_memory()
#  print ssh.ssh_ping(host)
#  print ssh.ssh_ps()
#  print ssh.ssh_netstat()

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
简单的抓取淘宝图片的Python爬虫
Dec 25 Python
使用Python脚本来获取Cisco设备信息的示例
May 04 Python
不要用强制方法杀掉python线程
Feb 26 Python
使用python爬虫实现网络股票信息爬取的demo
Jan 05 Python
简单实现python画圆功能
Jan 25 Python
python 识别图片中的文字信息方法
May 10 Python
Python中模块(Module)和包(Package)的区别详解
Aug 07 Python
Python assert关键字原理及实例解析
Dec 13 Python
Pyecharts绘制全球流向图的示例代码
Jan 08 Python
基于python实现获取网页图片过程解析
May 11 Python
Django 解决distinct无法去除重复数据的问题
May 20 Python
Python3.7安装PyQt5 运行配置Pycharm的详细教程
Oct 15 Python
Python lxml模块安装教程
Jun 02 #Python
Python脚本文件打包成可执行文件的方法
Jun 02 #Python
python统计cpu利用率的方法
Jun 02 #Python
Python2.x中文乱码问题解决方法
Jun 02 #Python
python实现的守护进程(Daemon)用法实例
Jun 02 #Python
Python中使用ElementTree解析XML示例
Jun 02 #Python
Python文档生成工具pydoc使用介绍
Jun 02 #Python
You might like
用PHP调用Oracle存储过程的方法
2008/09/12 PHP
利用PHP+JS实现搜索自动提示(实例)
2013/06/09 PHP
javascript replace方法与正则表达式
2008/02/19 Javascript
javascript 关于# 和 void的区别分析
2009/10/26 Javascript
jquery下异步提交表单 异步跨域提交表单
2010/11/17 Javascript
js函数的引用, 关于内存的开销
2012/09/17 Javascript
固定背景实现的背景滚动特效示例分享
2013/05/19 Javascript
批量实现面向对象的实例代码
2013/07/01 Javascript
js获取客户端网卡的IP地址、MAC地址
2014/03/26 Javascript
基于JavaScript实现屏幕滚动效果
2017/01/18 Javascript
node使用UEditor富文本编辑器的方法实例
2017/07/11 Javascript
Node.js 使用AngularJS的方法示例
2018/05/11 Javascript
详解webpack打包第三方类库的正确姿势
2018/10/20 Javascript
vue-cli构建vue项目的步骤详解
2019/01/27 Javascript
解决微信浏览器缓存站点入口文件(IIS部署Vue项目)
2019/06/17 Javascript
深入解析Python设计模式编程中建造者模式的使用
2016/03/02 Python
python3 与python2 异常处理的区别与联系
2016/06/19 Python
浅谈django的render函数的参数问题
2018/10/16 Python
python类的实例化问题解决
2019/08/31 Python
python 实现目录复制的三种小结
2019/12/04 Python
日本一家专门经营各种箱包的大型网站:Traveler Store
2016/08/03 全球购物
中国领先的专业演出票务网:永乐票务
2016/08/29 全球购物
德国的大型美妆个护电商:Flaconi
2020/06/26 全球购物
基于Python 函数和方法的区别说明
2021/03/24 Python
毕业自我鉴定范文
2013/11/06 职场文书
韩国商务邀请函
2014/01/14 职场文书
大二学生学习个人自我评价
2014/01/19 职场文书
司法局火灾防控方案
2014/06/05 职场文书
小学教师读书活动总结
2014/07/08 职场文书
民事诉讼授权委托书范文
2014/08/02 职场文书
安全演讲稿开场白
2014/08/25 职场文书
房屋租赁委托书范本
2014/10/04 职场文书
2015年爱国卫生月活动总结
2015/03/26 职场文书
HTML5+CSS+JavaScript实现捉虫小游戏设计和实现
2021/10/16 HTML / CSS
Golang数据类型和相互转换
2022/04/12 Golang
Java结构型设计模式之组合模式详解
2022/09/23 Java/Android