• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • snmpwalk()

    (PHP 4, PHP 5, PHP 7)

    从代理返回所有的 SNMP 对象

    说明

    snmpwalk(string $hostname,string $community,string $object_id[,int $timeout[,int $retries]]): array

    返回由$object_id作为根的 SNMP 对象值所组成的数组,错误则返回FALSE

    snmpwalk()函数是用来读取所有由$hostname指定的 SNMP 代理的值。$Community指定该代理中具有读权限的域。一个为NULL$object_id将被看作 SNMP 对象树的根,而在此树下的所有对象将作为一个数组被返回。如果指定了$object_id,则返回所有在$object_id下的 SNMP 对象。

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

    上边的函数调用将从运行于本机的 SNMP 代理那里返回所有的 SNMP 对象。可使用循环遍历这些值。

    <?php
    foreach ($a as $val) {
        echo "$val\n";
    }
    ?>
    
    Timeout is in MICRO seconds.
    1,000,000 &micros = 1 s
    Note that there's different behaviuor in php snmpwalk and ucd snmpwalk. If you try to walk an oid that has one value not under a subkey of the walked oid, ucd snmpwalk will return the value while php's snmpwalk will not.
    It would be nice to be able to specify what snmp version to use ( 1,2c,3 )
    For now, I'ts hardcoded in ext/snmp/snmp.c
    change session.version from 1 to 2c or 3 if you need for now..
    i.e 
    session.version = SNMP_VERSION_1;
    to:
    session.version = SNMP_VERSION_2c;
    Something to care about in dealing with snmpwalk:<BR>
    
    While walking the MIB, snmpwalk puts info that gets into an array, and that is correct.<BR>
    
    The trouble happened when snmpwalk needs to collect information from instances that contains subinstances (i.e. walking .1.2.3.4.5 and having instances like 1.1, 1.2, 1.3): in this case it gets info and passes into an array, but when walking the array, each value is preceeded by 'Counter32: '.<BR>
    
    I've tested this in many ways and it always happened the same way.
    Ah. That's why all of our SNMP stuff was timing out anytime there was any load on the system. Sigh. A waste of two weeks trying to debug snmp....
     Even the snmpcmd manpage doesn't give a
    unit for timeout.
    for the poster wondering what the
    timeout field was measured in:
    from the ucd-snmp header file snmp_api.h:
      long  timeout; 
      /* Number of uS until first timeout
      then exponential backoff */
    A quick router device view:
    <?
    include "header";
    $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>";
    ?>
    
    I found on Windows (PHP 5) an empty string did not return anything, it just timed out. I had to use null instead:
    <?php
    $a = snmpwalk("127.0.0.1", "public", null);
    ?>
    
    I had to use an object_id like these.
    '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);
    ?>
    

    上篇:snmpset()

    下篇:snmpwalkoid()