Start · Sprachen · PHP · Referenz · snmp2_getnext

snmp2_getnext

Funktion

Liest das auf die angegebene Objekt-ID folgende SNMP-Objekt eines SNMP-Agenten über SNMPv2c.

seit PHP 5.2.0 Kategorie: http

Signatur

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

Beschreibung

snmp2_getnext() sendet eine SNMP GET-NEXT-Anfrage an einen SNMP-Agenten und gibt den Wert des Objekts zurück, das in der MIB-Reihenfolge direkt nach der angegebenen Objekt-ID (OID) steht. Die Funktion verwendet das SNMPv2c-Protokoll.

Diese Funktion ist nützlich, wenn man sequenziell durch SNMP-Tabellen oder MIB-Zweige navigieren möchte, ohne die genauen OIDs aller Einträge zu kennen. Typische Anwendungsfälle sind das Traversieren von Schnittstellentabellen, Routing-Tabellen oder anderen tabellarischen SNMP-Strukturen auf Netzwerkgeräten.

Im Gegensatz zu snmp2_get(), das einen exakten OID-Wert abruft, springt snmp2_getnext() immer zum nächsten verfügbaren Objekt. Dadurch kann man mit einer Schleife die gesamte MIB traversieren, bis das Ende des MIB-Baums erreicht ist.

Die Funktion setzt voraus, dass die SNMP-Erweiterung (ext/snmp) in PHP aktiviert ist und die Net-SNMP-Bibliothek installiert ist.

Parameter

Name Typ Default Beschreibung
$hostname Pflicht string Hostname oder IP-Adresse des SNMP-Agenten. Optionale Angabe eines Ports mit Doppelpunkt, z. B. 192.168.1.1:161.
$community Pflicht string Der SNMPv2c Community-String (Read-Community), z. B. 'public'.
$object_id Pflicht array|string Die OID, nach der gesucht werden soll. Es wird das nächste Objekt in der MIB-Reihenfolge zurückgegeben. Kann ein String (einzelne OID) oder ein Array mit mehreren OIDs sein.
$timeout int -1 Timeout in Mikrosekunden. Der Wert -1 verwendet den System-Standardwert.
$retries int -1 Anzahl der Wiederholungsversuche bei Zeitüberschreitung. Der Wert -1 verwendet den System-Standardwert.

Rückgabewert

Typ
mixed
Beschreibung
Gibt den Wert des nächsten SNMP-Objekts als string zurück (bei einer einzelnen OID) oder als assoziatives array (bei mehreren OIDs). Im Fehlerfall wird false zurückgegeben und eine PHP-Warnung ausgegeben.

Beispiele

Einzelnen Nachfolger einer OID abrufen

<?php
// Liest das SNMP-Objekt, das in der MIB direkt nach sysDescr (1.3.6.1.2.1.1.1.0) folgt
$next = snmp2_getnext('192.168.1.1', 'public', '1.3.6.1.2.1.1.1.0');

if ($next !== false) {
    echo "Nächstes SNMP-Objekt: " . $next . PHP_EOL;
} else {
    echo "Fehler beim Abrufen des SNMP-Objekts." . PHP_EOL;
}
Nächstes SNMP-Objekt: OID: 1.3.6.1.2.1.1.2.0 Enterprises: .1.3.6.1.4.1.9.1.2488

MIB-Zweig sequenziell traversieren

<?php
// Traversiert alle Objekte unterhalb des Interface-Zweiges
$host      = '192.168.1.1';
$community = 'public';
$baseOid   = '1.3.6.1.2.1.2.2.1.2'; // ifDescr-Tabelle
$currentOid = $baseOid;

snmp_set_valueretrieval(SNMP_VALUE_PLAIN);

while (true) {
    $result = snmp2_getnext($host, $community, $currentOid, 1000000, 3);

    if ($result === false) {
        echo "Fehler oder Ende der MIB erreicht." . PHP_EOL;
        break;
    }

    // Prüfen, ob wir noch im gewünschten MIB-Zweig sind
    // (snmp2_getnext liefert OID + Wert als String zurück)
    // Für einfaches Beispiel geben wir den Wert direkt aus
    echo $result . PHP_EOL;

    // Im echten Einsatz: OID aus $result extrahieren und
    // sicherstellen, dass die neue OID noch unter $baseOid liegt
    break; // Hier nur ein Schritt als Demo
}
Gi0/1

// Wichtig · Fallstricke

Sicherheitshinweis: Der Community-String wird bei SNMPv2c im Klartext über das Netzwerk übertragen. Für sicherheitskritische Umgebungen sollte stattdessen SNMPv3 mit snmp3_getnext() verwendet werden, das Authentifizierung und Verschlüsselung unterstützt.

Endlosschleifen vermeiden: Beim Traversieren der MIB muss sichergestellt werden, dass die zurückgegebene OID noch innerhalb des gewünschten Teilbaums liegt. Andernfalls kann die Schleife über den gesamten MIB-Baum des Geräts iterieren. Zum Traversieren ganzer Zweige ist snmp2_walk() eine bequemere Alternative.

Die PHP-SNMP-Erweiterung muss mit --with-snmp kompiliert oder als Modul geladen sein. Unter Linux wird dafür typischerweise das Paket php-snmp benötigt.