PHP Conference Japan 2024

snmpget

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

snmpget取得 SNMP 物件

描述

snmpget(
    string $hostname,
    string $community,
    array|string $object_id,
    int $timeout = -1,
    int $retries = -1
): mixed

snmpget() 函式用於讀取 object_id 指定的 SNMP 物件的值。

參數

hostname

SNMP 代理程式。

community

讀取群體。

object_id

SNMP 物件。

timeout

第一次逾時之前的微秒數。

retries

逾時發生時重試的次數。

傳回值

成功時返回 SNMP 物件值,失敗時返回 false

範例

範例 #1 使用 snmpget()

<?php
$syscontact
= snmpget("127.0.0.1", "public", "system.SysContact.0");
?>

參見

新增筆記

使用者貢獻的筆記 16 則筆記

Johann Glaser
20 年前
似乎每次 snmpget() 都會開啟自己的 socket()。這在 snmpget() 完成後不會關閉。後續的 snmpget() 呼叫也不會重複使用現有的 socket。

當查詢具有大量埠的幾個交換器時,Apache 的最大檔案描述符計數會耗盡。因此,無法再進行 snmpget()。此外,此特定的 Apache 程序也無法再讀取任何檔案。無論是 PHP 檔案、任何包含檔案或任何其他檔案(如 .css 檔案...)。

這可能解釋了 tkjode 在 phalnet dot com 上的觀察。與他的情況不同的是,我使用的是 Linux。
maxie_ro at do dot not dot spam dot yahoo dot com
15 年前
此函式可用於透過取得其 sysObjectID 和 sysDescr 來識別網路上的裝置。簡而言之,這是我所做的
<?php
$sysid
= @snmpget($ip, 'public', '.1.3.6.1.2.1.1.2.0', 300);
if(
$sysid) {
$sysdescr = @snmpget($ip, 'public', '.1.3.6.1.2.1.1.1.0', 300);
}
?>

我從設備獲得的內容,例如
<?php
$sysid
= 'OID: .iso.3.6.1.4.1.5003.8.1.1.57';// => AudioCodes MP114;
//.iso.3.6.1.4.1. 是 OID 網域的「前綴」
//5003 是 AudioCodes 的 IANA 編號
//8.1.1.57 識別設備類型 (MP-114)
$sysdescr = '"Product: MP-114 FXS;SW Version: 5.00A.024"';
?>
不幸的是,並非所有設備都報告正確的 objectID,例如它們只報告供應商並停止在那裡等等。

如果您想知道為什麼我在函式呼叫中使用程式碼 '.1.3.6.1.2.1.1.2.0' 而不是 "sysObjectID.0",那是因為只有數字程式碼似乎在 Windows 上有效。如需更多程式碼,請搜尋「cisco SNMP Object Navigator」。
玩得開心。
d dot shereck at gmail dot com
16 年前
對於那些希望使用 v2 或 3 的人

您可以參考 php_snmp.h 標頭
以下是函式列表

PHP_FUNCTION(snmpget);
PHP_FUNCTION(snmpgetnext);
PHP_FUNCTION(snmpwalk);
PHP_FUNCTION(snmprealwalk);
PHP_FUNCTION(snmp_get_quick_print);
PHP_FUNCTION(snmp_set_quick_print);
PHP_FUNCTION(snmp_set_enum_print);
PHP_FUNCTION(snmp_set_oid_output_format);
PHP_FUNCTION(snmpset);

PHP_FUNCTION(snmp2_get);
PHP_FUNCTION(snmp2_getnext);
PHP_FUNCTION(snmp2_walk);
PHP_FUNCTION(snmp2_real_walk);
PHP_FUNCTION(snmp2_set);

PHP_FUNCTION(snmp3_get);
PHP_FUNCTION(snmp3_getnext);
PHP_FUNCTION(snmp3_walk);
PHP_FUNCTION(snmp3_real_walk);
PHP_FUNCTION(snmp3_set);

PHP_FUNCTION(snmp_set_valueretrieval);
PHP_FUNCTION(snmp_get_valueretrieval);
Eduardo
17 年前
線上文件說該函式在發生錯誤時返回 "FALSE",但實際上,它在發生錯誤時返回 NULL。
ac221 at sussex dot ac dot uk
17 年前
有些 SNMP 代理程式會以十六進位編碼的 ascii 傳回 mac 位址。

例如 '30:30:3a:31:37:3a:66:32:3a:39:62:3a:34:36:3a:30:65'

每個八位元組代表 mac 位址的 4 位元。
某些供應商也可能會將分隔符號編碼到字串中。

以下函式可將這些字串轉換回純十六進位。

<?php
$hexStr
= '30:30:3a:31:37:3a:66:32:3a:39:62:3a:34:36:3a:30:65';

echo(
str_replace(':','',hexStr2Ascii($hexStr)));

function
hexStr2Ascii($hexStr,$separator = ':'){
$hexStrArr = explode($separator,$hexStr);
$asciiOut = null;
foreach(
$hexStrArr as $octet){
$asciiOut .= chr(hexdec($octet));
}
return
$asciiOut;
}
?>

輸出:'0017f29b460e'
michael dot mauch at gmx dot de
18 年前
我不確定逾時值是多少,但 1 秒實際上是 1,000,000,000 奈秒 (參考 http://en.wikipedia.org/wiki/SI_prefix)。
Jim
18 年前
不幸的是,您似乎無法將多個物件放入 snmpget 函式中,例如:sysUpTime.0 ifInOctets.1 ifOutOctets.1。就其價值而言,時間參數如先前所述是以奈秒為單位。關於這點有很多相互矛盾的資訊。
javierb at gmx dot net
21 年前
輪詢一台 Cisco 設備。

$ip = '1.1.1.1';
$community ='publico';
$a = snmpget($ip,$community, "IF-MIB::ifLastChange.1")
$b = snmpget($ip,$community, "IF-MIB::ifAlias.1");
print("a = ".$a."\n"."b = ".$b."\n");

a = Timeticks: (929969969) 107 天, 15:14:59.69
b = Timeticks: (929969969) 107 天, 15:14:59.69

當介面沒有描述時。
tkjode at phalnet dot com
22 年前
在 NT/2000 系統上觀察到,用 SNMP 請求淹沒裝置會導致 NT 的 SNMP 服務停止運作。

例如,我順利輪詢了我們網路上的 183 個交換器。然後我嘗試透過刷新和中斷連線來模擬該頁面的高流量(正如任何真實世界的系統都必須經歷的那樣)。SNMP 停止在整個機器上運作,包括非 PHP/Webserver 程序。
grice at berbee dot com
24 年前
看起來您可以使用非標準的 SNMP 連接埠
類似這樣

$foo = snmpwalk('foo.bar.com:1161', 'foofoo', '.1.3.6');

這是在 PHP 3.16 上;我還沒有成功在 Solaris 2.6 上編譯 PHP 4.02。
--Michael
brunoseys at telenet dot be
17 年前
根據 SNMPv2-MIB 定義,正確的語法應該是 "system.sysContact.0" 而不是上述範例 2251 中使用的 "system.SysContact.0"。

SNMPv2-MIB 定義
...
sysContact OBJECT-TYPE
SYNTAX DisplayString (SIZE (0..255))
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"此
受管理節點的聯絡人的文字識別,以及如何聯絡
此人的資訊。如果不知道聯絡資訊,則

是零長度字串。"
::= { system 4 }
dstjohn-NO-SPAM at mediacast1 dot com
21 年前
關於 snmpget 函式的一點小資訊

<?php
//snmpget 系統統計資料
$host = 'localhost';
$community = 'public';

//取得系統名稱
$sysname = snmpget($host, $community, "system.sysName.0");

//取得系統啟動時間
$sysup = snmpget($host, $community, "system.sysUpTime.0");
$sysupre = eregi_replace("([0-9]{3})","",$sysup);
$sysupre2 = eregi_replace("Timeticks:","",$sysupre);
$sysupre3 = eregi_replace("[()]","",$sysupre2);

//取得 TCP 連線數
$tcpcon = snmpget($host, $community,"tcp.tcpCurrEstab.0");
$tcpconre = eregi_replace("Gauge32:","",$tcpcon);

echo
'
系統名稱:'
.$sysname.'<br>
系統啟動時間:'
.$sysupre3.'<br>
目前 TCP 連線數:'
.$tcpconre.'<br>';

?>
tridman
18 年前
逾時是以微秒為單位。因此 1,000,000 代表 1 秒。
Malaka Udawatta (malaka13 at gmail dot com)
17 年前
當我嘗試使用 snmpget 函式取得 64 位元計數器變數 (例如 ifHCInOctets) 時,出現以下錯誤訊息。

封包錯誤:(noSuchName) 此 MIB 中沒有這樣的變數名稱

解決方案是使用 snmp2_get(); 函式。參數與 snmpget(); 相同。
dstjohn-NO-SPAM at mediacast1 dot com
19 年前
2 年的小資訊更新 :)

<?php
// author: dstjohn at mediacast1.com
// updated: 09-11-2005
// 設定一些變數
$snmpcommunity = 'PUBLIC'; //snmp 社群名稱
$ips = 'test1.com,test2.com'; //要從中取得 snmp 資料的 IP 或 DNS
$system_number = '1';
//變數設定結束

//開始迴圈
for ($i = 0; $i <= $system_number; $i++) {
$sysip = explode(",",$ips);

//取得系統名稱
$sysname[0] = snmpget($sysip[$i], $snmpcommunity, "sysName.0");
$sysname[1] = eregi_replace("STRING:","",$sysname[0]);
echo
'系統名稱: '.$sysname[1].'<br>';

//系統描述
$sysdesc[0] = snmpget($sysip[$i], $snmpcommunity, "sysDescr.0");
$sysdesc[1] = eregi_replace("STRING:","",$sysdesc[0]);
echo
'系統描述: '.$sysdesc[1].'<br>';

//系統位置
$sysloc[0] = snmpget($sysip[$i], $snmpcommunity, "sysLocation.0");
$sysloc[1] = eregi_replace("STRING:","",$sysloc[0]);
echo
'系統位置: '.$sysloc[1].'<br>';

//目前 TCP 連線數
$tcpcons[0] = snmpget($sysip[$i], $snmpcommunity, "tcpCurrEstab.0");
$tcpcons[1] = eregi_replace("Gauge32:","",$tcpcons[0]);
echo
'開啟的 TCP/IP 連線數: '.$tcpcons[1].'<br>';

//取得系統啟動時間
$sysuptime[0] = snmpget($sysip[$i], $snmpcommunity, "system.sysUpTime.0");
$sysuptime[1] = eregi_replace("Timeticks:","",$sysuptime[0]);
echo
'系統啟動時間: Timeticks -'.$sysuptime[1].'<br>';

//僅限 Windows
//已安裝記憶體
if(eregi('Windows',$sysdesc[1])){
$mem[0] = snmpget($sysip[$i], $snmpcommunity, "HOST-RESOURCES-MIB::hrMemorySize.0");
$mem[1] = eregi_replace("INTEGER:","",$mem[0]);
$mem[2] = eregi_replace("KBytes","",$mem[1]);
echo
'已安裝記憶體: '.$mem[2].' KB<br>';
}

echo
'<br><br>';
}
//迴圈結束

?>
fbleau
18 年前
Timeout 的預設值為 1000000 奈秒 (1 秒),重試次數為 5 次,此值由 Net-SNMP 函式庫設定。

#!/usr/local/bin/php
<?php
$time_start
= microtime(true);
$reponse = snmpget('10.5.1.1', 'public', "1.3.6.1.2.1.1.3.0",1000000,5);
$time_end = microtime(true);
$time = $time_end - $time_start;

echo
"延遲時間為 $time 秒\n";
?>
To Top