精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

    文章

    11232

    瀏覽量

    208949
  • SNMP
    +關注

    關注

    0

    文章

    83

    瀏覽量

    29721
  • 網絡設備
    +關注

    關注

    0

    文章

    309

    瀏覽量

    29616
  • python
    +關注

    關注

    56

    文章

    4783

    瀏覽量

    84473

原文標題:如何使用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 ?6481次閱讀
    基于<b class='flag-5'>SNMP</b>的<b class='flag-5'>網絡</b><b class='flag-5'>監控</b>系統開發平臺與架構的設計與實現

    基于SNMP網絡性能實時測量技術的實現方法分析

    管理協議),所以可以通過SNMP協議,對網絡設備及參數進行實時測量,及時了解網絡設備的性能及帶寬使用情況,以便實時了解網絡當前的運行狀態.
    的頭像 發表于 12-05 07:55 ?2891次閱讀
    基于<b class='flag-5'>SNMP</b>的<b class='flag-5'>網絡</b>性能實時測量技術的實現方法分析

    使用 ntopng 和 SNMP 監視網絡設備

    總結SNMP廣泛用于網絡監控。能夠遠程監控網絡設備是清晰了解當前和過去網絡運行狀況的基礎。nto
    的頭像 發表于 02-07 16:48 ?711次閱讀
    使用 ntopng 和 <b class='flag-5'>SNMP</b> 監視<b class='flag-5'>網絡設備</b>

    什么是SNMPSNMP是如何工作的?

    什么是SNMPSNMP是如何工作的? SNMP(簡單網絡管理協議)是一種用于管理和監控網絡設備
    的頭像 發表于 12-27 13:58 ?1497次閱讀

    SNMP配置及網絡管理系統無法接收告警(Trap)的解決方法

    本文將詳細介紹如何配置SNMP,并探討網絡管理系統(NMS)無法接收告警(Trap)的原因及解決方法。SNMP(簡單網絡管理協議)是一種用于管理和
    的頭像 發表于 12-27 13:58 ?1779次閱讀

    snmp協議的主要功能 snmp協議在哪一層

    的方法,使得運維人員可以遠程管理和監控網絡設備,確保網絡的穩定性和可靠性。 SNMP協議的主要功能包括以下幾個方面: 配置管理:SNMP協議
    的頭像 發表于 01-22 15:00 ?1710次閱讀

    使用Python批量連接華為網絡設備

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