Пинг серверы в Python - PullRequest
       182

Пинг серверы в Python

136 голосов
/ 02 июня 2010

Есть ли в Python способ пропинговать сервер через ICMP и возвращать TRUE, если сервер отвечает, или FALSE, если ответа нет?

Ответы [ 26 ]

140 голосов
/ 01 мая 2012

Если вам не нужна поддержка Windows, вот очень лаконичный способ сделать это:

import os
hostname = "google.com" #example
response = os.system("ping -c 1 " + hostname)

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

Это работает, потому что ping возвращает ненулевое значение в случае сбоя соединения. (Возвращаемое значение на самом деле отличается в зависимости от сетевой ошибки.) Вы также можете изменить время ожидания пинга (в секундах), используя опцию -t. Обратите внимание, это выведет текст на консоль.

80 голосов
/ 21 сентября 2015

Эта функция работает в любой ОС (Unix, Linux, macOS и Windows)
Python 2 и Python 3

редактирует:
На @ radato os.system был заменен subprocess.call.
By @ Boris В документации рекомендуется использовать subprocess.run(), если вы используете Python 3.5 +.

import platform    # For getting the operating system name
import subprocess  # For executing a shell command

def ping(host):
    """
    Returns True if host (str) responds to a ping request.
    Remember that a host may not respond to a ping (ICMP) request even if the host name is valid.
    """

    # Option for the number of packets as a function of
    param = '-n' if platform.system().lower()=='windows' else '-c'

    # Building the command. Ex: "ping -c 1 google.com"
    command = ['ping', param, '1', host]

    return subprocess.call(command) == 0

Обратите внимание, что, согласно @ikrase в Windows, эта функция все равно вернет True, если вы получите ошибку Destination Host Unreachable.

Объяснение

Команда ping как в Windows, так и в Unix-подобных системах.
Опция -n (Windows) или -c (Unix) контролирует количество пакетов, которое в этом примере было установлено на 1.

platform.system() возвращает имя платформы. Ex. 'Darwin' в macOS.
subprocess.call() выполняет системный вызов. Ex. subprocess.call(['ls','-l']).

31 голосов
/ 08 октября 2015

Существует модуль с именем pyping , который может сделать это. Может быть установлен с pip

pip install pyping

Использовать его довольно просто, однако при использовании этого модуля вам необходим root-доступ, поскольку он создает необработанные пакеты под капотом.

import pyping

r = pyping.ping('google.com')

if r.ret_code == 0:
    print("Success")
else:
    print("Failed with {}".format(r.ret_code))
27 голосов
/ 02 июня 2010
import subprocess
ping_response = subprocess.Popen(["/bin/ping", "-c1", "-w100", "192.168.0.1"], stdout=subprocess.PIPE).stdout.read()
12 голосов
/ 25 февраля 2016

Поскольку мне нравится, что моя программа Python универсальна для версий 2.7 и 3.x и для платформ Linux, Mac OS и Windows, мне пришлось изменить существующие примеры.

# shebang does not work over all platforms
# ping.py  2016-02-25 Rudolf
# subprocess.call() is preferred to os.system()
# works under Python 2.7 and 3.4
# works under Linux, Mac OS, Windows

def ping(host):
    """
    Returns True if host responds to a ping request
    """
    import subprocess, platform

    # Ping parameters as function of OS
    ping_str = "-n 1" if  platform.system().lower()=="windows" else "-c 1"
    args = "ping " + " " + ping_str + " " + host
    need_sh = False if  platform.system().lower()=="windows" else True

    # Ping
    return subprocess.call(args, shell=need_sh) == 0

# test call
print(ping("192.168.17.142"))
6 голосов
/ 01 октября 2014
#!/usr/bin/python3

import subprocess as sp

def ipcheck():
    status,result = sp.getstatusoutput("ping -c1 -w2 " + str(pop))
    if status == 0:
        print("System " + str(pop) + " is UP !")
    else:
        print("System " + str(pop) + " is DOWN !")


pop = input("Enter the ip address: ")
ipcheck()
5 голосов
/ 16 декабря 2015

Убедитесь, что pyping установлен или установлен pip install pyping

#!/usr/bin/python
import pyping

response = pyping.ping('Your IP')

if response.ret_code == 0:
    print("reachable")
else:
    print("unreachable")
5 голосов
/ 18 августа 2017

Посмотрев вокруг, я написал свой собственный модуль ping, который предназначен для мониторинга большого количества адресов, является асинхронным и не использует много системных ресурсов. Вы можете найти его здесь: https://github.com/romana/multi-ping/ Он лицензирован Apache, так что вы можете использовать его в своем проекте любым удобным для вас способом.

Основными причинами для реализации моего собственного являются ограничения других подходов:

  • Многие из упомянутых здесь решений требуют exec для утилиты командной строки. Это довольно неэффективно и требует много ресурсов, если вам нужно отслеживать большое количество IP-адресов.
  • Другие упоминают некоторые старые модули ping для Python. Я посмотрел на них, и, в конце концов, у всех них была какая-то проблема (например, неправильная установка идентификаторов пакетов), и они не обрабатывали пинг большого количества адресов.
3 голосов
/ 21 августа 2016

Мое сокращение с использованием идей из ответов в этом посте, но только с использованием более нового рекомендуемого модуля подпроцесса и python3:

import subprocess
import platform

operating_sys = platform.system()
nas = '192.168.0.10'

def ping(ip):

    ping_command = ['ping', ip, '-n 1'] if operating_sys == 'Windows' else ['ping', ip, '-c 1']
    shell_needed = True if operating_sys == 'Windows' else False

    ping_output = subprocess.run(ping_command,shell=shell_needed,stdout=subprocess.PIPE)
    success = ping_output.returncode
    return True if success == 0 else False

out = ping(nas)
print(out)
3 голосов
/ 06 сентября 2017

Я решаю это с помощью:

def ping(self, host):
    res = False

    ping_param = "-n 1" if system_name().lower() == "windows" else "-c 1"

    resultado = os.popen("ping " + ping_param + " " + host).read()

    if "TTL=" in resultado:
        res = True
    return res

"TTL" - это способ узнать, правильно ли выполнен пинг. Салудос

...