1. 程式人生 > >用PHP來測試SNMP

用PHP來測試SNMP

1.原來PHP也是支援SNMP的,看來條條道路通羅馬,語言只是一個工具而已。。。

2.首先開啟php.ini中extension=php_snmp.dll,然後從PHP手冊上覆制一段程式碼:
<?php
$quickprint = snmp_get_quick_print();
?>
在CMD下執行結果如下:
D:/wamp/www/test/snmp>php test.php
Cannot find module (IP-MIB): At line 0 in (none)
Cannot find module (IF-MIB): At line 0 in (none)
Cannot find module (TCP-MIB): At line 0 in (none)
Cannot find module (UDP-MIB): At line 0 in (none)
Cannot find module (SNMPv2-MIB): At line 0 in (none)
Cannot find module (SNMPv2-SMI): At line 0 in (none)
Cannot find module (UCD-SNMP-MIB): At line 0 in (none)
Cannot find module (UCD-DEMO-MIB): At line 0 in (none)
Cannot find module (SNMP-TARGET-MIB): At line 0 in (none)
Cannot find module (SNMP-VIEW-BASED-ACM-MIB): At line 0 in (none)
Cannot find module (SNMP-COMMUNITY-MIB): At line 0 in (none)
Cannot find module (UCD-DLMOD-MIB): At line 0 in (none)
Cannot find module (SNMP-FRAMEWORK-MIB): At line 0 in (none)
Cannot find module (SNMP-MPD-MIB): At line 0 in (none)
Cannot find module (SNMP-USER-BASED-SM-MIB): At line 0 in (none)
Cannot find module (SNMP-NOTIFICATION-MIB): At line 0 in (none)
Cannot find module (SNMPv2-TM): At line 0 in (none)

3.系統沒有安裝SNMP,趕緊找Win2003安裝盤。。。(費勁。。。折騰。。。)
  新增Windows元件,選擇管理與監控工具,安裝過程發現snmp.exe,snmptrap.exe進入系統服務

4.再次執行前面程式碼,結果依舊,豈有此理。。。
  看看php_snmp.dll,函式只有一個get_module,估計是用來載入那些模組的,再搜尋一下字串,
  發現IP-MIB;IF-MIB;TCP-MIB;UDP-MIB;SNMPv2-MIB;RFC1213-MIB;UCD-SNMP-MIB;UCD-DEMO-MIB;......

5.研究一下PHP手冊中關於SNMP部分:
  In order to use the SNMP functions on Unix you need to install the ? NET-SNMP package.
  On Windows these functions are only available on NT and not on Win95/98.
  原來認為WinNT有的Win2003也應該保留,現在看來有誤,既然在Unix中PHP的SNMP是基於NET-SNMP,那麼
  在Windows上可能也是基於NET-SNMP,而以前的WinNT帶有NET-SNMP,現在估計都不帶了,因此在Win2003上
  安裝NET-SNMP試試!

6.進入http://www.net-snmp.org/,果然有windows版本,下載net-snmp-5.4.2.1-1.win32.exe
  安裝到D:/USR,然後將D:/USR/share/snmp/mibs複製到D:/USR,這是按照手冊中要求的:
  The Windows distribution contains support files for SNMP in the mibs directory.
  This directory should be moved to DRIVE:/usr/mibs, where DRIVE must be replaced with the
  driveletter where PHP is installed on, e.g.c:/usr/mibs.

7.再次執行前面程式碼,結果什麼也不顯示了,看來模組是找到了,那麼SNMP正常?
  snmp_get_quick_print()是取什麼UCD庫(NET-SNMP?)的quick_print設定的當前值,返回true或false,
  檢查前面程式碼中$quickprint,發現是false,改用下面的程式碼就是true,這個函式先不管它.
<?php
snmp_set_quick_print(1);
$quickprint = snmp_get_quick_print();
if($quickprint)echo 'true';else echo 'false';
?> 
8.函式snmpwalk:Fetch all the SNMP objects from an agent,從SNMP代理獲取所有物件,這樣應該可以檢測
  SNMP是否正常工作,因為本機安裝了SNMP服務,那麼本機也是一個SNMP代理,從它那裡應可獲得其作為網路節點的資訊
<?php
$a = snmpwalk("127.0.0.1", "public", "");
foreach ($a as $val) {
    echo "$val/n";
}
?>

9.不幸的是Warning: snmpwalk(): No response from 127.0.0.1...
  難道SNMP服務沒起作用?硬著頭皮又開始費勁。。。折騰。。。
  (1) 兩個服務都已啟動,netstat -na看看埠都還正常,有人說要LISTENING,於是GOOGLE一陣亂挖表明並非如此
      UDP    0.0.0.0:161            *:*
      UDP    0.0.0.0:162            *:*
  (2) 是否防火牆和防毒牆阻止,按理不會,全部停掉重啟重啟試試,當然不是,白折騰了
  (3) 發現安裝的NET-SNMP也帶有Agent和Trap兩個服務D:/usr/bin/snmpd.exe和snmptrapd.exe,試試還是一個鳥樣

10.沒招,準備放棄時突然想起網上多次提到SNMP服務可以設定引數,於是認真起來,發現SNMP服務的屬性果然與眾不同,
   其中安全頁上有接受團體名稱,團體就是Community啊,趕緊新增一個public,再次執行snmpwalk程式碼,結果顯示大把資訊:
Hardware: x86 Family 6 Model 9 Stepping 5 AT/AT COMPATIBLE -
Software: Windows Version 5.2 (Build 3790 Uniprocessor Free)
OID: enterprises.311.1.1.3.1.2
Timeticks: (397439) 1:06:14.39
MOVEPC
......
MOVEPC正是本機名稱,原來這麼簡單,倒。。。