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中使用HTMLParser解析HTML的教程
Apr 29 Python
Python的string模块中的Template类字符串模板用法
Jun 27 Python
Python实现的微信公众号群发图片与文本消息功能实例详解
Jun 30 Python
快速解决pandas.read_csv()乱码的问题
Jun 15 Python
Python调用graphviz绘制结构化图形网络示例
Nov 22 Python
Python读取YAML文件过程详解
Dec 30 Python
详解python 降级到3.6终极解决方案
Feb 06 Python
浅谈spring boot 集成 log4j 解决与logback冲突的问题
Feb 20 Python
在matplotlib中改变figure的布局和大小实例
Apr 23 Python
python中pathlib模块的基本用法与总结
Aug 17 Python
Python开发.exe小工具的详细步骤
Jan 27 Python
python 实现图片裁剪小工具
Feb 02 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
解决file_get_contents无法请求https连接的方法
2013/12/17 PHP
php获取本周星期一具体日期的方法
2015/04/20 PHP
PHP 开发者该知道的 5 个 Composer 小技巧
2016/02/03 PHP
Joomla开启SEF的方法
2016/05/04 PHP
PHP自定义函数获取汉字首字母的方法
2016/12/01 PHP
php设计模式之策略模式应用案例详解
2019/06/17 PHP
关于firefox的ElementTraversal 接口 使用说明
2010/11/11 Javascript
JS焦点图切换,上下翻转
2011/05/12 Javascript
在表单提交前进行验证的几种方式整理
2013/07/31 Javascript
JS实现网页标题栏显示当前时间和日期的完整代码
2015/11/02 Javascript
JavaScript实现下拉菜单的显示和隐藏
2016/01/05 Javascript
Bootstrap学习笔记之css样式设计(1)
2016/06/07 Javascript
JS中跨页面调用变量和函数的方法(例如a.js 和 b.js中互相调用)
2016/11/01 Javascript
jQuery双向列表选择器select版
2016/11/01 Javascript
jquery 输入框查找关键字并提亮颜色的实例代码
2018/01/23 jQuery
vue-cli 3.x 修改dist路径的方法
2018/09/19 Javascript
JavaScript文本特效实例小结【3个示例】
2018/12/22 Javascript
React实现阿里云OSS上传文件的示例
2020/08/10 Javascript
[45:25]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.22
2019/09/05 DOTA
python计算最大优先级队列实例
2013/12/18 Python
Python的Django框架中TEMPLATES项的设置教程
2015/05/29 Python
Python的Django框架中的数据过滤功能
2015/07/17 Python
Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
2016/09/21 Python
Python3调用微信企业号API发送文本消息代码示例
2017/11/10 Python
基于python历史天气采集的分析
2019/02/14 Python
Python读取xlsx文件的实现方法
2019/07/04 Python
四种会话跟踪技术
2015/05/20 面试题
市委常委班子党的群众路线教育实践活动整改措施
2014/10/02 职场文书
高校自主招生教师推荐信
2015/03/23 职场文书
张思德观后感
2015/06/09 职场文书
入团申请书格式
2019/06/20 职场文书
教您怎么制定西餐厅运营方案 ?
2019/07/05 职场文书
创业计划书之旅游网站
2019/09/06 职场文书
python - timeit 时间模块
2021/04/06 Python
pandas取dataframe特定行列的实现方法
2021/05/24 Python
浅谈resultMap的用法及关联结果集映射
2021/06/30 Java/Android