使用php snmpwalk“错误:OID没有增加”

时间:2013-12-17 09:59:26

标签: php snmp

我正在使用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"

3 个答案:

答案 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;
}