PHP Conference Japan 2024

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 对象,并返回它们的值及其对象 ID。

参数

主机名

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

社区

读取社区。

对象 ID

在所需对象之前的 SNMP 对象 ID。

超时

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

重试

如果发生超时,重试的次数。

返回值

如果成功,则返回 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
    )

参见

添加注释

用户贡献的注释 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: 无法遍历 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
20 年前
以下是如何查找机器的运行时间和用户数量的方法。(请注意,运行时间是 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>已运行 %s</dd>', $uptime);
if (
$users ) printf('<dd>%d 个用户%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
15 年前
如果您希望使用版本 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