本文實例講述了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:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 #! /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 %