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

Python pysnmp-从NET-SNMP-EXTEND-MIB EXTEND脚本获取输出?,python,snmp,mib,pysnmp,Python,Snmp,Mib,Pysnmp,如何使用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

如何使用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。“使用示例代码检查\u fd\u 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”未能转换值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'

此错误的原因是什么?

另外,如果我使用完整的
MIB NET-SNMP-EXTEND-MIB::nsExtendOutput1Line调用getCmd。将\u fd\u wap
作为一个参数选中,我会得到错误:

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>'})
pysnmp.smi.error.NoSuchObjectError:NoSuchObjectError({'str':'无法解析节点名::(\'NET-SNMP-EXTEND-MIB::nsExtendOutput1Line\',''检查fd\u wap''),位于'})
是否可以在一个字符串中调用包含完整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 object),然后它尝试将响应值({“sys_inuse”:32640,“proc…)转换为人性化的显示字符串表示形式。此时pysnmp失败,但由于某些原因,确切原因未包含在报告中

我猜SNMP代理发送的响应字符串可能会意外超过255个字符的长度(这是一个错误)

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

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

此故障:

'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 object),然后它尝试将响应值({“sys_inuse”:32640,“proc…)转换为人性化的显示字符串表示形式。此时pysnmp失败,但由于某些原因,确切原因未包含在报告中

我猜SNMP代理发送的响应字符串可能会意外超过255个字符的长度(这是一个错误)

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


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

是否按照此答案中所述加载自定义MIB文件?否,因为我使用的不是自定义MIB,而是“NET-SNMP-EXTEND-MIB”。MIB到OID的转换工作正常,失败的是SNMP响应的处理。我认为消息
无法解析节点名称::(\'NET-SNMP-EXTEND-MIB::nsExtendOutput1Line\',\''check\u fd\u wap'')at'})
显然指出,从MIB到OID的转换存在问题,而且事实上所有的转换都可以使用数字OID。这可能只意味着
ObjectIdentity
构造函数没有被正确调用,因为
ObjectType(ObjectIdentity('NET-SNMP-EXTEND-MIB'、'nsExtendOutput1Line'、'check\u fd\u wap')))
正确地转换为OID。但这只是第二个问题,对于这个问题,我会满意地回答“不,你不能那样叫它”。你是否按照此回答中所述加载了自定义MIB文件?不,因为我没有使用自定义MIB,而是“NET-SNMP-EXTEND-MIB”。MIB到OID的转换工作正常,失败的是SNMP响应的处理。我认为消息
无法解析节点名称::(\'NET-SNMP-EXTEND-MIB::nsExtendOutput1Line\',\''check\u fd\u wap'')at'})
显然指出,从MIB到OID的转换存在问题,而且事实上所有的转换都可以使用数字OID。这可能只意味着
ObjectIdentity
构造函数没有被正确调用,因为
ObjectType(ObjectIdentity('NET-SNMP-EXTEND-MIB'、'nsExtendOutput1Line'、'check\u fd\u wap')))
正确地转换为OID。但这只是第二个问题,对于这个问题,我会满意地回答“不,你不能这样称呼它”。