python - 合并各种 SNMP 事务并将每个事务的 OID 和结果分配给唯一变量以进行进一步处理
问题描述
我正在尝试编写具有许多 SNMP 事务的代码,一些事务可以捆绑getCmd()
到PySNMP
. 话虽如此,我不打算立即打印我的 SNMP 事务结果的值,有时需要进一步处理。IE:开箱。捆绑两个 SNMP 事务如下所示:
from pysnmp.hlapi import *
errorIndication, errorStatus, errorIndex, varBinds = next(
getCmd(SnmpEngine(),
CommunityData('somePasswd'),
UdpTransportTarget(('somedev.example.com', 161)),
ContextData(),
#One MIB
ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysName', '0')),
#Second MIB
ObjectType(ObjectIdentity('CISCO-CDP-MIB', 'cdpCacheAddress', 1,1)),
lookupNames=True,
lookupValues=True,
))
if errorIndication:
print(errorIndication)
elif errorStatus:
print('%s at %s' % (errorStatus.prettyPrint(),
errorIndex and varBinds[int(errorIndex) - 1][0] or '?'))
else:
for varBind in varBinds:
print(' = '.join([x.prettyPrint() for x in varBind]))
如果我想将特定 MIB 的值分配给变量,我看到它的方式是,我必须在我的最后一个 for 循环下放置一个 if..elseif 语句来比较我正在寻找的 MIB 的值到 oid 可迭代对象的当前值(我认为是术语)。所以,我的代码会像这样改变:
for oid, value in varBinds:
if oid == 'SNMPv2-MIB::sysName.0':
#take specific actions
elif oid == 'CISCO-CDP-MIB::cdpCacheAddress.1.1'
#take different actions
我认为这可能是一种做事方式,但是,我有几个问题:
这是处理多个 SNMP 事务的有效方式吗?
将每个 SNMP Get 事务分开是否会更好地提高代码的可读性?
当我执行以下操作时,我的 OID 将转换为对人类友好的 MIBS:
for varBind in varBinds print(' = '.join([x.prettyPrint() for x in varBind]))
但以下只是给我丑陋的oid:
for oid, value in varBinds:
print("oid:",oid,"Value",value):
通过将 oid 和 value 传递给我的 for 循环,我如何最终得到一个对人类友好的 mib 而不是丑陋的 oid?
更新:
像这样传递.loadMibs
给:在打印时仍然给了我一个 OID并且像这样:ObjectIdentity
ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysName', '0').loadMibs('SNMPv2-MIB'))
oid
value
for oid, value in varBinds:
解决方案
我认为一次提取两个托管对象(这是 SNMP 用语)是正确的方法。这是通过高级 SNMP API 获取数据的最有效方式。
一旦你得到两个托管对象作为响应,你就可以遍历它们并采取相应的行动——这就是你的代码似乎要做的事情。我个人认为那里没有任何问题。
要针对 MIB 解析收到的变量绑定(表示 SNMP 管理对象),您只需调用.prettyPrint()
它们:
for oid, value in varBinds:
print("Name: ", oid.prettyPrint(), "Value: ", value.prettyPrint()):
如果要根据 OID 值对处理进行分支,最有效的方法是比较那些丑陋的 OID:
for oid, value in varBinds:
if oid == (1, 3, 6, 1, 2, 1, 1, 5, 0): # 'SNMPv2-MIB::sysName.0':
#take specific actions
推荐阅读
- firebase - 如何在 Firebase 上托管的网站中使用 Google 自定义搜索?
- java - 如何通过共享点池限制 JavaFX 中的多个微调器
- r - 在R中用小数转换所有%
- javascript - 验证谷歌recapcha客户端javascript
- python - 如何使用 python 脚本执行多个 spark-submit 命令
- r - 在 R 中均匀间隔地采样随机行
- reactjs - 在 React 中向窗口添加事件侦听器的正确方法是什么?
- c - 为什么在打印语法之前终止 For 循环后显示“Hello”需要更长的时间?
- android - FirebaseRecyclerOptions 与微调器 onItemSelected 查询问题
- c# - 责任链和泛型