一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用Python通過SNMP監(jiān)控網(wǎng)絡(luò)設(shè)備?

網(wǎng)絡(luò)技術(shù)干貨圈 ? 來源:博客園-lyshark ? 2023-01-09 10:38 ? 次閱讀

前段時間,為了實現(xiàn)自動化巡檢,我開發(fā)了自動化巡檢工具,由于我的系統(tǒng)設(shè)備版本比較多,所以我是分別開發(fā)的客戶端程序,服務(wù)端使用dll文件與客戶端通信,服務(wù)端的dll在與python通信,通過Python豐富的第三方庫,實現(xiàn)繪圖入庫等,該方式比較繁瑣,我們管理的設(shè)備還有一些網(wǎng)絡(luò)設(shè)備,這些設(shè)備無法通過開發(fā)程序來實現(xiàn)監(jiān)控,為了實現(xiàn)全平臺全設(shè)備監(jiān)控,我決定使用SNMP實現(xiàn)監(jiān)控任務(wù)。

首先需要在系統(tǒng)中安裝SNMP客戶端,對于Linux平臺來說只需要執(zhí)行如下配置過程即可.

[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系統(tǒng)則需要在客戶機服務(wù)列表,開啟SNMP支持,并設(shè)置好一個團體名稱,如下圖。

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

當(dāng)我們配置好客戶端后,服務(wù)端就客戶獲取數(shù)據(jù)了,我們以一個OID序號為例,我們查詢特定序號對應(yīng)的名稱,然后將其記錄下來,例如下面這樣。

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

首先我們不適用PySNMP模塊直接開線程調(diào)用看看,該代碼如下所示.

importos,re,time

#通過SNMP收集主機CPU利用率:通過SNMP協(xié)議,收集目標(biāo)主機的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獲取系統(tǒng)CPU負(fù)載信息:分別獲取到系統(tǒng)的1,5,15分鐘的負(fù)載信息,并返回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獲取系統(tǒng)內(nèi)存占用:內(nèi)存利用率,獲取到之后,將其轉(zhuǎn)化為字典格式保存。
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獲取系統(tǒng)磁盤數(shù)據(jù):這個案例并不完整,我只寫了一點,后面有個問題一直沒有解決.
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協(xié)議,收集目標(biāo)主機的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獲取系統(tǒng)CPU負(fù)載信息 分別獲取到系統(tǒng)的1,5,15分鐘的負(fù)載信息,并返回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獲取系統(tǒng)內(nèi)存占用 內(nèi)存利用率,獲取到之后,將其轉(zhuǎn)化為字典格式保存。

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獲取系統(tǒng)磁盤數(shù)據(jù) 這個案例并不完整,我只寫了一點,后面有個問題一直沒有解決.

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很簡單,執(zhí)行命令pip install pysnmp即可,安裝后,使用以下代碼執(zhí)行即可獲取到目標(biāo)數(shù)據(jù),網(wǎng)上的那些轉(zhuǎn)載的都是坑,沒一個能用的,這個案例是官方案例,可以使用。

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序號為例,我們查詢特定序號對應(yīng)的名稱,然后將其記錄下來,例如下面這樣。

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

在客戶機上面,需要在服務(wù)列,開啟SNMP支持,并設(shè)置好一個團體名稱,如下圖。

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

#獲取指定數(shù)據(jù)的方法
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")

#設(shè)置OID數(shù)據(jù)集
ret=ptr.GetNumber("HOST-RESOURCES-MIB","hrMemorySize",0)
print("類型:{}-->返回結(jié)果:{}-->解析:{}".format(type(ret),ret,ret[1]))

運行后,即可讀取到內(nèi)存數(shù)據(jù),如下。

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

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11420

    瀏覽量

    212361
  • SNMP
    +關(guān)注

    關(guān)注

    0

    文章

    89

    瀏覽量

    30131
  • 網(wǎng)絡(luò)設(shè)備

    關(guān)注

    0

    文章

    323

    瀏覽量

    30242
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4822

    瀏覽量

    85876

原文標(biāo)題:如何使用Python通過SNMP監(jiān)控網(wǎng)絡(luò)設(shè)備?

文章出處:【微信號:網(wǎng)絡(luò)技術(shù)干貨圈,微信公眾號:網(wǎng)絡(luò)技術(shù)干貨圈】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    基于SNMP網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)自動發(fā)現(xiàn)研究

    技術(shù)則是實現(xiàn)網(wǎng)絡(luò)拓?fù)鋱D的關(guān)鍵?;赥CP/IP的SNMP協(xié)議由于其簡單和易于實現(xiàn)的特性,已經(jīng)成為網(wǎng)絡(luò)管理領(lǐng)域事實上的協(xié)議標(biāo)準(zhǔn),且目前主要的網(wǎng)絡(luò)設(shè)備都提供對
    發(fā)表于 09-19 09:22

    Labview監(jiān)控帶有snmp網(wǎng)卡設(shè)備有沒有問題?

    想用Labview監(jiān)控帶有snmp網(wǎng)卡的設(shè)備,協(xié)議是TCP/IP.設(shè)備給出了MIB文件(管理信息庫(MIB)是TCP/IP網(wǎng)絡(luò)管理協(xié)議標(biāo)準(zhǔn)框
    發(fā)表于 06-15 09:22

    各類網(wǎng)絡(luò)設(shè)備

    ` 網(wǎng)絡(luò)設(shè)備,銳捷,艾泰,D-link,華為,H3C,思科,韓電,安普`
    發(fā)表于 11-29 11:15

    用LWIP的SNMP監(jiān)控嵌入式設(shè)備

    各位大神: 最近要搞一個項目,用LWIP的SNMP監(jiān)控嵌入式設(shè)備,對ucos和lwip還算熟悉,但對snmp一頭霧水,請搞過snmp的大神指
    發(fā)表于 03-24 04:35

    AN_基于FreeRTOS+LwIP的SNMP實現(xiàn)方案

    、路由器和其他網(wǎng)絡(luò)設(shè)備的遠(yuǎn)程管理和監(jiān)視。利用SNMP協(xié)議可以更好地管理和監(jiān)控網(wǎng)絡(luò)。管理工作站可以遠(yuǎn)程管理所有支持該協(xié)議的網(wǎng)絡(luò)設(shè)備,如監(jiān)視
    發(fā)表于 11-02 07:03

    網(wǎng)絡(luò)設(shè)備監(jiān)管系統(tǒng)的設(shè)計與實現(xiàn)

    網(wǎng)絡(luò)設(shè)備監(jiān)管是指對IP 網(wǎng)絡(luò)中的關(guān)鍵設(shè)備進行實時監(jiān)控和管理,使網(wǎng)絡(luò)管理員對網(wǎng)絡(luò)設(shè)備的使用情況有更
    發(fā)表于 06-23 13:33 ?24次下載

    基于SNMP網(wǎng)絡(luò)監(jiān)控系統(tǒng)

    主要介紹基于SNMP(Simple Network Management Protocol)的網(wǎng)絡(luò)監(jiān)控系統(tǒng)。該系統(tǒng)運用PERL和PHP實現(xiàn)對微機的處理器、磁盤及在線人數(shù)監(jiān)控和對Cisc
    發(fā)表于 07-06 15:20 ?33次下載

    基于嵌入式網(wǎng)絡(luò)設(shè)備的遠(yuǎn)程監(jiān)控系統(tǒng)設(shè)計

             針對目前大量嵌入式網(wǎng)絡(luò)設(shè)備應(yīng)用于工業(yè)控制的監(jiān)控領(lǐng)域,監(jiān)控網(wǎng)絡(luò)的性能、帶寬、成本成為目前
    發(fā)表于 09-15 08:13 ?11次下載

    基于SNMP網(wǎng)絡(luò)監(jiān)控系統(tǒng)開發(fā)平臺與架構(gòu)的設(shè)計與實現(xiàn)

    簡單網(wǎng)絡(luò)管理協(xié)議SNMP(Simple Network Management Protocol)是為網(wǎng)絡(luò)管理系統(tǒng)提供的底層網(wǎng)絡(luò)管理的框架。其應(yīng)用范圍非常廣泛,諸多種類的
    發(fā)表于 11-30 08:52 ?6744次閱讀
    基于<b class='flag-5'>SNMP</b>的<b class='flag-5'>網(wǎng)絡(luò)</b><b class='flag-5'>監(jiān)控</b>系統(tǒng)開發(fā)平臺與架構(gòu)的設(shè)計與實現(xiàn)

    基于SNMP網(wǎng)絡(luò)性能實時測量技術(shù)的實現(xiàn)方法分析

    管理協(xié)議),所以可以通過SNMP協(xié)議,對網(wǎng)絡(luò)設(shè)備及參數(shù)進行實時測量,及時了解網(wǎng)絡(luò)設(shè)備的性能及帶寬使用情況,以便實時了解網(wǎng)絡(luò)當(dāng)前的運行狀態(tài).
    的頭像 發(fā)表于 12-05 07:55 ?3049次閱讀
    基于<b class='flag-5'>SNMP</b>的<b class='flag-5'>網(wǎng)絡(luò)</b>性能實時測量技術(shù)的實現(xiàn)方法分析

    使用 ntopng 和 SNMP 監(jiān)視網(wǎng)絡(luò)設(shè)備

    總結(jié)SNMP廣泛用于網(wǎng)絡(luò)監(jiān)控。能夠遠(yuǎn)程監(jiān)控網(wǎng)絡(luò)設(shè)備是清晰了解當(dāng)前和過去網(wǎng)絡(luò)運行狀況的基礎(chǔ)。nto
    的頭像 發(fā)表于 02-07 16:48 ?938次閱讀
    使用 ntopng 和 <b class='flag-5'>SNMP</b> 監(jiān)視<b class='flag-5'>網(wǎng)絡(luò)設(shè)備</b>

    什么是SNMPSNMP是如何工作的?

    什么是SNMP?SNMP是如何工作的? SNMP(簡單網(wǎng)絡(luò)管理協(xié)議)是一種用于管理和監(jiān)控網(wǎng)絡(luò)設(shè)備
    的頭像 發(fā)表于 12-27 13:58 ?2117次閱讀

    SNMP配置及網(wǎng)絡(luò)管理系統(tǒng)無法接收告警(Trap)的解決方法

    本文將詳細(xì)介紹如何配置SNMP,并探討網(wǎng)絡(luò)管理系統(tǒng)(NMS)無法接收告警(Trap)的原因及解決方法。SNMP(簡單網(wǎng)絡(luò)管理協(xié)議)是一種用于管理和監(jiān)
    的頭像 發(fā)表于 12-27 13:58 ?2783次閱讀

    snmp協(xié)議的主要功能 snmp協(xié)議在哪一層

    的方法,使得運維人員可以遠(yuǎn)程管理和監(jiān)控網(wǎng)絡(luò)設(shè)備,確保網(wǎng)絡(luò)的穩(wěn)定性和可靠性。 SNMP協(xié)議的主要功能包括以下幾個方面: 配置管理:SNMP協(xié)議
    的頭像 發(fā)表于 01-22 15:00 ?2368次閱讀

    使用Python批量連接華為網(wǎng)絡(luò)設(shè)備

    隨著網(wǎng)絡(luò)規(guī)模的擴大和設(shè)備數(shù)量的增加,手動配置和管理每臺網(wǎng)絡(luò)設(shè)備變得越來越不現(xiàn)實。因此,自動化工具和腳本變得尤為重要。Python語言以其簡潔性和強大的第三方庫支持,成為了
    的頭像 發(fā)表于 08-12 17:48 ?734次閱讀