Timeout 的單位是微秒。
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 代理程式的所有值。
hostname
SNMP 代理程式(伺服器)。
community
讀取社群字串。
object_id
如果為 null
,object_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 物件。可以使用迴圈逐步瀏覽這些值。
請注意,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 時需要注意的一些事項:
在遍歷 MIB 時,snmpwalk 會將獲取的資訊放入一個陣列中,這是正確的。
當 snmpwalk 需要從包含子實例的實例中收集資訊時,就會出現問題(例如,遍歷 .1.2.3.4.5 並具有 1.1、1.2、1.3 等實例):在這種情況下,它會獲取資訊並傳遞到陣列中,但在遍歷陣列時,每個值的前面都會加上 'Counter32: '。
我已經用很多方法測試過,結果總是如此。
啊。這就是為什麼我們的 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);
?>
我必須使用像這樣的 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);
?>