如何使用 PySnmp 获取 Python 中的 OID 值
How to get the value of OID in Python using PySnmp
使用 snmpwalk
我可以从我的设备中获取:
OID=.1.3.6.1.4.1.5296.1.9.1.1.1.7.115.101.99.99.97.57.27.1.41
Type=OctetString
Value=secca99
我在 Python 中尝试了这个程序来从 OID 上面获取值字段:
#!/usr/bin/env python3
from pysnmp.hlapi import *
import sys
def walk(host, oid):
for (errorIndication,
errorStatus,
errorIndex,
varBinds) in nextCmd(SnmpEngine(),
CommunityData('public'),
UdpTransportTarget((host, 161)),
ContextData(),
ObjectType(ObjectIdentity(oid))):
if errorIndication:
print(errorIndication, file=sys.stderr)
break
elif errorStatus:
print('%s at %s' % (errorStatus.prettyPrint(),
errorIndex and varBinds[int(errorIndex) - 1][0] or '?'), file=sys.stderr)
break
else:
for varBind in varBinds:
print(varBind)
walk('10.78.163.39',
'.1.3.6.1.4.1.5296.1.9.1.1.1.7.115.101.99.99.97.57.27.1.41')
输出 我得到:
当我 运行 程序时,它显示一长串带有值的 OID(不知道为什么我什至将叶级 OID 作为程序的输入)。奇怪。
尝试了什么
lexicographicMode=True
在 nextCmd
但它没有显示任何内容。
如愿以偿
我想在我的程序中给出一个 OID 列表并想要它们的值(值是您可以在第一行看到的键),仅此而已。
请求
请在 python 程序中使用 pysnmp 帮助我这样做。
如果需要 OID,请使用 mibLookup=False 参数。如果您只需要 MIB 的分支,请使用 lexicographicMode=False
,但请确保指定 non-leaf OID,因为在这种情况下您将不会在 return.
中得到任何信息
这是您的脚本,其中包含建议的更改:
from pysnmp.hlapi import *
import sys
def walk(host, oid):
for (errorIndication,
errorStatus,
errorIndex,
varBinds) in nextCmd(SnmpEngine(),
CommunityData('public'),
UdpTransportTarget((host, 161)),
ContextData(),
ObjectType(ObjectIdentity(oid)),
lookupMib=False,
lexicographicMode=False):
if errorIndication:
print(errorIndication, file=sys.stderr)
break
elif errorStatus:
print('%s at %s' % (errorStatus.prettyPrint(),
errorIndex and varBinds[int(errorIndex) - 1][0] or '?'), file=sys.stderr)
break
else:
for varBind in varBinds:
print('%s = %s' % varBind)
walk('demo.snmplabs.com', '1.3.6.1.2.1.1.9.1.2')
您应该可以剪切和粘贴它,它是 运行 针对 public SNMP 模拟器的 demo.snmplabs.com。
使用 snmpwalk
我可以从我的设备中获取:
OID=.1.3.6.1.4.1.5296.1.9.1.1.1.7.115.101.99.99.97.57.27.1.41
Type=OctetString
Value=secca99
我在 Python 中尝试了这个程序来从 OID 上面获取值字段:
#!/usr/bin/env python3
from pysnmp.hlapi import *
import sys
def walk(host, oid):
for (errorIndication,
errorStatus,
errorIndex,
varBinds) in nextCmd(SnmpEngine(),
CommunityData('public'),
UdpTransportTarget((host, 161)),
ContextData(),
ObjectType(ObjectIdentity(oid))):
if errorIndication:
print(errorIndication, file=sys.stderr)
break
elif errorStatus:
print('%s at %s' % (errorStatus.prettyPrint(),
errorIndex and varBinds[int(errorIndex) - 1][0] or '?'), file=sys.stderr)
break
else:
for varBind in varBinds:
print(varBind)
walk('10.78.163.39',
'.1.3.6.1.4.1.5296.1.9.1.1.1.7.115.101.99.99.97.57.27.1.41')
输出 我得到:
当我 运行 程序时,它显示一长串带有值的 OID(不知道为什么我什至将叶级 OID 作为程序的输入)。奇怪。
尝试了什么
lexicographicMode=True
在 nextCmd
但它没有显示任何内容。
如愿以偿
我想在我的程序中给出一个 OID 列表并想要它们的值(值是您可以在第一行看到的键),仅此而已。
请求
请在 python 程序中使用 pysnmp 帮助我这样做。
如果需要 OID,请使用 mibLookup=False 参数。如果您只需要 MIB 的分支,请使用 lexicographicMode=False
,但请确保指定 non-leaf OID,因为在这种情况下您将不会在 return.
这是您的脚本,其中包含建议的更改:
from pysnmp.hlapi import *
import sys
def walk(host, oid):
for (errorIndication,
errorStatus,
errorIndex,
varBinds) in nextCmd(SnmpEngine(),
CommunityData('public'),
UdpTransportTarget((host, 161)),
ContextData(),
ObjectType(ObjectIdentity(oid)),
lookupMib=False,
lexicographicMode=False):
if errorIndication:
print(errorIndication, file=sys.stderr)
break
elif errorStatus:
print('%s at %s' % (errorStatus.prettyPrint(),
errorIndex and varBinds[int(errorIndex) - 1][0] or '?'), file=sys.stderr)
break
else:
for varBind in varBinds:
print('%s = %s' % varBind)
walk('demo.snmplabs.com', '1.3.6.1.2.1.1.9.1.2')
您应该可以剪切和粘贴它,它是 运行 针对 public SNMP 模拟器的 demo.snmplabs.com。