PHP Conference Japan 2024

snmpwalk

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

snmpwalk從代理程式擷取所有 SNMP 物件

說明

snmpwalk(
    字串 $hostname,
    字串 $community,
    陣列|字串 $object_id,
    整數 $timeout = -1,
    整數 $retries = -1
): 陣列|false

snmpwalk() 函式用於讀取由 hostname 指定的 SNMP 代理程式的所有值。

參數

hostname

SNMP 代理程式(伺服器)。

community

讀取社群字串。

object_id

如果為 nullobject_id 將被視為 SNMP 物件樹的根,並且該樹下的所有物件將以陣列形式返回。

如果指定了 object_id,則會返回該 object_id 下的所有 SNMP 物件。

timeout

第一次逾時前的微秒數。

retries

發生逾時時重試的次數。

傳回值

返回一個 SNMP 物件值的陣列,以 object_id 作為根開始,或在發生錯誤時返回 false

範例

範例 #1 snmpwalk() 範例

<?php
$a
= snmpwalk("127.0.0.1", "public", "");

foreach (
$a as $val) {
echo
"$val\n";
}

?>

上述函式呼叫將返回在本機主機上執行的 SNMP 代理程式的所有 SNMP 物件。可以使用迴圈逐步瀏覽這些值。

參見

  • snmprealwalk() - 返回所有物件,包含指定物件範圍內的各自物件 ID

新增註解

使用者貢獻的註解 10 則註解

steve at ourabode dot org
22 年前
Timeout 的單位是微秒。
1,000,000 微秒 = 1 秒
Lars Troen
21 年前
請注意,PHP 的 snmpwalk 和 UCD 的 snmpwalk 行為不同。如果您嘗試遍歷一個 OID,而該 OID 的其中一個值並不在遍歷 OID 的子鍵之下,UCD snmpwalk 會返回該值,而 PHP 的 snmpwalk 則不會。
anders at ei dot nu
21 年前
如果能夠指定要使用的 SNMP 版本 (1, 2c, 3) 就太好了。

目前,它被寫死在 ext/snmp/snmp.c 中。

如果需要,請將 session.version 從 1 更改為 2c 或 3。

例如

session.version = SNMP_VERSION_1;

改為
session.version = SNMP_VERSION_2c;
smcbride at msn dot com
1 個月前
snmpwalk 和其他 snmp 函式真的需要支援選用的埠號。

在企業環境中,將 SNMP 的埠從 161 更改為其他埠以提高安全性是很常見的做法。這是一種簡單的安全混淆技術,可以防止許多機器人程式掃描眾所周知的埠以尋找攻擊向量。例如,我們過去常常將我們的埠更改為 1161 之類的埠,只是為了防止它變得容易被攻擊。
layer2 at www dot com
23 年前
處理 snmpwalk 時需要注意的一些事項:

在遍歷 MIB 時,snmpwalk 會將獲取的資訊放入一個陣列中,這是正確的。

當 snmpwalk 需要從包含子實例的實例中收集資訊時,就會出現問題(例如,遍歷 .1.2.3.4.5 並具有 1.1、1.2、1.3 等實例):在這種情況下,它會獲取資訊並傳遞到陣列中,但在遍歷陣列時,每個值的前面都會加上 'Counter32: '。

我已經用很多方法測試過,結果總是如此。
john at antefacto dot com
23 年前
啊。這就是為什麼我們的 SNMP 程式碼在系統有任何負載時都會超時的原因。唉。浪費了兩個星期來除錯 snmp....

甚至 snmpcmd 的說明頁面也沒有說明
超時的單位。
billf at freebsd dot org
23 年前
對於想知道
超時欄位單位為何的提問者

摘錄自 ucd-snmp 標頭檔 snmp_api.h

long timeout;
/* 首次超時前的微秒數
然後指數級退避 */
jmartinson(AT_nospam)info234.com
23 年前
路由器設備快速檢視

<?
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>";

?>
http://mike.eire.ca
19 年前
我發現在 Windows 系統(PHP 5)上,空字串不會返回任何內容,它只會超時。我不得不改用 null

<?php
$a
= snmpwalk("127.0.0.1", "public", null);
?>
bobby [dot] clark [at] eku [dot] edu
21 年前
我必須使用像這樣的 object_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);
?>
To Top