如何使用 pysnmp 走 sub table

How to walk sub table with pysnmp

我想在enterprises.35604.2.3.5.7.2 oid下走snmp table。这将 return 一个日志列表。

当我执行代码时,它不会在最后一个 table 元素后停止。 我怎样才能确保它会在所有子 table 完成后停止?

from pysnmp.hlapi import *
logoid='1.3.6.1.2.1.69.1.5.8.1.7'


def scan_cm_log(ipaddress, oid):
    for (errorIndication, errorStatus, errorIndex, varBinds) in nextCmd(SnmpEngine(),
               CommunityData('<key>'),
               UdpTransportTarget((ipaddress, 161)),
               ContextData(),
               ObjectType(ObjectIdentity(oid)),
               ):

        if not errorIndication and not errorStatus:
            for varBind in varBinds:
                result=' = '.join([x.prettyPrint() for x in varBind])
                print(result)


scan_cm_log('<ip>', logoid)

检查 varBind 看看你在做什么,如果你离开了 table,请做一个 return

当您收到原始 OID 不是前缀的 OID 的响应时,通过结束步行来完成此操作。

所以,如果你走 1.2.3.4,你得到 1.2.3.4.1/1.2.3.4.2/1.2.3.4.3/1.2.3.5.1/1.2.3.5.2, “1.2.3.5.1”不是以“1.2.3.4”开头,所以到此为止。

最终完全取决于您想要做什么以及使用什么logic/algorithm。但是上面是一个"typical"的走算法。

按照 here 的说明尝试添加 lexicographicMode=False 标志。

iterator = nextCmd(
    SnmpEngine(),
    CommunityData('<key>'),
    UdpTransportTarget((ipaddress, 161)),
    ContextData(),
    ObjectType(ObjectIdentity(oid)),
    lexicographicMode=False)

for (errorIndication, errorStatus, errorIndex, varBinds) in iterator:
    ...

一旦您查询的所有 OID 都离开了它们各自的初始 OID 前缀,这应该会耗尽迭代器。