2013-12-17 42 views
0

我正在使用PHP 5.3和SNMP在没有按正确顺序返回的OID节点上执行snmpwalk。因此,我得到错误“错误:OID不增加”,我无法找到一种方法来忽略这一点。使用php 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

你捕获网络数据包,看看这是否是一个SNMP代理端问题? –

+0

我已经用bash脚本执行了snmpwalk,它显示OID值没有排序。使用-Cc开关查找递减的OID值时,我可以忽略中止的默认操作。可悲的是我无法找到一种方法来做到这一点与PHP。 –

回答

1

编辑:它看起来像这可能仅仅是可能使用PHP 5.4或更高; “getnext”系列函数返回实际的OID的能力直到那时才被引入。中的“GETNEXT”功能神奇

部分原因是,它给你的下一个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 ]); 

这是非常需要注意的是,你在(“$ oidString”通过OID )作为数组的唯一元素传入。这会导致PHP返回一个数组,其中该数组的索引下一个OID。因为我们告诉PHP我们需要数字输出,所以我们可以有意义地读取/解析这个OID。

$nextOid = key($result); 
$nextValue = $result[ $nextOid ]; 

例如,您可以尝试“.1.3.6.1”(“internet”)的OID。在这种情况下,下一个 OID可能会是“.1.3.6.1.2.1.1.1.0”(“sysDescr。0“)或其他一些OID(即无论哪一个是”下一个“)。然后您可以拿”$ nextOid“并将其反馈回去,直到完成为止。不要在你给它的原始OID“之下”,因此,你可能需要检查以确保返回的OID在你给它的第一个OID的范围内(如果你对“snmpwalk的”更换)。

此外,由于OID回来为文本,你可能希望使用PHP具有自然排序函数来确定下一个OID是否被“增加”。

最后,记住t PHP为不同版本的SNMP使用不同的功能。他们确实添加了一个可以实例化的“SNMP”类,但我还没有玩过那么多。

+0

感谢您的回复。我得到错误“snmp2_getnext()期望参数3是字符串,数组给出”这是由[文档](http://www.php.net/manual/en/function.snmp2-getnext.php) –

+0

你是对的;看起来他们只是在5.4中添加了支持数组(我概述它的方式):http://php.net/manual/en/snmp.getnext.php –

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> = 5.4.0