Signatur
Beschreibung
snmpget() fragt einen bestimmten SNMP-Wert (OID – Object Identifier) von einem entfernten Gerät ab, das einen SNMP-Agenten betreibt. Die Funktion unterstützt SNMPv1 und gibt den Wert als Zeichenkette zurück, sofern das Gerät erreichbar ist und die Community-Zeichenkette stimmt.
SNMP wird häufig zur Netzwerküberwachung eingesetzt, etwa um Informationen wie Systemname (1.3.6.1.2.1.1.5.0), Uptime, Schnittstellen-Traffic-Zähler oder andere MIB-Werte auszulesen. Typische Einsatzgebiete sind Monitoring-Systeme, Netzwerk-Inventarisierung und automatisierte Geräteverwaltung.
Für komplexere Anfragen – z. B. SNMPv2c- oder SNMPv3-Kommunikation mit Authentifizierung und Verschlüsselung – empfiehlt sich die objektorientierte SNMP-Klasse (SNMP), da snmpget() nur SNMPv1 unterstützt.
Die PHP-SNMP-Erweiterung muss beim Kompilieren aktiviert sein (abhängig von der Net-SNMP-Bibliothek). Unter Linux ist dafür typischerweise das Paket libsnmp-dev und die PHP-Erweiterung php-snmp erforderlich.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $hostname Pflicht | string | Hostname oder IP-Adresse des SNMP-Agenten (z. B. '192.168.1.1' oder 'router.example.com'). Optional kann ein Port mit Doppelpunkt angehängt werden: '192.168.1.1:161'. |
|
| $community Pflicht | string | Die SNMP-Community-Zeichenkette, die als einfaches Passwort dient. Für Lesezugriff ist häufig 'public' voreingestellt, sollte jedoch in Produktivumgebungen geändert werden. |
|
| $object_id Pflicht | array|string | Der OID (Object Identifier) des abzurufenden SNMP-Objekts, z. B. '1.3.6.1.2.1.1.1.0' für die Systembeschreibung. Kann als Zeichenkette oder ab PHP 5.4 auch als Array mehrerer OIDs angegeben werden. |
|
| $timeout | int | -1 | Zeitlimit in Mikrosekunden, nach dem ein Verbindungsversuch abgebrochen wird. -1 verwendet den Standardwert der Net-SNMP-Bibliothek. |
| $retries | int | -1 | Anzahl der Wiederholungsversuche bei Nichtantwort des Agenten. -1 verwendet den Standardwert der Net-SNMP-Bibliothek. |
Rückgabewert
false zurückgegeben und ein PHP-Fehler der Stufe E_WARNING ausgegeben.Beispiele
Systemname eines Routers per SNMP abfragen
<?php
// Systemname (sysName) eines Netzwerkgeräts abrufen
$hostname = '192.168.1.1';
$community = 'public';
$oid = '1.3.6.1.2.1.1.5.0'; // sysName
$result = snmpget($hostname, $community, $oid);
if ($result !== false) {
echo 'Systemname: ' . $result . PHP_EOL;
} else {
echo 'SNMP-Abfrage fehlgeschlagen.' . PHP_EOL;
}
Uptime und Systembeschreibung abfragen mit Timeout
<?php
// SNMPv1-Abfrage mit individuellem Timeout (2 Sekunden) und 3 Wiederholungen
$hostname = '192.168.1.1';
$community = 'public';
// sysDescr: Textuelle Beschreibung des Systems
$sysDescr = snmpget($hostname, $community, '1.3.6.1.2.1.1.1.0', 2000000, 3);
// sysUpTime: Zeit seit dem letzten Neustart in Hundertstelsekunden
$sysUpTime = snmpget($hostname, $community, '1.3.6.1.2.1.1.3.0', 2000000, 3);
if ($sysDescr !== false) {
echo 'Beschreibung: ' . $sysDescr . PHP_EOL;
}
if ($sysUpTime !== false) {
echo 'Uptime: ' . $sysUpTime . PHP_EOL;
}
// Wichtig · Fallstricke
Sicherheitshinweis: Die Community-Zeichenkette wird im SNMPv1-Protokoll im Klartext über das Netzwerk übertragen und bietet keinen ausreichenden Schutz. In sicherheitskritischen Umgebungen sollte SNMPv3 mit Authentifizierung und Verschlüsselung (via SNMP-Klasse) eingesetzt werden.
Nur SNMPv1: snmpget() unterstützt ausschließlich SNMP Version 1. Für SNMPv2c steht snmp2_get() zur Verfügung, für SNMPv3 snmp3_get() oder die SNMP-Klasse.
Rückgabeformat: Der zurückgegebene Wert enthält den SNMP-Datentyp als Präfix, z. B. STRING: "Wert", INTEGER: 42 oder Timeticks: (100) 0:00:01.00. Für maschinelle Weiterverarbeitung muss dieser Präfix ggf. herausgeparst werden.
Firewall/Erreichbarkeit: SNMP kommuniziert standardmäßig über UDP-Port 161. Stellen Sie sicher, dass dieser Port auf dem Zielgerät nicht geblockt ist und der Agent Anfragen von der abfragenden IP-Adresse akzeptiert.