1. 程式人生 > 其它 >使用 pysnmp 查詢 h3c 網路裝置 示例

使用 pysnmp 查詢 h3c 網路裝置 示例

技術標籤:PythonNetDevOpspythonsnmp

pysnmp 文件:官方文件,檢視該模組所有的使用方法

h3c mib 庫:華三官方提供的裝置 MIB 庫檔案

mib 瀏覽器:可以用來檢視 MIB OID 節點資訊

基礎環境

  • Windows 10
  • python 3.8
  • pysnmp 4.4.12
  • HCL

網路拓撲

在這裡插入圖片描述

配置資訊

路由器配置

路由器完成基礎網路配置,開啟了 v2c 和 v3 兩個版本來進行實驗

#
 snmp-agent
 snmp-agent community write simple private
 snmp-agent community read simple public
 snmp-agent sys-info version v2c v3
 snmp-agent group v3 netdevops authentication
 snmp-agent target-host trap address udp-domain 192.168.56.102 params securityname public
 snmp-agent usm-user v3 admin netdevops simple authentication-mode md5 
[email protected]
privacy-mode aes128 [email protected] snmp-agent trap enable #

程式碼示例

# 匯入高層 API
from pysnmp.hlapi import *

# 初始化引擎
engine = SnmpEngine()
# 選擇 SNMP 協議,v1 和 v2c 只用團體字,使用 CommunityData 類例項化
# SNMPv1
# communityData = CommunityData('public', mpModel=0)
# SNMPv2c
communityData =
CommunityData('public', mpModel=1) # 如果是 v3,則需要使用者憑證,使用 UsmUserData 類例項化,認證和加密演算法與上面裝置配置相對應 userData = UsmUserData( userName='admin', authKey='[email protected]', privKey='[email protected]', authProtocol=usmHMACMD5AuthProtocol, privProtocol=usmAesCfb128Protocol, ) # 配置目標主機
target = UdpTransportTarget(('192.168.56.20',161)) # 例項化上下文物件 context = ContextData() def getSysName(target): # ObjectIdentity 類負責 MIB 物件的識別。 # 指定要查詢的 OID 物件或名稱 sysname = ObjectIdentity("1.3.6.1.2.1.1.5.0") sysname1 = ObjectIdentity('SNMPv2-MIB','sysName',0) # 使用 ObjectType 類初始化查詢物件 obj1 = ObjectType(sysname) # 使用 getCMD 方法進行查詢,返回結果是一個迭代器,需要使用 next() 來取值 # 傳遞的引數均為為上面定義的變數,以 v2c 為例(如果是 v3,communityData 替換為 userData) g = getCmd(engine, communityData, target, context, obj1) # 取值 _, _, _, result = next(g) # 列印輸出 for i in result: print(i) def getIfaceList(target): """ 這個函式是查詢介面列表,和上面查詢 sysName 的區別是使用了 nextCmd 來獲取一個 MIB 子樹的全部內容 主要是 `lexicographicMode=False` 引數,預設為 `True`,會一直查詢到 MIB 樹結束。 """ # 介面列表的 OID 值 ifaceListOid = ObjectType(ObjectIdentity('1.3.6.1.2.1.2.2.1.2')) g = nextCmd(engine,userData,target,context,ifaceListOid,lexicographicMode=False) # 手動迭代並輸出內容,並進行迭代器終止的判斷 try: while True: errorIndication, errorStatus, errorIndex, varBinds = next(g) for iface in varBinds: print(iface) except StopIteration: print('Get interface list done.') getSysName(target) print('============================') getIfaceList(target)

上述程式碼輸出內容如下,可以根據實際需求,對函式的返回內容進行處理,為方便實驗,都使用了 print 來檢視結果:

PS C:\python\netdevops> python "c:\python\netdevops\pysnmp_demo.py"
SNMPv2-MIB::sysName.0 = R1
============================
SNMPv2-SMI::mib-2.2.2.1.2.1 = GigabitEthernet0/0
SNMPv2-SMI::mib-2.2.2.1.2.2 = GigabitEthernet0/1
SNMPv2-SMI::mib-2.2.2.1.2.3 = GigabitEthernet0/2
SNMPv2-SMI::mib-2.2.2.1.2.4 = Serial1/0
SNMPv2-SMI::mib-2.2.2.1.2.5 = Serial2/0
SNMPv2-SMI::mib-2.2.2.1.2.6 = Serial3/0
SNMPv2-SMI::mib-2.2.2.1.2.7 = Serial4/0
SNMPv2-SMI::mib-2.2.2.1.2.8 = GigabitEthernet5/0
SNMPv2-SMI::mib-2.2.2.1.2.9 = GigabitEthernet5/1
SNMPv2-SMI::mib-2.2.2.1.2.10 = GigabitEthernet6/0
SNMPv2-SMI::mib-2.2.2.1.2.11 = GigabitEthernet6/1
SNMPv2-SMI::mib-2.2.2.1.2.129 = NULL0
SNMPv2-SMI::mib-2.2.2.1.2.130 = InLoopBack0
SNMPv2-SMI::mib-2.2.2.1.2.131 = Register-Tunnel0
Get interface list done.