视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
python通过ssh-powershell监控windows的方法
2020-11-27 14:41:12 责编:小采
文档


本文实例讲述了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('
','').split('
')
 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('
','').split('
')
 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('
','').split('
')
 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('
','').replace('
','')
 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('
','').split('-- -----------')[-1].split('
')
 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('
','').split('PID')[-1].split('
')
 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 "



"
# print ssh.ssh_disk()
# print "



"
# print ssh.ssh_memory()
# print ssh.ssh_ping(host)
# print ssh.ssh_ps()
# print ssh.ssh_netstat()

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

下载本文
显示全文
专题