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之编写类之四再论继承
Oct 11 Python
python简单程序读取串口信息的方法
Mar 13 Python
Python面向对象编程中的类和对象学习教程
Mar 30 Python
Python的Django框架中settings文件的部署建议
May 30 Python
python 统计代码行数简单实例
May 04 Python
Python基础学习之常见的内建函数整理
Sep 06 Python
python 文件转成16进制数组的实例
Jul 09 Python
tensor和numpy的互相转换的实现示例
Aug 02 Python
python自动结束mysql慢查询会话的实例代码
Oct 27 Python
Python PyPDF2模块安装使用解析
Jan 19 Python
python连接mongodb集群方法详解
Feb 13 Python
用python实现一个简单计算器(完整DEMO)
Oct 14 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
为IP查询添加GOOGLE地图功能的代码
2010/08/08 PHP
优化php效率,提高php性能的一些方法
2011/03/24 PHP
php简单图像创建入门实例
2015/06/10 PHP
laravel dingo API返回自定义错误信息的实例
2019/09/29 PHP
jQuery数据显示插件整合实现代码
2011/10/24 Javascript
定时器(setTimeout/setInterval)调用带参函数失效解决方法
2013/03/26 Javascript
js实现拉伸拖动iframe的具体代码
2013/08/03 Javascript
利用jQuary实现文字浮动提示效果示例代码
2013/12/26 Javascript
jQuery简单实现禁用右键菜单
2015/03/10 Javascript
JavaScript前补零操作实例
2015/03/11 Javascript
JS动态插入并立即执行回调函数的方法
2016/04/21 Javascript
js实现方块上下左右移动效果
2017/08/17 Javascript
Bootstrap Fileinput 4.4.7文件上传实例详解
2018/07/25 Javascript
vue-cli3.0使用及部分配置详解
2018/08/29 Javascript
layui 根据后台数据动态创建下拉框并同时默认选中的实例
2019/09/02 Javascript
云服务器部署Node.js项目的方法步骤(小白系列)
2020/03/23 Javascript
vue全局使用axios的操作
2020/09/08 Javascript
python中 logging的使用详解
2017/10/25 Python
Python用csv写入文件_消除空余行的方法
2018/07/06 Python
selenium+python 对输入框的输入处理方法
2018/10/11 Python
对python pandas 画移动平均线的方法详解
2018/11/28 Python
python列表使用实现名字管理系统
2019/01/30 Python
Django给admin添加Action的步骤详解
2019/05/01 Python
如何用Python制作微信好友个性签名词云图
2019/06/28 Python
python 图片二值化处理(处理后为纯黑白的图片)
2019/11/01 Python
使用Keras加载含有自定义层或函数的模型操作
2020/06/10 Python
html5 利用canvas实现超级玛丽简单动画
2013/09/06 HTML / CSS
英国领先的维生素和营养补充剂直接供应商:Healthspan
2019/04/22 全球购物
个人简历中的自我评价范例
2013/10/29 职场文书
专业销售业务员求职信
2013/11/18 职场文书
毕业实习个人鉴定范文
2013/12/10 职场文书
好军嫂事迹材料
2014/01/15 职场文书
解除劳动合同协议书范本
2014/04/14 职场文书
大学生学雷锋活动总结
2014/06/26 职场文书
python自动化调用百度api解决验证码
2021/04/13 Python
CSS子盒子水平和垂直居中的五种方法
2022/07/23 HTML / CSS