HOWTO · Python

Python Ping

Dieses Tutorial demonstriert, wie man einen Server in Python anpingt

Auf dieser Seite

Um von Python aus zu prüfen, ob ein Host auf ICMP-Echoanfragen antwortet, können Sie den Betriebssystembefehl ping mit subprocess.call() oder os.system() aufrufen oder die Funktion ping3.ping() verwenden. Eine Antwort zeigt, dass der Host erreichbar ist, und kann die Round-Trip-Zeit angeben. Sie beweist jedoch nicht, dass eine bestimmte Anwendung oder ein bestimmter Dienst verfügbar ist. Die Ergebnisse hängen außerdem vom Betriebssystem, den installierten Werkzeugen, Firewall-Regeln und den Netzwerkrichtlinien ab.

Einen Server in Python mit subprocess.call() anpingen

subprocess.call() führt ein Programm aus und gibt dessen Prozess-Exit-Status zurück. Wenn Sie den Befehl als Liste übergeben, müssen Sie aus dem Hostnamen keine Shell-Befehlszeichenfolge zusammensetzen. Die Option für die Anzahl der Pakete unterscheidet sich je nach Plattform: Gängige ping-Implementierungen verwenden unter Windows -n und auf Unix-ähnlichen Systemen -c.

import platform
import shutil
import subprocess


def ping_host(host):
    ping = shutil.which("ping")
    if ping is None:
        return None  # The ping program is not installed or on PATH.

    count_option = "-n" if platform.system() == "Windows" else "-c"
    try:
        status = subprocess.call(
            [ping, count_option, "1", host],
            stdout=subprocess.DEVNULL,
            stderr=subprocess.DEVNULL,
            timeout=5,
        )
    except (OSError, subprocess.TimeoutExpired):
        return None
    return status == 0


result = ping_host("example.com")
if result is None:
    print("ping is unavailable")
else:
    print("host responded" if result else "no successful response")

In der bereitgestellten Laufumgebung wurde folgende Ausgabe beobachtet. Unveränderte Ausgabeblöcke behalten ihre Beschriftungen auf Englisch.

ping is unavailable

Wie der unveränderte Ausgabeblock zeigt, war ping in der bereitgestellten Laufumgebung nicht verfügbar. Ist das Programm installiert, benötigt dieses Beispiel außerdem Netzwerkzugriff. Es unterdrückt die Befehlsausgabe und gibt True zurück, wenn der Prozess mit Status null endet, False bei einem anderen Status und None, wenn das Programm nicht verfügbar ist oder eine Zeitüberschreitung auftritt. Ein Status ungleich null verrät nicht, ob Paketverlust, Filterung, Namensauflösung oder eine andere systemspezifische Ursache dafür verantwortlich ist. Passen Sie den Host und die Option für die Paketanzahl an Ihre Umgebung an.

Einen Server in Python mit os.system() anpingen

os.system() führt eine Befehlszeichenfolge über eine Shell aus und gibt einen von der Plattform codierten Status zurück. Die Funktion ist weniger flexibel als subprocess.call(). Werden nicht vertrauenswürdige Hostangaben an einen Befehl angehängt, kann dadurch eine Shell-Injection möglich werden. Für Werte, die von Benutzern stammen können, sollten Sie stattdessen mit subprocess.call() eine Argumentliste übergeben. Wenn Sie os.system() mit einem festen, vertrauenswürdigen Host verwenden, wählen Sie die für Ihre Plattform passende Option für die Paketanzahl:

import os
import platform
import shutil

host = "example.com"  # Keep this fixed or validate it before use.
ping = shutil.which("ping")
if ping is None:
    print("ping is unavailable")
else:
    count_option = "-n" if platform.system() == "Windows" else "-c"
    status = os.system(f'"{ping}" {count_option} 1 {host} > "{os.devnull}" 2>&1')
    print("host responded" if status == 0 else "no successful response")

In der bereitgestellten Laufumgebung wurde folgende Ausgabe beobachtet. Unveränderte Ausgabeblöcke behalten ihre Beschriftungen auf Englisch.

ping is unavailable

Wie der unveränderte Ausgabeblock zeigt, war ping in der bereitgestellten Laufumgebung nicht verfügbar. Ist es vorhanden, hängt das Beispiel von der lokalen Shell, der jeweiligen ping-Implementierung und dem Netzwerk ab. Anführungszeichen um den Programmpfad berücksichtigen Leerzeichen in diesem Pfad, doch Shell-Befehlszeichenfolgen müssen weiterhin sorgfältig behandelt werden. Setzen Sie für host keine beliebigen Benutzereingaben ein. Der Status gibt das Ergebnis des Shell-Befehls an, nicht ob ein Dienst wie ein Webserver Verbindungen annimmt.

Einen Server in Python mit ping3.ping() anpingen

Die dritte Möglichkeit ist die Funktion ping3.ping(). Sie sendet eine ICMP-Echoanfrage, ohne den Systembefehl ping aufzurufen. Installieren Sie das Paket ping3 in der Python-Umgebung, die Ihr Skript verwendet, mit python -m pip install ping3. Je nach Betriebssystem und Berechtigungen sind zum Senden von ICMP-Paketen möglicherweise zusätzliche Rechte erforderlich.

try:
    from ping3 import ping
except ImportError:
    print("Install ping3 with: python -m pip install ping3")
else:
    host = "example.com"
    response = ping(host)
    if response is None or response is False:
        print("no response reported")
    else:
        print(f"round-trip time: {response} seconds")

In der bereitgestellten Laufumgebung wurde folgende Ausgabe beobachtet. Unveränderte Ausgabeblöcke behalten ihre Beschriftungen auf Englisch.

Install ping3 with: python -m pip install ping3

Wie der unveränderte Ausgabeblock zeigt, war ping3 in der bereitgestellten Laufumgebung nicht installiert. Nach der Installation benötigt das Beispiel außerdem ausreichende ICMP-Berechtigungen und Netzwerkzugriff. Eine numerische Antwort entspricht der Round-Trip-Zeit in Sekunden. Berücksichtigen Sie bei einer ausbleibenden Antwort das Verhalten der installierten Bibliothek und Ihrer Umgebung; gehen Sie nicht davon aus, dass sich damit ein unerreichbarer Host von gefilterten oder verlorenen Paketen unterscheiden lässt.

Wählen Sie subprocess.call(), wenn Sie Argumente sicher übergeben und das etablierte ping-Werkzeug des Systems verwenden möchten. os.system() ist eine kürzere Shell-basierte Möglichkeit für einen festen, vertrauenswürdigen Befehl. Bei ping3.ping() erfolgt der Aufruf in Python und kann Zeitangaben liefern, dafür kommen ein zusätzliches Paket und mögliche Berechtigungsanforderungen hinzu. In allen drei Fällen prüft ping nur die Erreichbarkeit über ICMP. Wenn Sie wissen müssen, ob ein bestimmter Dienst funktioniert, verwenden Sie eine Prüfung auf Anwendungsebene.