0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用Python通过SNMP监控网络设备?

网络技术干货圈 来源:博客园-lyshark 2023-01-09 10:38 次阅读

前段时间,为了实现自动化巡检,我开发了自动化巡检工具,由于我的系统设备版本比较多,所以我是分别开发的客户端程序,服务端使用dll文件与客户端通信,服务端的dll在与python通信,通过Python丰富的第三方库,实现绘图入库等,该方式比较繁琐,我们管理的设备还有一些网络设备,这些设备无法通过开发程序来实现监控,为了实现全平台全设备监控,我决定使用SNMP实现监控任务。

首先需要在系统中安装SNMP客户端,对于Linux平台来说只需要执行如下配置过程即可.

[root@localhost~]#yuminstall-ynet-snmp
[root@localhost~]#cat/etc/snmp/snmpd.conf|grep-vE"^#|^$"
com2secnotConfigUserdefaultpublic

groupnotConfigGroupv1notConfigUser
groupnotConfigGroupv2cnotConfigUser

viewsystemviewincluded.1
viewsystemviewincluded.1

accessnotConfigGroup""anynoauthexactsystemviewnonenone

[root@localhost~]#systemctlrestartsnmpd
[root@localhost~]#systemctlenablesnmpd

如果是Windows系统则需要在客户机服务列表,开启SNMP支持,并设置好一个团体名称,如下图。

a1555556-8e58-11ed-bfe3-dac502259ad0.png

当我们配置好客户端后,服务端就客户获取数据了,我们以一个OID序号为例,我们查询特定序号对应的名称,然后将其记录下来,例如下面这样。

a17449ca-8e58-11ed-bfe3-dac502259ad0.png

首先我们不适用PySNMP模块直接开线程调用看看,该代码如下所示.

importos,re,time

#通过SNMP收集主机CPU利用率:通过SNMP协议,收集目标主机的CPU利用率(百分比),并返回JSON字符串.
defGet_CPU_Info(addr):
try:
Head=["HostName","CoreLoad","CpuUser","CpuSystem","CpuIdle"]
CPU=[]
ret=os.popen("snmpwalk-v2c-cnmap"+addr+".1.3.6.1.2.1.1.5")
CPU.append(ret.read().split(":")[3].strip())
ret=os.popen("snmpwalk-v2c-cnmap"+addr+".1.3.6.1.2.1.25.3.3.1.2")
CPU.append(ret.read().split(":")[3].strip())

foriin[9,10,11]:
ret=os.popen("snmpwalk-v2c-cnmap"+addr+"1.3.6.1.4.1.2021.11.{}.0".format(i))
ret=ret.read()
Info=ret.split(":")[3].strip()
CPU.append(Info)
returndict(zip(Head,CPU))
exceptException:
return0

#通过SNMP获取系统CPU负载信息:分别获取到系统的1,5,15分钟的负载信息,并返回JSON格式.
defGet_Load_Info(addr):
try:
Head=["HostName","Load1","Load5","Load15"]
SysLoad=[]
ret=os.popen("snmpwalk-v2c-cnmap"+addr+".1.3.6.1.2.1.1.5")
SysLoad.append(ret.read().split(":")[3].strip())

ret=os.popen("snmpwalk-v2c-cnmap"+addr+".1.3.6.1.4.1.2021.10.1.3")
load=list(re.sub(".*STRING:","",ret.read()).split("
"))
SysLoad.append(load[0])
SysLoad.append(load[1])
SysLoad.append(load[2])
returndict(zip(Head,SysLoad))
exceptException:
return0

#通过SNMP获取系统内存占用:内存利用率,获取到之后,将其转化为字典格式保存。
defGet_Mem_Info(addr):
try:
Head=["HostName","memTotalSwap","memAvailSwap","memTotalReal","memTotalFree"]
SysMem=[]
ret=os.popen("snmpwalk-v2c-cnmap"+addr+".1.3.6.1.2.1.1.5")
SysMem.append(ret.read().split(":")[3].strip())
ret=os.popen("snmpwalk-v2c-cnmap"+addr+".1.3.6.1.4.1.2021.4")
mem=ret.read().split("
")
foriin[2,3,4,6]:
SysMem.append(re.sub(".*INTEGER:","",mem[i]).split("")[0])
returndict(zip(Head,SysMem))
exceptException:
return0

#通过SNMP获取系统磁盘数据:这个案例并不完整,我只写了一点,后面有个问题一直没有解决.
defGet_Disk_Info(addr):
try:
dic={}
list=[]
ret=os.popen("snmpwalk-v2c-cnmap"+addr+"HOST-RESOURCES-MIB::hrStorageDescr")
DiskName=ret.read().split("
")
ret=os.popen("snmpwalk-v2c-cnmap"+addr+"HOST-RESOURCES-MIB::hrStorageUsed")
DiskUsed=ret.read().split("
")
ret=os.popen("snmpwalk-v2c-cnmap"+addr+"HOST-RESOURCES-MIB::hrStorageSize")
DiskSize=ret.read().split("
")

foriinrange(1,len(DiskName)-7):
dic["Name"]=DiskName[i+5].split(":")[3]
dic["Used"]=DiskUsed[i+5].split(":")[3]
dic["Size"]=DiskSize[i+5].split(":")[3]
list.append(dic)
returnlist
exceptException:
return0

if__name__=='__main__':
foriinrange(100):
dic=Get_CPU_Info("192.168.1.20")
print(dic)
time.sleep(1)

通过SNMP收集主机CPU利用率 通过SNMP协议,收集目标主机的CPU利用率(百分比),并返回JSON字符串.

importos,re,time

defGet_CPU_Info(addr):
try:
Head=["HostName","CoreLoad","CpuUser","CpuSystem","CpuIdle"]
CPU=[]
ret=os.popen("snmpwalk-v2c-cnmap"+addr+".1.3.6.1.2.1.1.5")
CPU.append(ret.read().split(":")[3].strip())
ret=os.popen("snmpwalk-v2c-cnmap"+addr+".1.3.6.1.2.1.25.3.3.1.2")
CPU.append(ret.read().split(":")[3].strip())

foriin[9,10,11]:
ret=os.popen("snmpwalk-v2c-cnmap"+addr+"1.3.6.1.4.1.2021.11.{}.0".format(i))
ret=ret.read()
Info=ret.split(":")[3].strip()
CPU.append(Info)
returndict(zip(Head,CPU))
exceptException:
return0

if__name__=='__main__':
foriinrange(100):
dic=Get_CPU_Info("192.168.1.20")
print(dic)
time.sleep(1)

通过SNMP获取系统CPU负载信息 分别获取到系统的1,5,15分钟的负载信息,并返回JSON格式.

importos,re,time

defGet_Load_Info(addr):
try:
Head=["HostName","Load1","Load5","Load15"]
SysLoad=[]
ret=os.popen("snmpwalk-v2c-cnmap"+addr+".1.3.6.1.2.1.1.5")
SysLoad.append(ret.read().split(":")[3].strip())

ret=os.popen("snmpwalk-v2c-cnmap"+addr+".1.3.6.1.4.1.2021.10.1.3")
load=list(re.sub(".*STRING:","",ret.read()).split("
"))
SysLoad.append(load[0])
SysLoad.append(load[1])
SysLoad.append(load[2])
returndict(zip(Head,SysLoad))
exceptException:
return0

if__name__=='__main__':
dic=Get_Load_Info("192.168.1.20")
print(dic)

通过SNMP获取系统内存占用 内存利用率,获取到之后,将其转化为字典格式保存。

importos,re,time

defGet_Mem_Info(addr):
try:
Head=["HostName","memTotalSwap","memAvailSwap","memTotalReal","memTotalFree"]
SysMem=[]
ret=os.popen("snmpwalk-v2c-cnmap"+addr+".1.3.6.1.2.1.1.5")
SysMem.append(ret.read().split(":")[3].strip())
ret=os.popen("snmpwalk-v2c-cnmap"+addr+".1.3.6.1.4.1.2021.4")
mem=ret.read().split("
")
foriin[2,3,4,6]:
SysMem.append(re.sub(".*INTEGER:","",mem[i]).split("")[0])
returndict(zip(Head,SysMem))
exceptException:
return0

if__name__=='__main__':
dic=Get_Mem_Info("192.168.1.20")
print(dic)

通过SNMP获取系统磁盘数据 这个案例并不完整,我只写了一点,后面有个问题一直没有解决.

importos,re,time

defGet_Disk_Info(addr):
try:
dic={}
list=[]
ret=os.popen("snmpwalk-v2c-cnmap"+addr+"HOST-RESOURCES-MIB::hrStorageDescr")
DiskName=ret.read().split("
")
ret=os.popen("snmpwalk-v2c-cnmap"+addr+"HOST-RESOURCES-MIB::hrStorageUsed")
DiskUsed=ret.read().split("
")
ret=os.popen("snmpwalk-v2c-cnmap"+addr+"HOST-RESOURCES-MIB::hrStorageSize")
DiskSize=ret.read().split("
")

foriinrange(1,len(DiskName)-7):
dic["Name"]=DiskName[i+5].split(":")[3]
dic["Used"]=DiskUsed[i+5].split(":")[3]
dic["Size"]=DiskSize[i+5].split(":")[3]
list.append(dic)
returnlist
exceptException:
return0

if__name__=='__main__':
list=Get_Disk_Info("192.168.1.20")
print(list)

接下来,我们使用pysnmp模块来做,安装pysnmp很简单,执行命令pip install pysnmp即可,安装后,使用以下代码执行即可获取到目标数据,网上的那些转载的都是坑,没一个能用的,这个案例是官方案例,可以使用。

frompysnmp.hlapiimport*

iterator=getCmd(SnmpEngine(),
CommunityData('public'),
UdpTransportTarget(('192.168.1.113',161)),
ContextData(),
ObjectType(ObjectIdentity('SNMPv2-MIB','sysDescr',0)))

errorIndication,errorStatus,errorIndex,varBinds=next(iterator)

iferrorIndication:
print(errorIndication)
else:
iferrorStatus:
print('%sat%s'%(errorStatus.prettyPrint(),varBinds[int(errorIndex)-1]iferrorIndexelse'?'))
else:
forvarBindinvarBinds:
print('='.join([x.prettyPrint()forxinvarBind]))

首先我们以一个OID序号为例,我们查询特定序号对应的名称,然后将其记录下来,例如下面这样。

a17449ca-8e58-11ed-bfe3-dac502259ad0.png

在客户机上面,需要在服务列,开启SNMP支持,并设置好一个团体名称,如下图。

a1555556-8e58-11ed-bfe3-dac502259ad0.png

然后我们简单的封装一个类,先来测试一下是否能通。

#snmpwalk-v2c-cpublic192.168.1.113.1.3.6.1.2.1.1.5
frompysnmp.hlapiimport*


classNetSNMP():
def__init__(self,address,region):
self.region=region
self.address=address

#获取指定数据的方法
defGetNumber(self,oid,sub_oid,sub_id):
iterator=getCmd(SnmpEngine(),
CommunityData(self.region),
UdpTransportTarget((self.address,161)),
ContextData(),
ObjectType(ObjectIdentity(oid,sub_oid,sub_id)))
errorIndication,errorStatus,errorIndex,varBinds=next(iterator)

iferrorIndication:
returnFalse
else:
iferrorStatus:
returnFalse
else:
forvarBindinvarBinds:
return[x.prettyPrint()forxinvarBind]

if__name__=="__main__":

#初始化
ptr=NetSNMP("192.168.1.101","public")

#设置OID数据集
ret=ptr.GetNumber("HOST-RESOURCES-MIB","hrMemorySize",0)
print("类型:{}-->返回结果:{}-->解析:{}".format(type(ret),ret,ret[1]))

运行后,即可读取到内存数据,如下。

a1b54c90-8e58-11ed-bfe3-dac502259ad0.png

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11191

    浏览量

    208628
  • SNMP
    +关注

    关注

    0

    文章

    82

    浏览量

    29702
  • 网络设备
    +关注

    关注

    0

    文章

    306

    浏览量

    29569
  • python
    +关注

    关注

    54

    文章

    4763

    浏览量

    84339

原文标题:如何使用Python通过SNMP监控网络设备?

文章出处:【微信号:网络技术干货圈,微信公众号:网络技术干货圈】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于SNMP网络拓扑结构自动发现研究

    技术则是实现网络拓扑图的关键。基于TCP/IP的SNMP协议由于其简单和易于实现的特性,已经成为网络管理领域事实上的协议标准,且目前主要的网络设备都提供对
    发表于 09-19 09:22

    Labview监控带有snmp网卡设备有没有问题?

    想用Labview监控带有snmp网卡的设备,协议是TCP/IP.设备给出了MIB文件(管理信息库(MIB)是TCP/IP网络管理协议标准框
    发表于 06-15 09:22

    各类网络设备

    ` 网络设备,锐捷,艾泰,D-link,华为,H3C,思科,韩电,安普`
    发表于 11-29 11:15

    用LWIP的SNMP监控嵌入式设备

    各位大神: 最近要搞一个项目,用LWIP的SNMP监控嵌入式设备,对ucos和lwip还算熟悉,但对snmp一头雾水,请搞过snmp的大神指
    发表于 03-24 04:35

    AN_基于FreeRTOS+LwIP的SNMP实现方案

    、路由器和其他网络设备的远程管理和监视。利用SNMP协议可以更好地管理和监控网络。管理工作站可以远程管理所有支持该协议的网络设备,如监视
    发表于 11-02 07:03

    网络设备监管系统的设计与实现

    网络设备监管是指对IP 网络中的关键设备进行实时监控和管理,使网络管理员对网络设备的使用情况有更
    发表于 06-23 13:33 24次下载

    基于SNMP网络监控系统

    主要介绍基于SNMP(Simple Network Management Protocol)的网络监控系统。该系统运用PERL和PHP实现对微机的处理器、磁盘及在线人数监控和对Cisc
    发表于 07-06 15:20 33次下载

    基于嵌入式网络设备的远程监控系统设计

             针对目前大量嵌入式网络设备应用于工业控制的监控领域,监控网络的性能、带宽、成本成为目前
    发表于 09-15 08:13 11次下载

    基于SNMP网络监控系统开发平台与架构的设计与实现

    简单网络管理协议SNMP(Simple Network Management Protocol)是为网络管理系统提供的底层网络管理的框架。其应用范围非常广泛,诸多种类的
    发表于 11-30 08:52 6461次阅读
    基于<b class='flag-5'>SNMP</b>的<b class='flag-5'>网络</b><b class='flag-5'>监控</b>系统开发平台与架构的设计与实现

    基于SNMP网络性能实时测量技术的实现方法分析

    管理协议),所以可以通过SNMP协议,对网络设备及参数进行实时测量,及时了解网络设备的性能及带宽使用情况,以便实时了解网络当前的运行状态.
    的头像 发表于 12-05 07:55 2871次阅读
    基于<b class='flag-5'>SNMP</b>的<b class='flag-5'>网络</b>性能实时测量技术的实现方法分析

    使用 ntopng 和 SNMP 监视网络设备

    总结SNMP广泛用于网络监控。能够远程监控网络设备是清晰了解当前和过去网络运行状况的基础。nto
    的头像 发表于 02-07 16:48 691次阅读
    使用 ntopng 和 <b class='flag-5'>SNMP</b> 监视<b class='flag-5'>网络设备</b>

    什么是SNMPSNMP是如何工作的?

    什么是SNMPSNMP是如何工作的? SNMP(简单网络管理协议)是一种用于管理和监控网络设备
    的头像 发表于 12-27 13:58 1384次阅读

    SNMP配置及网络管理系统无法接收告警(Trap)的解决方法

    本文将详细介绍如何配置SNMP,并探讨网络管理系统(NMS)无法接收告警(Trap)的原因及解决方法。SNMP(简单网络管理协议)是一种用于管理和
    的头像 发表于 12-27 13:58 1550次阅读

    snmp协议的主要功能 snmp协议在哪一层

    的方法,使得运维人员可以远程管理和监控网络设备,确保网络的稳定性和可靠性。 SNMP协议的主要功能包括以下几个方面: 配置管理:SNMP协议
    的头像 发表于 01-22 15:00 1657次阅读

    使用Python批量连接华为网络设备

    随着网络规模的扩大和设备数量的增加,手动配置和管理每台网络设备变得越来越不现实。因此,自动化工具和脚本变得尤为重要。Python语言以其简洁性和强大的第三方库支持,成为了
    的头像 发表于 08-12 17:48 386次阅读