只走特定的节点

时间:2018-07-25 16:01:38

标签: python snmp pysnmp

我正在构建一个脚本,该脚本应该通过SNMP(漫游)从调制解调器获取MAC / IP地址。为此,我使用了PySNMP和nextCmd(异步)。尽管我得到了想要的东西,但是目前我得到的比预期的要多:在特定节点上行走之后,它会与剩下的所有其他物体一起继续工作。

代码:

nextCmd(snmpEngine,
        CommunityData('private'),
        UdpTransportTarget(('IP.goes.right.here', 161)),
        ContextData(),
        ObjectType(ObjectIdentity('1.3.6.1.2.1.4.22.1.2')),
        cbFun=cbFun)

snmpEngine.transportDispatcher.runDispatcher()

cbFun

def cbFun(snmpEngine, sendRequestHandle, errorIndication,
      errorStatus, errorIndex, varBindTable, cbCtx):
if errorIndication:
    print(errorIndication)
    return
elif errorStatus:
    print('%s at %s' % (errorStatus.prettyPrint(),
                        errorIndex and varBindTable[-1][int(errorIndex) - 1][0] or '?'))
    return
else:
    for varBindRow in varBindTable:
        for varBind in varBindRow:
            print(' = '.join([x.prettyPrint() for x in varBind]))

return True 

这完全基于documentation和Internet上的其他几个例子。

示例输出:

1.3.6.1.2.1.4.22.1.2.536870914.some.ip.was.here = 0xMacAddress
1.3.6.1.2.1.4.22.1.3.1182728.some.ip.was.here = some.ip.was.here  # next node
1.3.6.1.2.1.4.22.1.4.1182736.some.ip.was.here = 3  # and even further
...

因此,这样做的意图仅限于走 1.3.6.1.2.1.4.22.1.2

P.S。我只是从PySNMP开始,我想要类似 snmpwalk -v 2c -c private some.ip.was.here ipNetToPhysicalPhysAddress

2 个答案:

答案 0 :(得分:0)

您是否考虑过将lexicographicMode添加到nextCmd属性?

类似:

nextCmd(snmpEngine,
        CommunityData('private'),
        UdpTransportTarget(('IP.goes.right.here', 161)),
        ContextData(),
        ObjectType(ObjectIdentity('1.3.6.1.2.1.4.22.1.2')),lexicographicMode=False,
        cbFun=cbFun)

答案 1 :(得分:0)

由于没有任何内置方法可以解决此问题,因此我对cbFun()进行了更改。现在,它还有几行包含re.search()且pattern是OID(因此,pattern不匹配时,即nextCmd转到另一个级别(节点),它仅执行return)。我已经很简单了,因为已经构造了带有响应print(' = '.join([x.prettyPrint() for x in varBind]))的字符串,所以我添加了if条件,并将上述代码的结果分配给了变量,因此使实现成为可能这张支票。

作为另一种可能的解决方案,也可以使用this示例中描述的方法-使用varBindHead并进行比较。

随时添加您的解决方案。