Gibt es in Python eine Möglichkeit, einen Server über ICMP zu pingen und TRUE zurückzugeben, wenn der Server antwortet, oder FALSE, wenn keine Antwort erfolgt?
python
python-3.x
ping
icmp
Kudu
quelle
quelle
Antworten:
Diese Funktion funktioniert unter jedem Betriebssystem (Unix, Linux, MacOS und Windows)
Python 2 und Python 3
EDITS:
By @radato
os.system
wurde ersetzt durchsubprocess.call
. Dies vermeidet die Sicherheitsanfälligkeit durch Shell-Injection in Fällen, in denen Ihre Hostnamen-Zeichenfolge möglicherweise nicht überprüft wird.Beachten Sie, dass diese Funktion laut @ikrase unter Windows immer noch zurückgegeben wird,
True
wenn Sie eineDestination Host Unreachable
Fehlermeldung erhalten.Erläuterung
Der Befehl ist
ping
sowohl in Windows- als auch in Unix-ähnlichen Systemen verfügbar.Die Option
-n
(Windows) oder-c
(Unix) steuert die Anzahl der Pakete, die in diesem Beispiel auf 1 gesetzt wurden.platform.system()
Gibt den Plattformnamen zurück. Ex.'Darwin'
unter macOS.subprocess.call()
führt einen Systemaufruf durch. Ex.subprocess.call(['ls','-l'])
.quelle
ping 8.8.8.8 -n 1
3)echo %ERRORLEVEL%
. Code: Ändern Sie die letzte Zeile des Python-Codes inreturn system_call(command)
. Bei richtiger Konnektivität erhalten Sie 0 (Null). Bei ausgeschaltetem Modem müssen Sie einen Fehlercode erhalten. Natürlich müssen beide Methoden unter denselben Bedingungen denselben Fehlercode zurückgeben.Wenn Sie Windows nicht unterstützen müssen, finden Sie hier eine sehr übersichtliche Möglichkeit:
Dies funktioniert, weil ping einen Wert ungleich Null zurückgibt, wenn die Verbindung fehlschlägt. (Der Rückgabewert unterscheidet sich je nach Netzwerkfehler.) Sie können das Ping-Timeout (in Sekunden) auch mit der Option '-t' ändern. Beachten Sie, dass dadurch Text an die Konsole ausgegeben wird.
quelle
response = os.system("ping -c 1 -w2 " + hostname + " > /dev/null 2>&1")
man ping
, um sicherzugehen.hostname
Zeichenfolge von einem Benutzer erhalten, kann dieser Ihren Server leicht hacken, indem er Ihnen eine "URL" wie "Gefällt mir" gibt'google.com; rm -rf /*'
. Verwenden Siesubprocess.run(["ping", "-c", "1", hostname]).returncode
stattdessen.Es gibt ein Modul namens Pyping , das dies tun kann. Es kann mit pip installiert werden
Die Verwendung dieses Moduls ist recht einfach. Wenn Sie dieses Modul verwenden, benötigen Sie jedoch Root-Zugriff, da unter der Haube Rohpakete erstellt werden.
quelle
os.system('ping -c 1 -t 1 hostname')
Lösung. Außerdem ist diepyping
Bibliothek im Vergleich zur Verwendung der TCP / IP-Sockets-Bibliothek sehr einfach zu verwenden. Ich habe mein Ping-Programm mit beiden geschrieben undpyping
ist meiner Meinung nach viel schneller und einfacher zu verwenden, insbesondere wenn man mit der Verwendung der TCP / IP-Sockets-Bibliothek nicht vertraut ist.pip install ping3
quelle
whereis ping
, um den richtigen Pfad zu erhalten.ping_response = subprocess.Popen(["ping", hostname, "-n", '1'], stdout=subprocess.PIPE).stdout.read()
Für Python3 gibt es ein sehr einfaches und praktisches Python-Modul ping3 : (
pip install ping3
benötigt Root- Rechte).Dieses Modul ermöglicht auch die Anpassung einiger Parameter.
quelle
Da ich mein Python-Programm universell auf Version 2.7 und 3.x sowie auf der Plattform Linux, Mac OS und Windows haben möchte, musste ich die vorhandenen Beispiele ändern.
quelle
False if platform.system().lower()=="windows" else True
dir könnte man natürlich auch einfach verwendenplatform.system().lower() != "windows"
.os.name!="nt"
auch funktionieren? Zugegeben, ich habe es nicht bei allen Ver / Plattform-Combos ausprobiert!def ping(host): process = subprocess.Popen(["ping", "-n", "1",host], stdout=subprocess.PIPE, stderr=subprocess.PIPE) streamdata = process.communicate()[0] if 'unreachable' in str(streamdata): return 1 return process.returncode
unreachable
in der Pipe gefunden wird, nein?Nachdem ich mich umgesehen hatte, schrieb ich mein eigenes Ping-Modul, das eine große Anzahl von Adressen überwacht, asynchron ist und nicht viele Systemressourcen verbraucht. Sie finden es hier: https://github.com/romana/multi-ping/ Es ist Apache-lizenziert, sodass Sie es in Ihrem Projekt nach Belieben in Ihrem Projekt verwenden können.
Die Hauptgründe für die Implementierung meiner eigenen sind die Einschränkungen der anderen Ansätze:
quelle
quelle
Stellen Sie sicher, dass Pyping installiert ist, oder installieren Sie es. Pip Install Pyping
quelle
Programmatisches ICMP-Ping ist aufgrund der erhöhten Berechtigungen, die zum Senden von ICMP-Rohpaketen erforderlich sind, kompliziert, und das Aufrufen von
ping
Binärdateien ist hässlich. Bei der Serverüberwachung können Sie dasselbe Ergebnis mit einer Technik namens TCP-Ping erzielen :Intern wird dadurch einfach eine TCP-Verbindung zum Zielserver hergestellt und diese sofort getrennt, wobei die verstrichene Zeit gemessen wird. Diese spezielle Implementierung ist etwas eingeschränkt, da sie keine geschlossenen Ports verarbeitet, aber für Ihre eigenen Server ziemlich gut funktioniert.
quelle
quelle
Ich löse das mit:
Mit "TTL" können Sie feststellen, ob der Ping korrekt ist. Saludos
quelle
Meine Reduktion unter Verwendung von Ideen aus Antworten in diesem Beitrag, aber nur unter Verwendung des neueren empfohlenen Unterprozessmoduls und von Python3:
quelle
True if condition else False
für die Rückgabe von True oder False basierend auf einer Bedingung verwenden. Verwenden Sie einfach zBshell_needed = operating_sys == 'Windows'
undreturn success == 0
Dieses Skript funktioniert unter Windows und sollte unter anderen Betriebssystemen funktionieren: Es funktioniert unter Windows, Debian und Macosx und benötigt einen Test unter Solaris.
quelle
Am Ende fand ich diese Frage in Bezug auf ein ähnliches Szenario. Ich habe das Pyping ausprobiert, aber das Beispiel von Naveen hat unter Windows 2.7 unter Windows nicht funktioniert.
Ein Beispiel, das für mich funktioniert hat, ist:
quelle
pyping
scheint kein Standardmodul zu sein. Vielleicht könnten Sie einen Link bereitstellen?Mit Multi-Ping (
pip install multiPing
) habe ich diesen einfachen Code erstellt ( kopieren und einfügen, wenn Sie so wollen! ):Verwendung:
Wenn Sie eine einzelne Probe wünschen, kann der zweite Parameter "
10
" ignoriert werden!Ich hoffe es hilft!
quelle
Meine Version einer Ping-Funktion:
Fühlen Sie sich frei, es zu verwenden, wie Sie wollen.
quelle
Scheint einfach genug, gab mir aber Anfälle. Ich bekam immer wieder "ICMP Open-Socket-Betrieb nicht erlaubt", sonst würden die Lösungen auflegen, wenn der Server offline wäre. Wenn Sie jedoch wissen möchten, dass der Server aktiv ist und Sie einen Webserver auf diesem Server ausführen, übernimmt curl die Aufgabe. Wenn Sie ssh und Zertifikate haben, reichen ssh und ein einfacher Befehl aus. Hier ist der Code:
quelle
Ich hatte ähnliche Anforderungen, also habe ich sie wie unten gezeigt implementiert. Es wird unter Windows 64 Bit und Linux getestet.
Wenn IP nicht erreichbar ist, löst subprocess.check_output () eine Ausnahme aus. Eine zusätzliche Überprüfung kann durch Extrahieren von Informationen aus der Ausgabezeile 'Pakete: Gesendet = 2, Empfangen = 2, Verloren = 0 (0% Verlust)' erfolgen.
quelle
Hier ist eine Lösung, die das Python-
subprocess
Modul und dasping
vom zugrunde liegenden Betriebssystem bereitgestellte CLI-Tool verwendet. Getestet unter Windows und Linux. Unterstützung beim Festlegen eines Netzwerkzeitlimits. Benötigt keine Root-Rechte (zumindest unter Windows und Linux).quelle
Verwenden Sie dies, es wurde unter Python 2.7 getestet und funktioniert einwandfrei. Bei Erfolg wird die Ping-Zeit in Millisekunden zurückgegeben und bei Fehlschlag False zurückgegeben.
quelle
Eine Sache, die viele Antworten vermissen, ist, dass (zumindest in Windows) die
ping
Befehl 0 zurückgibt (was auf Erfolg hinweist), wenn er die Antwort "Zielhost nicht erreichbar" erhält.Hier ist mein Code, der prüft, ob er
b'TTL='
in der Antwort enthalten ist, da dieser nur vorhanden ist, wenn der Ping den Host erreicht hat. Hinweis: Der größte Teil dieses Codes basiert auf den anderen Antworten hier.Hinweis: Dadurch wird die Ausgabe erfasst, anstatt sie zu drucken. Wenn Sie also die Ausgabe von anzeigen möchten
ping
, müssen SiecompletedPing.stdout
vor der Rückkehr drucken .quelle
NUR WINDOWS - Ich kann nicht glauben, dass niemand Win32_PingStatus aufgerissen hat. Mit einer einfachen WMI-Abfrage geben wir ein Objekt mit wirklich detaillierten Informationen kostenlos zurück
Beispielausgabe
quelle
Ich leihe mir andere Antworten aus. Versuchen Sie, Abfragen zu vereinfachen und zu minimieren.
quelle
Ich brauchte einen schnelleren Ping-Sweep und wollte keine externen Bibliotheken verwenden. Daher habe ich mich entschlossen, die Parallelität mithilfe der integrierten Bibliothek zu verwenden
asyncio
.Dieser Code erfordert Python 3.7+ und wird nur unter Linux erstellt und getestet . Es funktioniert nicht unter Windows, aber ich bin sicher, dass Sie es leicht ändern können, um unter Windows zu funktionieren.
Ich bin kein Experte,
asyncio
aber ich habe diesen großartigen Artikel verwendet. Beschleunigen Sie Ihr Python-Programm mit Parallelität und mir diese Codezeilen ausgedacht. Ich habe versucht, es so einfach wie möglich zu gestalten. Daher müssen Sie höchstwahrscheinlich mehr Code hinzufügen, um Ihren Anforderungen zu entsprechen.Es wird weder wahr noch falsch zurückgegeben. Ich dachte, es wäre bequemer, die IP-Adresse zu drucken, die auf eine Ping-Anfrage reagiert. Ich denke, es ist ziemlich schnell und pingt 255 ips in fast 10 Sekunden.
Beispielausgabe:
Beachten Sie, dass die IPs nicht in Ordnung sind, da die IP gedruckt wird, sobald sie antwortet, sodass die IP, die zuerst antwortet, zuerst gedruckt wird.
quelle
Eine einfache, die ich gerade in einer Minute gekocht habe. Mit icmplib braucht man Root-Privilegien. Das Folgende funktioniert ziemlich gut! HTH
quelle