超时以微秒为单位。
1,000,000 微秒 = 1 秒
(PHP 4, PHP 5, PHP 7, PHP 8)
snmpwalk — 从代理获取所有 SNMP 对象
$hostname
,$community
,$object_id
,$timeout
= -1,$retries
= -1
snmpwalk() 函数用于读取由 hostname
指定的 SNMP 代理的所有值。
主机名
SNMP 代理(服务器)。
社区
读取社区。
对象ID
如果为 null
,则 object_id
被视为 SNMP 对象树的根,并且该树下的所有对象都作为数组返回。
如果指定了 object_id
,则返回该 object_id
下的所有 SNMP 对象。
超时
第一次超时之前的微秒数。
重试
如果发生超时,重试的次数。
返回一个 SNMP 对象值的数组,从 object_id
作为根开始,或者在出错时返回 false
。
示例 #1 snmpwalk() 示例
<?php
$a = snmpwalk("127.0.0.1", "public", "");
foreach ($a as $val) {
echo "$val\n";
}
?>
上述函数调用将返回在本地主机上运行的 SNMP 代理的所有 SNMP 对象。可以使用循环遍历这些值。
请注意,php snmpwalk 和 ucd snmpwalk 的行为有所不同。如果您尝试遍历一个 OID,该 OID 具有一个不在遍历的 OID 的子键下的值,则 ucd snmpwalk 将返回值,而 php 的 snmpwalk 则不会。
最好能够指定要使用的 snmp 版本(1、2c、3)。
目前,它在 ext/snmp/snmp.c 中是硬编码的。
如果您目前需要,请将 session.version 从 1 更改为 2c 或 3。
例如
session.version = SNMP_VERSION_1;
到
session.version = SNMP_VERSION_2c;
snmpwalk 和其他 snmp 函数确实需要支持可选端口。
在企业界,出于安全考虑,将 SNMP 端口从 161 更改为其他端口是很常见的。这是一种简单的安全混淆,但许多机器人会扫描众所周知的端口以寻找攻击媒介。例如,我们过去常常将其更改为类似 1161 的内容,以防止使其变得容易。
在处理 snmpwalk 时需要注意的一件事:<BR>
在遍历 MIB 时,snmpwalk 将信息放入数组中,这是正确的。<BR>
问题发生在 snmpwalk 需要从包含子实例的实例中收集信息时(例如,遍历 .1.2.3.4.5 并具有 1.1、1.2、1.3 等实例):在这种情况下,它会获取信息并将其传递到数组中,但在遍历数组时,每个值前面都有 'Counter32: '。<BR>
我已经通过多种方式测试了这一点,结果总是相同。
啊。这就是为什么我们所有的 SNMP 内容在系统有任何负载时都会超时。唉。浪费了两个星期试图调试 snmp……
即使 snmpcmd 手册页也没有给出
超时的单位。
对于想知道
超时字段的测量单位的发布者
来自 ucd-snmp 头文件 snmp_api.h
long timeout;
/* 第一次超时之前的微秒数
然后是指数退避 */
快速路由器设备视图
<?
include "header.html";
$host = "auscr1";
$community = "tellme";
$sysDescr = snmpget("$host","$community","system.sysDescr.0");
$ifDescr = snmpwalk("$host","$community","interfaces.ifTable.ifEntry.ifDescr");
$ifIndex = snmpwalk("$host","$community","interfaces.ifTable.ifEntry.ifIndex");
$ifAdminStatus = snmpwalk("$host","$community","interfaces.ifTable.ifEntry.ifAdminStatus");
$ifOperStatus = snmpwalk("$host","$community","interfaces.ifTable.ifEntry.ifOperStatus");
$ifLastChange = snmpwalk("$host","$community","interfaces.ifTable.ifEntry.ifLastChange");
print "<table border=1 bgcolor=#ffffff><tr><td>$host</td></tr></table><br>";
print "<table border=1 bgcolor=#ffffff><tr><td>$sysDescr</td></tr></table><br>";
print "<table border=1 bgcolor=#ffffff>";
print "<tr>";
<td>ifIndex</td>
<td>ifDescr</td>
<td>ifAdminStatus</td>
<td>ifOperStatus</td>
<td>ifLastChange</td>
</tr>";
for ($i=0; $i<count($ifIndex); $i++) {
print "<tr>";
print "<td>$ifIndex[$i]</td>";
print "<td>$ifDescr[$i]</td>";
print "<td>$ifAdminStatus[$i]</td>";
print "<td>$ifOperStatus[$i]</td>";
print "<td>$ifLastChange[$i]</td>";
print "</tr>";
}
print "</table>";
?>
我发现在 Windows (PHP 5) 上,空字符串不会返回任何内容,它只会超时。我不得不使用 null 代替
<?php
$a = snmpwalk("127.0.0.1", "public", null);
?>
我不得不使用类似这样的对象 ID。
'SNMPv2-MIB::system.sysDescr.0'
'IF-MIB::interfaces.ifTable.ifEntry.ifAdminStatus'
<?php
$host = '192.168.1.1';
$community = 'public';
$object_id = 'IF-MIB::interfaces.ifTables.ifEntry.ifAdminStatus';
$sysdesc = snmpwalk($host, $community', $object_id);
print_r($sysdesc);
?>