我正在使用PHP 5.3和SNMP在未按正确顺序返回的OID节点上执行snmpwalk
。结果,我收到错误“错误:OID没有增加”,我找不到忽略此方法的方法。
或者,我认为我可以执行一系列snmpgetnext
命令来手动执行步骤,但我不知道要获取下一个OID值来发出下一个getnext命令。
http://www.php.net/manual/en/ref.snmp.php
对任一解决方案的任何建议都将是一个巨大的帮助。 感谢。
我想要检索的bash脚本是:
snmpwalk -c public -v 1 -Cc 10.3.1.42 1.0.8802.1.1.2.1.4.1.1.9
无序结果是:
iso.0.8802.1.1.2.1.4.1.1.9.340550.15.15 = STRING: "Switch Name"
iso.0.8802.1.1.2.1.4.1.1.9.29566.16.16 = STRING: "Switch Name"
iso.0.8802.1.1.2.1.4.1.1.9.29486.17.17 = STRING: "Switch Name"
iso.0.8802.1.1.2.1.4.1.1.9.101547.18.18 = STRING: "Switch Name"
iso.0.8802.1.1.2.1.4.1.1.9.399668.19.19 = STRING: "Switch Name"
答案 0 :(得分:1)
编辑:看起来这可能只能使用PHP 5.4或更高版本; “getnext”函数系列返回实际的 OID 的能力在此之前不会被引入。
“getnext”功能的部分神奇之处在于它为您提供了 next OID和其值。但是,您需要哄骗PHP以有意义的格式提供给您。直观的方法最终会为您提供下一个OID的值,而不是其他任何东西,这对您没有帮助。
但是,首先,您可以使用这些选项使PHP返回更有意义的信息集。特别是,我们希望OID采用原始的数字形式。此外,我们希望对象保存该值,以便我们可以检查返回的值的类型并对其进行适当处理(例如,区分文本,整数,计数器等):
// Note: Prior to PHP 5.4.0, SNMP_VALUE_OBJECT implied SNMP_VALUE_PLAIN.
snmp_set_valueretrieval( SNMP_VALUE_OBJECT | SNMP_VALUE_PLAIN );
snmp_set_quick_print( 1 );
snmp_set_enum_print( 0 );
snmp_set_oid_output_format( SNMP_OID_OUTPUT_NUMERIC );
基本上,所有这些一起使得输出是机器可读,而不是相当愚蠢的默认值。
有了这个,你可以让PHP让你获得下一个OID:
$result = @snmp2_getnext( $ipAddress, $communityString, [ $oidString ] );
非常重要的是要注意,传入的OID(“$ oidString”)作为数组的唯一元素传入。这会导致PHP返回一个数组,其中该数组的索引是 next OID 。因为我们告诉PHP我们想要数字输出,所以我们可以有意义地读取/解析这个OID。
$nextOid = key( $result );
$nextValue = $result[ $nextOid ];
例如,您可以尝试“.1.3.6.1”(“互联网”)的OID。在这种情况下, next OID可能是“.1.3.6.1.2.1.1.1.0”(“sysDescr.0”)或其他一些OID(即,哪一个是“下一个”) )。然后,您可以使用“$ nextOid”并将其反馈,直到您完成为止。
请注意, next OID不必位于您提供的原始OID“下方”。因此,您可能需要检查以确保返回的OID在您给出的第一个OID的范围内(如果您对“snmpwalk”替换感兴趣)。
此外,由于OID以文本形式返回,您可能希望使用PHP具有的自然排序功能来确定下一个OID是否“增加”。
最后,请记住,PHP为不同版本的SNMP使用不同的功能。他们确实添加了一个可以实例化的“SNMP”类,但我还没有玩过很多。
答案 1 :(得分:0)
NetSNMP的对象版本有一个标志可以绕过对有序OID的需求。
<?php
$dataSNMP = array();
$ipDevice = "10.206.4.38";
$SNMP = new SNMP(1, $ipDevice, "public");
$SNMP->oid_increasing_check = false;
$dataSNMP = $SNMP->walk("1.3.6.1.4.1.14988.1.1.1.3.1.8");
$SNMP->close();
?>
使用此功能,您将获得所有数据,而不会发出任何警告。唯一的问题是你需要PHP&gt; = 5.4.0
答案 2 :(得分:0)
对于PHP 5.3,您可以使用:
function snmprealwalk2($host, $community, $object_id){
exec("snmpwalk -c ".$community." -v1 -Cc ".$host." ".$object_id, $snmpWalkReturn);
foreach($snmpWalkReturn as $value){
$oid = explode("=", $value);
$walk[trim($oid[0])] = trim($oid[1]);
}
return $walk;
}