Timeout is in MICRO seconds.
1,000,000 µs = 1 s
(PHP 4, PHP 5, PHP 7, PHP 8)
snmpwalk — Recibe todos los objetos SNMP de un agente
$hostname
,$community
,$object_id
,$timeout
= -1,$retries
= -1
snmpwalk() se utiliza para leer todos los valores de un
agente SNMP especificado por hostname
.
hostname
El agente SNMP (servidor).
community
La comunidad de lectura.
object_id
Si null
, object_id
se toma como raíz de los
objetos SNMP y todos los objetos de este árbol se devuelven en forma de array.
Si object_id
está especificado, todos los objetos SNMP
que siguen a este object_id
se devuelven.
timeout
El número de microsegundos desde el primer timeout.
retries
El número de intentos en caso de que ocurra el tiempo límite.
Devuelve un array de valores del objeto SNMP, comenzando por
object_id
o false
si ocurre un error.
Ejemplo #1 Ejemplo con snmpwalk()
<?php
$a = snmpwalk("127.0.0.1", "public", "");
foreach ($a as $val) {
echo "$val\n";
}
?>
La llamada a la función anterior devolverá todos los objetos SNMP desde el agente SNMP ejecutado en el host local. Se recorren los valores mediante un bucle.
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;
snmpwalk and other snmp functions really need to support an optional port.
In the corporate world it is very common to change the port for SNMP from 161 to some other port for security. It is a simple security obfuscation, but a lot of bots will scan well known ports for attack vectors. For example, we used to change ours to something like 1161 just to prevent making it easy.
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.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>";
?>
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);
?>