前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python通过ssh-powershell监控windows

python通过ssh-powershell监控windows

原创
作者头像
大师级码师
修改2021-11-02 13:36:42
8330
修改2021-11-02 13:36:42
举报
文章被收录于专栏:大师级码师大师级码师

对于服务器的监控来说,监控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

代码语言:javascript
复制
#! /usr/bin/env python
-- coding: utf-8 --
Author:pako
Email:zealzpc@gmail.com
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()</pre>

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档