Czy w Pythonie istnieje sposób na wysłanie polecenia ping do serwera przez protokół ICMP i zwrócenie wartości TRUE, jeśli serwer odpowie, lub FALSE, jeśli nie ma odpowiedzi?
python
python-3.x
ping
icmp
Kudu
źródło
źródło
Odpowiedzi:
Ta funkcja działa w każdym systemie operacyjnym (Unix, Linux, macOS i Windows)
Python 2 i Python 3
EDYCJE:
By @radato
os.system
został zastąpiony przezsubprocess.call
. Pozwala to uniknąć podatności na wstrzyknięcie powłoki w przypadkach, gdy ciąg znaków nazwy hosta może nie zostać zweryfikowany.Zauważ, że zgodnie z @ikrase w systemie Windows ta funkcja będzie nadal zwracać,
True
jeśli pojawi sięDestination Host Unreachable
błąd.Wyjaśnienie
Polecenie jest dostępne
ping
w systemach Windows i Unix-podobnych.Opcja
-n
(Windows) lub-c
(Unix) kontroluje liczbę pakietów, które w tym przykładzie były ustawione na 1.platform.system()
zwraca nazwę platformy. Dawny.'Darwin'
na macOS.subprocess.call()
wykonuje wywołanie systemowe. Dawny.subprocess.call(['ls','-l'])
.źródło
ping 8.8.8.8 -n 1
3)echo %ERRORLEVEL%
. Kod: Zmodyfikuj ostatni wiersz kodu Pythona nareturn system_call(command)
. Przy odpowiedniej łączności otrzymasz 0 (zero). Przy wyłączonym modemie musisz otrzymać kod błędu. Oczywiście obie metody muszą zwracać ten sam kod błędu w tych samych warunkach.Jeśli nie potrzebujesz obsługi systemu Windows, oto naprawdę zwięzły sposób, aby to zrobić:
Działa to, ponieważ ping zwraca wartość niezerową, jeśli połączenie nie powiedzie się. (Wartość zwracana w rzeczywistości różni się w zależności od błędu sieci.) Możesz także zmienić limit czasu ping (w sekundach), używając opcji „-t”. Uwaga, spowoduje to wyświetlenie tekstu na konsoli.
źródło
response = os.system("ping -c 1 -w2 " + hostname + " > /dev/null 2>&1")
man ping
aby się upewnić.hostname
ciąg od użytkownika, może on łatwo zhakować twój serwer, podając ci „url” w rodzaju'google.com; rm -rf /*'
. Użyjsubprocess.run(["ping", "-c", "1", hostname]).returncode
zamiast tego.Istnieje moduł o nazwie pyping, który może to zrobić. Można go zainstalować za pomocą pip
Jest dość prosty w użyciu, jednak podczas korzystania z tego modułu potrzebujesz dostępu do konta roota, ponieważ tworzy on surowe pakiety pod maską.
źródło
os.system('ping -c 1 -t 1 hostname')
rozwiązania. Ponadtopyping
biblioteka jest bardzo łatwa w użyciu w porównaniu do korzystania z biblioteki gniazd TCP / IP. Napisałem swój program ping, używając obu ipyping
moim zdaniem jest znacznie szybszy i łatwiejszy w użyciu, zwłaszcza jeśli ktoś nie jest zaznajomiony z korzystaniem z biblioteki gniazd TCP / IP.pip install ping3
źródło
whereis ping
aby uzyskać właściwą ścieżkę.ping_response = subprocess.Popen(["ping", hostname, "-n", '1'], stdout=subprocess.PIPE).stdout.read()
Dla python3 istnieje bardzo prosty i wygodny moduł ping3 : (
pip install ping3
wymaga uprawnień roota ).Moduł ten pozwala również na dostosowanie niektórych parametrów.
źródło
Ponieważ lubię, aby mój program w Pythonie był uniwersalny w wersji 2.7 i 3.x oraz na platformach Linux, Mac OS i Windows, musiałem zmodyfikować istniejące przykłady.
źródło
False if platform.system().lower()=="windows" else True
możesz oczywiście po prostu użyćplatform.system().lower() != "windows"
.os.name!="nt"
też nie działa? Trzeba przyznać, że nie próbowałem tego na wszystkich kombinacjach ver / platform!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
zostanie znaleziony w potoku, nie?Po rozejrzeniu się napisałem własny moduł ping, który jest przeznaczony do monitorowania dużej liczby adresów, jest asynchroniczny i nie zużywa dużo zasobów systemowych. Znajdziesz go tutaj: https://github.com/romana/multi-ping/ Jest na licencji Apache, więc możesz go używać w swoim projekcie w dowolny sposób.
Głównymi powodami wdrożenia mojego własnego są ograniczenia innych podejść:
źródło
źródło
Upewnij się, że pyping jest zainstalowany lub zainstaluj go pip install pyping
źródło
Programowy ping ICMP jest skomplikowany ze względu na podwyższone uprawnienia wymagane do wysyłania surowych pakietów ICMP, a wywoływanie
ping
plików binarnych jest brzydkie. W przypadku monitorowania serwera ten sam wynik można osiągnąć za pomocą techniki zwanej pingiem TCP :Wewnętrznie, to po prostu ustanawia połączenie TCP z serwerem docelowym i natychmiast je przerywa, mierząc upływający czas. Ta konkretna implementacja jest nieco ograniczona, ponieważ nie obsługuje zamkniętych portów, ale w przypadku własnych serwerów działa całkiem dobrze.
źródło
źródło
Rozwiązuję to za pomocą:
„TTL” to sposób na sprawdzenie, czy ping jest prawidłowy. Saludos
źródło
Moja redukcja przy użyciu pomysłów z odpowiedzi w tym poście, ale tylko przy użyciu nowszego zalecanego modułu podprocesu i python3:
źródło
True if condition else False
do zwracania wartości Prawda lub Fałsz na podstawie warunku. Po prostu użyj np.shell_needed = operating_sys == 'Windows'
Ireturn success == 0
Ten skrypt działa w systemie Windows i powinien działać w innych systemach operacyjnych: działa w systemach Windows, Debian i macosx, wymaga testu na solaris.
źródło
W końcu znalazłem to pytanie dotyczące podobnego scenariusza. Wypróbowałem pyping, ale przykład podany przez Naveena nie działał dla mnie w systemie Windows pod Pythonem 2.7.
Przykład, który zadziałał dla mnie to:
źródło
pyping
nie wydaje się być standardowym modułem. Może mógłbyś podać link?Używając Multi-ping (
pip install multiPing
) zrobiłem ten prosty kod ( po prostu skopiuj i wklej, jeśli chcesz! ):Stosowanie:
Jeśli potrzebujesz jednej próbki, drugi parametr „
10
” można zignorować!Mam nadzieję, że to pomoże!
źródło
Moja wersja funkcji ping:
Możesz go używać tak, jak chcesz.
źródło
Wydaje się dość proste, ale dało mi ataki. Ciągle otrzymywałem komunikat „ICMP open socket operation niedozwolony”, w przeciwnym razie rozwiązania zawiesiłyby się, gdyby serwer był wyłączony. Jeśli jednak chcesz wiedzieć, że serwer działa i na nim działa serwer WWW, to curl wykona zadanie. Jeśli masz ssh i certyfikaty, wystarczy ssh i prosta komenda. Oto kod:
źródło
Miałem podobny wymóg, więc zaimplementowałem go, jak pokazano poniżej. Jest testowany na 64-bitowym systemie Windows i Linuksie.
Gdy adres IP jest nieosiągalny, funkcja subprocess.check_output () zgłasza wyjątek. Dodatkową weryfikację można przeprowadzić, wyodrębniając informacje z wiersza wyjściowego „Pakiety: wysłane = 2, odebrane = 2, utracone = 0 (0% utraty)”.
źródło
Oto rozwiązanie wykorzystujące
subprocess
moduł Pythona iping
narzędzie CLI dostarczane przez podstawowy system operacyjny. Przetestowano w systemach Windows i Linux. Obsługa ustawiania limitu czasu sieci. Nie potrzebuje uprawnień roota (przynajmniej w systemie Windows i Linux).źródło
Użyj tego, co zostało przetestowane w Pythonie 2.7 i działa dobrze, zwraca czas ping w milisekundach, jeśli się powiedzie, i zwróci False w przypadku niepowodzenia.
źródło
Jedną rzeczą, której brakuje w wielu odpowiedziach, jest to (przynajmniej w systemie Windows)
ping
polecenie zwraca 0 (wskazujące na sukces), jeśli otrzyma odpowiedź „Host docelowy nieosiągalny”.Oto mój kod, który sprawdza, czy
b'TTL='
jest w odpowiedzi, ponieważ jest obecny tylko wtedy, gdy ping dotarł do hosta. Uwaga: większość tego kodu jest oparta na innych odpowiedziach tutaj.Uwaga: To przechwytuje dane wyjściowe zamiast je drukować, więc jeśli chcesz zobaczyć wynik
ping
, musisz wydrukowaćcompletedPing.stdout
przed powrotem.źródło
TYLKO WINDOWS - Nie mogę uwierzyć, że nikt nie otworzył się Win32_PingStatus Używając prostego zapytania WMI, zwracamy obiekt pełen naprawdę szczegółowych informacji za darmo
przykładowe wyjście
źródło
Moje zapożyczenie z innych odpowiedzi. Spróbuj uprościć i zminimalizować zapytania.
źródło
Potrzebowałem szybszego przeczesywania pingów i nie chciałem używać żadnych zewnętrznych bibliotek, więc zdecydowałem się na użycie współbieżności przy użyciu wbudowanych
asyncio
.Ten kod wymaga języka Python 3.7+ i został stworzony i przetestowany tylko w systemie Linux . Nie będzie działać w systemie Windows, ale jestem pewien, że można go łatwo zmienić, aby działał w systemie Windows.
Nie jestem ekspertem,
asyncio
ale użyłem tego świetnego artykułu Przyspiesz swój program w Pythonie dzięki współbieżności i wymyśliłem te linie kodów. Starałem się, aby było to tak proste, jak to tylko możliwe, więc najprawdopodobniej będziesz musiał dodać do niego więcej kodu, aby dopasować go do swoich potrzeb.Nie zwraca prawdy ani fałszu, pomyślałem, że wygodniej będzie po prostu wydrukować adres IP, który odpowiada na żądanie ping. Myślę, że jest dość szybki, pinguje 255 ips w prawie 10 sekund.
Przykładowe dane wyjściowe:
Zauważ, że adresy IP nie są w kolejności, ponieważ adres IP jest drukowany, gdy tylko odpowie, więc ten, który odpowiada jako pierwszy, jest drukowany jako pierwszy.
źródło
Prosty, który właśnie ugotowałem w minutę .. używanie icmplib wymaga uprawnień roota, poniższe działa całkiem nieźle! HTH
źródło