Пингование локальной сети в python

Кто-нибудь знает, как использовать python для проверки связи с локальным хостом, чтобы узнать, активен он или нет? Мы (моя команда и я) уже пытались использовать

os.system("ping 192.168.1.*") 

Но ответ для пункта назначения недоступен такой же, как ответ для хоста.

Спасибо за вашу помощь.


person Justin Gardner    schedule 06.10.2011    source источник


Ответы (7)


Использовать это ...

import os

hostname = "localhost" #example
response = os.system("ping -n 1 " + hostname)

#and then check the response...
if response == 0:
    print(hostname, 'is up!')
else:
    print(hostname, 'is down!')

Если вы используете этот скрипт в Unix/Linux, замените переключатель -n на -c !
Вот и все :)

person avimehenwal    schedule 19.02.2013
comment
на случай, если я получу ответ «Пункт назначения недоступен». это не работает. - person Kamesh Jungi; 10.05.2016
comment
уверен, что вопрос может быть лучше. но, как он указал в описании, он не работает с недоступным целевым хостом. - так что ваш ответ я ошибаюсь полностью. - person Frankstar; 10.03.2021

Я обнаружил, что использование os.system(...) приводит к ложным срабатываниям (как сказал ОП, «целевой хост недоступен» == 0).

Как было сказано ранее, использование subprocess.Popen работает. Для простоты я рекомендую сделать это, а затем проанализировать результаты. Вы можете легко сделать это так:

if ('unreachable' in output):
        print("Offline")

Просто проверьте различные выходные данные, которые вы хотите проверить, из результатов ping. Сделайте «это» в «этом» чеке для этого.

Пример:

import subprocess

hostname = "10.20.16.30"
output = subprocess.Popen(["ping.exe",hostname],stdout = subprocess.PIPE).communicate()[0]

print(output)

if ('unreachable' in output):
    print("Offline")
person Michael Flyger    schedule 09.08.2013
comment
Обратите внимание, что синтаксический анализ вывода зависит от языка хост-ОС. - person Hauke; 15.12.2015

Некоторое время назад я написал небольшую программу. Возможно, это не совсем то, что вы ищете, но вы всегда можете запустить программу на хост-ОС, которая открывает сокет при запуске. Вот сама программа ping:

# Run this on the PC that want to check if other PC is online.
from socket import *

def pingit():                               # defining function for later use

    s = socket(AF_INET, SOCK_STREAM)         # Creates socket
    host = 'localhost' # Enter the IP of the workstation here 
    port = 80                # Select port which should be pinged

    try:
        s.connect((host, port))    # tries to connect to the host
    except ConnectionRefusedError: # if failed to connect
        print("Server offline")    # it prints that server is offline
        s.close()                  #closes socket, so it can be re-used
        pingit()                   # restarts whole process    

    while True:                    #If connected to host
        print("Connected!")        # prints message 
        s.close()                  # closes socket just in case
        exit()                     # exits program

pingit()                           #Starts off whole process

И вот у вас есть программа, которая может получить запрос ping:

# this runs on remote pc that is going to be checked
from socket import *

HOST = 'localhost'
PORT = 80
BUFSIZ = 1024
ADDR = (HOST, PORT)
serversock = socket(AF_INET, SOCK_STREAM)
serversock.bind(ADDR)
serversock.listen(2)

while 1:
    clientsock, addr = serversock.accept()
    serversock.close()
    exit()

Чтобы запустить программу, фактически не показывая ее, просто сохраните файл как .pyw вместо .py. Это делает его невидимым, пока пользователь не проверит запущенные процессы.

Надеюсь, это помогло вам

person CamIce    schedule 01.03.2013
comment
Извините, но вопрос был для проверки связи с сервером, что является другим сценарием. Подключение имеет смысл только тогда, когда вы знаете, что сервер существует и работает! - person cslotty; 08.08.2019

Лучший способ сделать это в Windows, если вы не хотите анализировать вывод, — это использовать Popen следующим образом:

num = 1
host = "192.168.0.2"
wait = 1000

ping = Popen("ping -n {} -w {} {}".format(num, wait, host),
             stdout=PIPE, stderr=PIPE)  ## if you don't want it to print it out
exit_code = ping.wait()

if exit_code != 0:
    print("Host offline.")
else:
    print("Host online.")  

Это работает, как и ожидалось. Код выхода не дает ложных срабатываний. Я тестировал его в Python 2.7 и 3.4 в Windows 7 и Windows 10.

person Daniel F.    schedule 25.05.2018

Для простоты я использую самодельные функции на основе сокета.

def checkHostPort(HOSTNAME, PORT):
    """
        check if host is reachable
    """
    result = False
    try:
        destIp  =  socket.gethostbyname(HOSTNAME)
    except:
        return result
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(15)
    try:
        conn = s.connect((destIp, PORT))
        result = True
        conn.close()
    except:
        pass
    return result

если IP:Port доступен, вернуть True

Если вы хотите имитировать Ping, можете обратиться к ping.py

person KJoker    schedule 16.02.2017

Попробуй это:

ret = os.system("ping -o -c 3 -W 3000 192.168.1.10")
if ret != 0:
    print "Host is not up"

-o ожидает только один пакет

-W 3000 дает только 3000 мс для ответа на пакет.

-c 3 позволяет попробовать несколько раз, чтобы ваш пинг не работал вечно

person jdi    schedule 06.10.2011

Используйте это и проанализируйте вывод строки


import subprocess
output = subprocess.Popen(["ping.exe","192.168.1.1"],stdout = subprocess.PIPE).communicate()[0]

person yo_man    schedule 06.10.2011