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数组的处理代码
Jan 04 Python
Python自定义类的数组排序实现代码
Aug 28 Python
浅谈Python爬取网页的编码处理
Nov 04 Python
使用pandas对矢量化数据进行替换处理的方法
Apr 11 Python
深入flask之异步非堵塞实现代码示例
Jul 31 Python
python绘制散点图并标记序号的方法
Dec 11 Python
Python学习笔记之For循环用法详解
Aug 14 Python
linux下python中文乱码解决方案详解
Aug 28 Python
python GUI库图形界面开发之PyQt5布局控件QVBoxLayout详细使用方法与实例
Mar 06 Python
Python基于Tkinter编写crc校验工具
May 06 Python
python解压zip包中文乱码解决方法
Nov 27 Python
python中的列表和元组区别分析
Dec 30 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分页的功能模块
2015/06/16 PHP
JavaScript OOP类与继承
2009/11/15 Javascript
js页面跳转常用的几种方式
2010/11/25 Javascript
重载toString实现JS HashMap分析
2011/03/13 Javascript
真正的JQuery.ajax传递中文参数的解决方法
2011/05/28 Javascript
如何将网页表格内容导入excel
2014/02/18 Javascript
jquery通过select列表选择框对表格数据进行过滤示例
2014/05/07 Javascript
Javascript的严格模式strict mode详细介绍
2014/06/06 Javascript
JavaScript判断前缀、后缀是否是空格的方法
2015/04/15 Javascript
JavaScript中的lastIndexOf()方法使用详解
2015/06/06 Javascript
详解jQuery中的元素的属性和相关操作
2015/08/14 Javascript
微信小程序 wxapp内容组件 progress详细介绍
2016/10/31 Javascript
jQuery 开发之EasyUI 添加数据的实例
2017/09/26 jQuery
ES6下子组件调用父组件的方法(推荐)
2018/02/23 Javascript
vue slot 在子组件中显示父组件传递的模板
2018/03/02 Javascript
React中使用外部样式的3种方式(小结)
2019/05/28 Javascript
json解析大全 双引号、键值对不在一起的情况
2019/12/06 Javascript
vue+iview使用树形控件的具体使用
2020/11/02 Javascript
三剑客:offset、client和scroll还傻傻分不清?
2020/12/04 Javascript
JS操作JSON常用方法(10w阅读)
2020/12/06 Javascript
Python实现查找系统盘中需要找的字符
2015/07/14 Python
python采用django框架实现支付宝即时到帐接口
2016/05/17 Python
浅谈python新手中常见的疑惑及解答
2016/06/14 Python
python破解zip加密文件的方法
2018/05/31 Python
Django中create和save方法的不同
2019/08/13 Python
用python写爬虫简单吗
2020/07/28 Python
HTML5在canvas中绘制复杂形状附效果截图
2014/06/23 HTML / CSS
中学生个人自我评价
2014/02/06 职场文书
外联部演讲稿
2014/05/24 职场文书
教师党的群众路线对照检查材料
2014/09/24 职场文书
元旦标语大全
2014/10/09 职场文书
2014年学校禁毒工作总结
2014/12/23 职场文书
2015年体育部工作总结
2015/04/02 职场文书
2015年大学班长个人工作总结
2015/04/24 职场文书
分享node.js实现简单登录注册的具体代码
2022/04/26 NodeJs
python中pd.cut()与pd.qcut()的对比及示例
2022/06/16 Python