pysnmp - 从 NET-SNMP-EXTEND-MIB 扩展脚本获取输出?

pysnmp - get output from NET-SNMP-EXTEND-MIB extend script?

如何使用 pysnmp 4.3 通过 MIB 正确调用 SNMP 扩展脚本?

我在远程服务器的 snmpd.conf 文件中有这个条目:

extend check_fd_wap /app/users/nagios_checks/check_fd_wap.sh

它又可以被调用:

snmpwalk -t 60 -v2c -c greendale remoteserver 'NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."check_fd_wap"'
NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."check_fd_wap" = STRING: { "sys_inuse" : 32640, "proc_data" : {  "ssl-mmsib" : { "proc_used" : 22, "proc_limit" : 200000 } , (...) }

在 pysnmp 中,我尝试使用示例代码调用 MIB NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."check_fd_wap"

errorIndication, errorStatus, errorIndex, varBinds = next(
    getCmd(SnmpEngine(),
        CommunityData(community, mpModel=1),
        UdpTransportTarget((hostname, port)),
        ContextData(),
        ObjectType(ObjectIdentity('NET-SNMP-EXTEND-MIB','nsExtendOutput1Line','check_fd_wap')))
)

for varBind in varBinds:
    print(' = '.join([x.prettyPrint() for x in varBind]))

但是,此操作失败并显示 'DisplayString' failed to cast value OctetString 错误消息:

raise SmiError('MIB object %r having type %r failed to cast value %r: %s' % (self.__args[0].prettyPrint(), self.__args[0].getMibNode().getSyntax().__class__.__name__, self.__args[1], sys.exc_info()[1]))
;SmiError: MIB object u'NET-SNMP-EXTEND-MIB::nsExtendOutput1Line.check_fd_wap' having type 'DisplayString' failed to cast value OctetString('{ "sys_inuse" (...)"" at DisplayString

但是,使用转换后的 OID 调用它可以正常工作 ('.1.3.6.1.4.1.8072.1.3.2.3.1.1.12.99.104.101.99.107.95.102.100.95.119.97.112')。

SNMPv2-SMI::enterprises.8072.1.3.2.3.1.1.12.99.104.101.99.107.95.102.100.95.119.97.112 = { "sys_inuse" : 31110, "proc_data" : {  "ssl-mmsib" : { "proc_used" : 19, "proc_limit" : 200000 } } }

这个错误的原因是什么?

此外,如果我使用完整的 MIB NET-SNMP-EXTEND-MIB::nsExtendOutput1Line.check_fd_wap 作为一个参数调用 getCmd,我会收到错误消息:

pysnmp.smi.error.NoSuchObjectError: NoSuchObjectError({'str': 'Can\'t resolve node name ::(\'NET-SNMP-EXTEND-MIB::nsExtendOutput1Line\', \'"check_fd_wap"\') at <pysnmp.smi.view.MibViewController instance at 0x2989638>'})

是否可以在一个字符串中调用带有完整 MIB 的 SNMP get?

此次失败:

'DisplayString' failed to cast value OctetString

当 pysnmp 收到 SNMP 代理对请求的 OID 的响应时发生

1.3.6.1.4.1.8072.1.3.2.3.1.1.12.99.104.101.99.107.95.102.100.95.119.97.112

(对应于 NET-SNMP-EXTEND-MIB::nsExtendOutput1Line.check_fd_wap MIB 对象)然后尝试转换响应值( { "sys_inuse" : 32640, "proc...) 进入人性化的 DisplayString 表示。此时 pysnmp 失败,但确切原因未包含在你的报告出于某种原因。

我猜测您的 SNMP 代理发送的响应字符串可能不小心超过了 255 个字符的长度(constraint of DisplayString type)。

形式上正确的解决方案是使 SNMP 代理响应适合 255 个 ASCII 字符的 MIB 对象以满足 DisplayString 类型限制。

或者,您可以通过将 lookupMib=False 关键字参数传递给 getCmd() 函数来禁用 pysnmp 中响应值的 MIB 查找。