Erreichbarkeit eines Clients mit Batch Ping testen

Intro

Ziel soll es sein, mittels eines „Batch Ping Skripts“ die Erreichbarkeit eines Server/Clients zu testen. Dabei wird der Ping-Befehl benutzt, welcher mit Hilfe von ICMP-„Echo Request“-Paketen ein Netzwerkgerät kontaktiert und für gewöhnlich eine Antwort von diesem erhält. Die Antwort kann dann in Form von errorlevel automatisiert ausgewertet werden um die Erreichbarkeit anzugeben. Aber: Beim Batch Erreichbarkeits-Test mittels Ping gibt es Details, die beachtet werden müssen – der errorlevel kann trügen.

Technische Hintergründe

Die normale ICMP-Anfrage via CMD kann 3 verschiedene Ergebnisse erzeugen:
Normaler ping ohne Parameter von 192.168.178.20 zu 192.168.178.88:
Zeitüberschreitung der Anforderung“ – der Client antwortet nicht und keine andere Vermittlungsstelle reagiert. Der Errorlevel ist 1.
Antwort von 192.168.178.13: Zielhost nicht erreichbar.“ – der Ziel-Client antwortet nicht aber eine andere Gegenstelle reagiert. Gateway, Router, Switch o.Ä. melden, dass dieser Client zwar im Netzwerk gefunden wird aber auf den Ping nicht reagiert, ihn nicht auflösen kann oder etwas in der Art. Der Errorlevel ist 0! Obwohl der Ziel-Client nicht erreichbar ist wird der Rückgabewert 0 für erfolgreich zurückgeliefert.
Antwort von 192.168.178.88: Bytes=32 Time<1ms TTL=128“ – die Ziel-Client ist erreichbar, der Errorlevel ist 0.

Lösung – Code

Möchte man die tatsächliche Erreichbarkeit des Ziel-Clients erfassen, ist folgender Weg nötig:

REM Aufteilen der IP für bessere Automatisierung mehrerer Clients eines Netzes
set ipnetz=192.168.178
set serverip=88
ping %ipnetz%.%serverip% -n 2 -w 1000 -l 2000
if %errorlevel%==1 echo Fehler

Mit -l wird die Größe des Ping Pakets bestimmt, -w bestimmt die Wartezeit in Millisekunden. Beide Parameter in Kombination sorgen dafür, dass der Ping nur noch eine Zeitüberschreitung oder einen Erfolg liefern kann. Das Verwenden von Errorlevel ist somit also sicher.

Alternative:

ping  %server_ip% -n 1 -w 1000 -l 2000 -4 | find /i "TTL" >nul 2>&1
if errorlevel 1 (
echo Server offline
) else (
echo Server online
)

via Kommentar von Gerd – funktioniert ebenfalls zuverlässig, optimiert mit dem -4 Parameter, danke Rudolph.
batch-ping-erreichbarkeit-online-test-script


Update: Überlegung: 2000 Byte Pakete mit einem maximalen Zeitlimit von 1000 Millisekunden… dadurch ist zwar ein Ping bei 2 gut angebundenen Clients entweder erfolgreich oder komplett nicht erfolgreich. Was passiert aber mit 2 sehr langsamen Clients? Wenn der Zielhost eigentlich erreichbar wäre aber es in 1 Sekunde nicht schafft auf das 2KB Ping Paket zu antworten. Wäre das dann ebenfalls negativ? Eine solche Situation ist wohl eher nicht üblich, wenn nicht sogar recht unwahrscheinlich, aber rein logisch könnte sie Probleme bereiten. Wer dazu Anmerkungen hat, bitte kommentieren!

10 Kommentare

  1. Mh ich habe eine einfache if/else schleife die einen rechner so lange anpingen soll bis er wach ist und dann teamviewer startet.
    Habe festgestellt das der erste ping zwar korrekt 0 wiedergibt jedoch beim 2. ping zielhost ist nicht erreichbar und somit errorlevel 1 kommt win7 benutze router im netzwerk 🙁

  2. Hallo,
    ebenfalls vielen Dank. Ich habe ein Script „gebastelt“ bzw. die Grundstruktur im Internet gefunden, mit dem Ziel: ein W7-Client herunterzufahren wenn z.B. IP-Cams aus sind. In den Fällen in dem die Cams in einem anderen LAN sind, klappte es ohne Probleme. Bei den Cams im eigenen LAN wurde wurde der „Errorlevel“ nicht erkannt. Ein Ping auf eine Cam im EIGENEN LAN, die aber aus ist. Brachte folgende Pingmeldung:
    „Antwort von eigener-IP: Zielhorst nicht erreichbar.“
    Also eigentlich kein „error“! Beim Ping in ein anderes Netz, kam die Pingantwort: „Zeitüberschreitung der Anforderung.“ Also „errorlevel = 1“. Nachdem ist ich die Pingzahl (-n 2) erhöhte und die Zeit (-w) + die Paketgröße (-l) entsprechend angab. Seit dem klappt es wunderbar. Ich habe hier sogar w = 500 und l = 3000 gesetzt und es funzt sehr gut. Vielen Dank nochmal für Deine Erklärung. Gruss Herbi56

  3. Bin auf der Suche nach einer Lösung für dieses Problem hier auf dieser Seite gelandet.

    Leider funktioniert das Ganze hier bei mir nicht – ich bekomme trotz Angabe von Werten für -w und -l die Antwort „Zielhost nicht erreichbar“ und damit ein Errorlevel von 0 🙁

    Betriebssystem ist Windows 10 Pro, 64 Bit.

    Auch wenn man die anzupingende IP-Adresse so umständlich aus zwei Variablen zusammen setzt, wie im Vorschlag angegeben, funktioniert das Ganze nicht…

    Abhilfe (quick and dirty):

    ping %server_ip_complete% -n 1 | find /i "TTL" >nul 2>&1
    if errorlevel 1 (
        echo Server offline
    ) 

    Erklärung: Nur bei einer Antwort des Servers wird auch die TTL angegeben, bei allen Fehlermeldungen erscheint sie logischerweise nicht. Deshalb reicht es, auf „TTL“ in der Ausgabe des Ping-Befehls zu testen.

    Beste Grüße
    Gerd

  4. Hallo Gerd,
    seltsam, bei mir funktioniert es immernoch wie gewollt. Eine nicht erreichbare IP liefer „Fehler“ zurück, eine erreichbare nicht. Ebenfalls Win10 Pro 64.
    Aber unabhängig davon ist gegen deinen Code natürlich rein gar nichts auszusetzen – funktioniert wunderbar und ich sehe spontan auch keine Fälle, in denen „TTL“ auch bei negativen Pings erscheinen könnte.
    Ich nehme den Schnipsel mal mit in den Artikel, if you don’t mind.

  5. Übrigens, wenn man das heutzutage noch benutzen will, bekommt man mit

    ping %server_ip_complete% -n 1 | find /i „TTL“ >nul 2>&1

    Probleme. Abhilfe schafft hier der Paramter -4 um die IPv4 zu erzwingen. Die Ausgabe für IPv6 enthält kein TTL.

    ping %server_ip_complete% -n 1 -4 | find /i „TTL“ >nul 2>&1

Schreibe einen Kommentar