Локальная сеть пингует в питоне - PullRequest
8 голосов
/ 06 октября 2011

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

os.system("ping 192.168.1.*") 

Но ответ для недоступного пункта назначения совпадает с ответом для хоста.

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

Ответы [ 7 ]

12 голосов
/ 19 февраля 2013

Используйте это ...

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!
То есть все:)

6 голосов
/ 10 августа 2013

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

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

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

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

Пример:

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")
5 голосов
/ 01 марта 2013

Я недавно написал небольшую программу. Возможно, это не совсем то, что вы ищете, но вы всегда можете запустить программу на хост-ОС, которая при запуске открывает сокет. Вот сама программа 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. Это делает его невидимым, пока пользователь не проверит запущенные процессы.

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

2 голосов
/ 16 февраля 2017

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

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: Порт доступен, верните True

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

1 голос
/ 25 мая 2018

Лучший способ сделать это в 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.

1 голос
/ 06 октября 2011

Попробуйте:

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 мсек для ответа на пакет.

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

0 голосов
/ 06 октября 2011

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


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

...