本文实例讲述了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 %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程序设计有所帮助。