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