snmprealwalk

(PHP 4, PHP 5, PHP 7, PHP 8)

snmprealwalk 返回指定对象内所有对象及其各自的对象 ID

说明

snmprealwalk(
    字符串 $hostname,
    字符串 $community,
    数组|字符串 $object_id,
    整数 $timeout = -1,
    整数 $retries = -1
): 数组|false

函数 snmprealwalk() 用于遍历从 object_id 开始的多个 SNMP 对象,并返回它们的 value 和 object id。

参数

hostname

SNMP 代理(服务器)的主机名。

community

读取社区。

object_id

位于想要的对象之前的 SNMP 对象 ID。

timeout

第一次超时之前的微秒数。

retries

超时发生时重试的次数。

返回值

如果成功,则返回 SNMP 对象 ID 及其值的关联数组,如果失败,则返回 false。如果发生错误,将会显示一条 E_WARNING 消息。

范例

示例 #1 使用 snmprealwalk()

<?php
print_r
(snmprealwalk("localhost", "public", "IF-MIB::ifName"));
?>

上面的代码将输出类似以下内容的结果

Array
      (
      [IF-MIB::ifName.1] => STRING: lo
      [IF-MIB::ifName.2] => STRING: eth0
      [IF-MIB::ifName.3] => STRING: eth2
      [IF-MIB::ifName.4] => STRING: sit0
      [IF-MIB::ifName.5] => STRING: sixxs
    )

参见

  • snmpwalk() - 从代理中获取所有 SNMP 对象

添加说明

用户贡献的说明 7 个说明

scot at indievisible dot org
18 年前
由于 PHP 没有像 snmptable 这样的好用的函数…… 这里有一个适合我的快速而简陋的黑客方法。它适用于完整表格和稀疏表格。示例 OID 用于路由(完整)和接口(通常是稀疏)表格。

<?php
$a
= snmptable("10.1.1.1", "public", ".1.3.6.1.2.1.4.21") or die("error");
print_r($a);
$a = snmptable("10.1.1.1", "public", ".1.3.6.1.2.1.2.2") or die("error");
print_r($a);

function
snmptable($host, $community, $oid) {
// TODO: 获取原始状态并在底部恢复
snmp_set_oid_numeric_print(TRUE);
snmp_set_quick_print(TRUE);
snmp_set_enum_print(TRUE);

$retval = array();
$raw = snmprealwalk($host, $community, $oid) or die("snmptable: unable to walk OID $oid");

$prefix_length = 0;

foreach (
$raw as $key => $value) {
if (
$prefix_length == 0) {
// 不要只使用 $oid 的长度,因为它可能是非数字的
$prefix_elements = count(explode('.',$oid));
$tmp = '.' . strtok($key, '.');
while (
$prefix_elements > 1) {
$tmp .= '.' . strtok('.');
$prefix_elements--;
}
$tmp .= '.';
$prefix_length = strlen($tmp);
}
$key = substr($key, $prefix_length);
$index = explode('.', $key, 2);
isset(
$retval[$index[1]]) or $retval[$index[1]] = array();
isset(
$firstrow) or $firstrow = $index[1];
$retval[$index[1]][$index[0]] = $value;
}

// 检查表格中的空洞并填充它们
foreach ($retval[$firstrow] as $key => $tmp) {
foreach(
$retval as $check => $tmp2) {
if (! isset(
$retval[$check][$key])) {
$retval[$check][$key] = '';
}
}
}

return(
$retval);
}
?>
匿名
16 年前
要检查是否找到任何结果,必须使用 empty() 函数。count() 函数始终返回 1 或更大的数字。

$walk_result = snmprealwalk($machine_ip, $community, $snmpcodes['interface_names']);

if (empty($walk_result)) {
print "没有找到网络接口。<br>\n";
exit(0);
}
Stephen Cope
19 年前
以下是一种查找机器的运行时间和用户数量的方法。(请注意,运行时间是 snmpd 守护进程的运行时间,它应该非常接近主机运行时间。)

<?php
$state
= snmprealwalk($host, "public", ".1.3.6.1.2.1.25.1", 50, 1);
$uptime = ereg_replace("^.*\) ([0-9]+ .*):[0-9][0-9]\.[0-9]{2}.*$", "\\1", $state['host.hrSystem.hrSystemUptime.0']);
$users = (int)ereg_replace("Gauge32: ", "", $state['host.hrSystem.hrSystemNumUsers.0']);
printf('<div class="machine"><dt>%s</dt><dd>%s</dd>', $host, $desc);
printf('<dd>up %s</dd>', $uptime);
if (
$users ) printf('<dd>%d user%s</dd>', $users, ($users > 1) ? 's' : '');
printf('</div>');
?>
Lars Troen
21 年前
snmprealwalk 使用 OID 而不是整数来索引值。当您需要包含在 OID 和值中的数据时,这很有用。

以下是如何检索和打印 VLAN 信息的示例
//
// 我之前从 3com mib 中收集了 VLAN 标识符,并将其存储在 $vlan 表中。
//
for($n=0;$n<count($vlan);$n++){
print $vlan[$n][id]." ".$vlan[$n][name]."<br>\n";
$ifStackStatusTable=@snmprealwalk($switch, $community, ".1.3.6.1.2.1.31.1.2.1.3.".$vlan[$n][id]); // ifMIB.ifMIBObjects.ifStackTable.ifStackEntry.ifStackStatus
for(reset($ifStackStatusTable); $port = key($ifStackStatusTable); next($ifStackStatusTable)){
print "$port=$ifStackStatusTable[$port]<br>";
}
aleksander dot sztramski at kpsi dot pl
14 年前
如果您想使用版本 2c 或 3,请使用以下函数

snmp v2c 函数

snmp2_get (string host, string community, string object_id [, int timeout [, int retries]])
snmp2_getnext (string host, string community, string object_id [, int timeout [, int retries]])
snmp2_walk (string host, string community, string object_id [, int timeout [, int retries]])
snmp2_real_walk (string host, string community, string object_id [, int timeout [, int retries]])
snmp2_set (string host, string community, string object_id, string type, mixed value [, int timeout [, int retries]])

snmp v3 函数

snmp3_get (string host, string sec_name, string sec_level, string auth_protocol, string auth_passphrase, string priv_pr)
snmp3_getnext (string host, string sec_name, string sec_level, string auth_protocol, string auth_passphrase, string pri)
snmp3_walk (string host, string sec_name, string sec_level, string auth_protocol, string auth_passphrase, string priv_p)
snmp3_real_walk (string host, string sec_name, string sec_level, string auth_protocol, string auth_passphrase, string p)
snmp3_set (string host, string sec_name, string sec_level, string auth_protocol, string auth_passphrase, string priv_pr)
railson at amixsi dot com dot br
18 年前
注意:超时以微秒为单位(乘以 1,000,000 以获得秒)
scot at indievisible dot org
18 年前
一些基于对许多设备上大量 OID 进行测试的改进。

<?php
function snmptable($host, $community, $oid) {
// TODO: 获取原始状态并在底部恢复
snmp_set_oid_numeric_print(TRUE);
snmp_set_quick_print(TRUE);
snmp_set_enum_print(TRUE);

$retval = array();
$raw = snmprealwalk($host, $community, $oid);
if (
count($raw) == 0) return ($retval); // 没有数据

$prefix_length = 0;
$largest = 0;
foreach (
$raw as $key => $value) {
if (
$prefix_length == 0) {
// 不要只使用 $oid 的长度,因为它可能是非数字的
$prefix_elements = count(explode('.',$oid));
$tmp = '.' . strtok($key, '.');
while (
$prefix_elements > 1) {
$tmp .= '.' . strtok('.');
$prefix_elements--;
}
$tmp .= '.';
$prefix_length = strlen($tmp);
}
$key = substr($key, $prefix_length);
$index = explode('.', $key, 2);
isset(
$retval[$index[1]]) or $retval[$index[1]] = array();
if (
$largest < $index[0]) $largest = $index[0];
$retval[$index[1]][$index[0]] = $value;
}

if (
count($retval) == 0) return ($retval); // 没有数据

// 填充代理可能给你的空洞和空白
foreach($retval as $k => $x) {
for (
$i = 1; $i <= $largest; $i++) {
if (! isset(
$retval[$k][$i])) {
$retval[$k][$i] = '';
}
}
ksort($retval[$k]);
}
return(
$retval);
}
?>
To Top