这几天在看snmp顺便自己编译,调试了一下net-snmp。net-snmp写的很难读。在自己写了一个MIB文件,并添加到net-snmp中调用snmpget去获得其中的节点值时,碰到“No Such Instance currently exists at this OID”的问题。这几天经过用ddd调试以及查找网络终于可以通过snmpget来获取自己的MIB 文件中的相关节点值了。
本着感谢网络,感谢把自己调试经验写出来的前辈们的想法,觉得有必要把自己的得到的一点理解总结一下,固有此文。
就我在此次调试中碰到的“No Such Instance currently exists at this OID”的出现原因有三种。
(1)MIB文件没有正确添加到MIB树里面,因此agent在收到查询以后真的找不到目标OID.
(2)MIB文件添加成功了,但是snmpd.conf里面的关于权限的配置不对。agent在收到client的查询以后也找到了该OID但是因为没有权限因此返回“No Such Instance currently exists at this OID”。关于权限粗看会以为很复杂,尤其是在心浮气燥的时候,其实静下心来仔细看看就会发现也就那么回事。以USM命名的权限管理还是很清晰的。
(3)第三种情况比较特殊,对于net-snmp不熟的也可能会范理解上的错误。
使用snmpget而忘记了添加OID结尾的实例标识符,net-snmp则会报出“No Such Instance currently exists at this OID”的错误。
如果怀疑是这中错误可以用snmpgetnext先试一试。
SNMP中的GETNEXT请求的作用类似snmpget,但是更加具有通用性,它是一个具有模糊匹配特性的GET请求。有时使用snmpget会报错但是使用snmpgetnext则不会报错,它会 向下查找 并找到距离最近的一个实例,然后返回它的值。(单独使用snmpgetnext操作的机会不太多,它经常被当作遍历表中所有数据的一个基本操作。