Пингование серверов в Python

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

Комментарии к вопросу (1)

Если вам не нужно поддерживать 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 возвращает ненулевое значение при неудачном соединении. (Возвращаемое значение на самом деле отличается в зависимости от сетевой ошибки.) Вы также можете изменить таймаут ping (в секундах) с помощью опции '-t'. Обратите внимание, что при этом будет выведен текст на консоль.

Комментарии (11)

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

Изменения: По @Раде ОС.система "сменила" подпроцесс.вызов. По @Борис документация рекомендует использовать подпроцесса.выполнить() Если вы'ре, используя 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, если вы получаете ошибки хост назначения недоступен.

Объяснение

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

платформа.системы() возвращает имя платформы. Экс. 'Дарвин' на macOS. подпроцесса.звоните() выполняет системный вызов. Экс. подпроцесса.вызов(['Общ','-Л']).

Комментарии (8)

Есть модуль, называемый 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))
Комментарии (7)
import subprocess
ping_response = subprocess.Popen(["/bin/ping", "-c1", "-w100", "192.168.0.1"], stdout=subprocess.PIPE).stdout.read()
Комментарии (6)

Потому что мне нравится моя программа на Python универсальный на версии 2.7 и 3.X и на платформе Linux, Mac ОС и 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"))
Комментарии (5)
#!/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()
Комментарии (1)

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

Основными причинами внедрения мои ограничения и другие подходы:

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

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

#!/usr/bin/python
import pyping

response = pyping.ping('Your IP')

if response.ret_code == 0:
    print("reachable")
else:
    print("unreachable")
Комментарии (3)

Для питон3 там's очень простой и удобный модуль Python ping3: (типун установить ping3).

from ping3 import ping, verbose_ping
ping('example.com')  # Returns delay in seconds.
>>> 0.215697261510079666

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

Комментарии (0)

Я решаю это с:

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

"и ТТЛ" По есть способ узнать, если пинг будет правильно. Saludos

Комментарии (0)

Программные пакеты ICMP пинг осложняется повышенными привилегиями, необходимые для отправки сырьевых ICMP-пакеты, и называть "пинг" бинарные некрасиво. Для мониторинга серверов, вы можете достичь того же результата с помощью метода, называемого TCP пинг:

# pip3 install tcping
>>> from tcping import Ping
# Ping(host, port, timeout)
>>> ping = Ping('212.69.63.54', 22, 60)
>>> ping.ping(3)
Connected to 212.69.63.54[:22]: seq=1 time=23.71 ms
Connected to 212.69.63.54[:22]: seq=2 time=24.38 ms
Connected to 212.69.63.54[:22]: seq=3 time=24.00 ms

Внутренне, это просто устанавливает TCP-соединение с целевым сервером и сразу же бросает его, измеряя время, прошедшее. Эта конкретная реализация будет немного ограничен в том, что он не'т обрабатывать закрытые порты, но для вашего собственного сервера он работает довольно хорошо.

Комментарии (0)

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

import subprocess
import platform

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

def ping(ip):
    # ping_command = ['ping', ip, '-n', '1'] instead of ping_command = ['ping', ip, '-n 1'] for Windows
    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)
Комментарии (1)
#!/usr/bin/python3

import subprocess as sp

ip = "192.168.122.60"
status,result = sp.getstatusoutput("ping -c1 -w2 " + ip)

if status == 0: 
    print("System " + ip + " is UP !")
else:
    print("System " + ip + " is DOWN !")
Комментарии (0)

Моя версия функции ping:

  • Работает на Python 3.5 и выше, на Windows и Linux (должно работать на Mac, но может'т это тест).
  • На Windows, возвращает false, если команда ping выдает с "узел недоступен и quot назначения;.
  • И не показывает никаких выходных данных, либо в всплывающем окне или в командной строке. `` импорт платформы, подпроцесс

деф пинг(host_or_ip, пакеты=1, параметр timeout=1000): ''' системных вызовов и"пинг" и команда, возвращает true, если пинг проходит успешно. Обязательный параметр: host_or_ip (ул. адрес Хост на пинг) Дополнительные параметры: пакеты (в том числе, количество повторов), время ожидания (интервал, МС ждать ответ) Не показывает никаких выходных данных, либо в всплывающем окне или в командной строке. В Python 3.5+, Windows и Linux совместимо (Mac не проверял, должно работать) '''

Команда ping одинаков для Windows и Linux, за исключением "по-количество пакетов" и флаг.

if platform.system().lower() == 'windows':
    command = ['ping', '-n', str(packets), '-w', str(timeout), host_or_ip]
    # run parameters: capture output, discard error messages, do not show window
    result = subprocess.run(command, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, creationflags=0x08000000)
    # 0x0800000 is a windows-only Popen flag to specify that a new process will not create a window.
    # On Python 3.7+, you can use a subprocess constant:
    #   result = subprocess.run(command, capture_output=True, creationflags=subprocess.CREATE_NO_WINDOW)
    # On windows 7+, ping returns 0 (ok) when host is not reachable; to be sure host is responding,
    # we search the text "TTL=" on the command output. If it's there, the ping really had a response.
    return result.returncode == 0 and b'TTL=' in result.stdout
else:
    command = ['ping', '-c', str(packets), '-w', str(timeout), host_or_ip]
    # run parameters: discard output and error messages
    result = subprocess.run(command, stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
    return result.returncode == 0

`` Не стесняйтесь использовать его, как вам будет.

Комментарии (0)

Этот скрипт работает на Windows, и должен работать на других операционных системах : Он работает на Windows, Debian, и на MacOSX, нужен тест на Солярис.

import os
import platform

def isUp(hostname):

    giveFeedback = False

    if platform.system() == "Windows":
        response = os.system("ping "+hostname+" -n 1")
    else:
        response = os.system("ping -c 1 " + hostname)

    isUpBool = False
    if response == 0:
        if giveFeedback:
            print hostname, 'is up!'
        isUpBool = True
    else:
        if giveFeedback:
            print hostname, 'is down!'

    return isUpBool

print(isUp("example.com")) #Example domain
print(isUp("localhost")) #Your computer
print(isUp("invalid.example.com")) #Unresolvable hostname: https://tools.ietf.org/html/rfc6761
print(isUp("192.168.1.1")) #Pings local router
print(isUp("192.168.1.135")) #Pings a local computer - will differ for your network
Комментарии (1)

Я нашла этот вопрос по похожему сценарию. Я опробовал pyping но пример, приведенный Нэвин не't работа для меня в Windows под питона 2.7.

Пример, который работал для меня:

import pyping

response = pyping.send('Your IP')

if response['ret_code'] == 0:
    print("reachable")
else:
    print("unreachable")
Комментарии (2)

Через мульти-пин (пункт Установить multiPing) я сделал этот простой код (просто скопировать и вставить, если вы будете!):

from multiping import MultiPing

def ping(host,n = 0):
    if(n>0):
        avg = 0
        for i in range (n):
            avg += ping(host)
        avg = avg/n
    # Create a MultiPing object to test hosts / addresses
    mp = MultiPing([host])

    # Send the pings to those addresses
    mp.send()

    # With a 1 second timout, wait for responses (may return sooner if all
    # results are received).
    responses, no_responses = mp.receive(1)

    for addr, rtt in responses.items():
        RTT = rtt

    if no_responses:
        # Sending pings once more, but just to those addresses that have not
        # responded, yet.
        mp.send()
        responses, no_responses = mp.receive(1)
        RTT = -1

    return RTT

Использование:

#Getting the latency average (in seconds) of host '192.168.0.123' using 10 samples
ping('192.168.0.123',10)

Если вам нужен один образец, второй параметр " и10" могут быть проигнорированы!

Надеюсь, что это помогает!

Комментарии (1)

Здесь'ы решение с помощью Python's модуль `подпроцесса и инструмент командной строки на "пинг", предусмотренных на основную ОС. Проверено на Windows и Linux. Поддержка настройки сетевой тайм-аут. Не'т нужны root (по крайней мере, на Windows и Linux).

import platform
import subprocess

def ping(host, network_timeout=3):
    """Send a ping packet to the specified host, using the system "ping" command."""
    args = [
        'ping'
    ]

    platform_os = platform.system().lower()

    if platform_os == 'windows':
        args.extend(['-n', '1'])
        args.extend(['-w', str(network_timeout * 1000)])
    elif platform_os in ('linux', 'darwin'):
        args.extend(['-c', '1'])
        args.extend(['-W', str(network_timeout)])
    else:
        raise NotImplemented('Unsupported OS: {}'.format(platform_os))

    args.append(host)

    try:
        if platform_os == 'windows':
            output = subprocess.run(args, check=True, universal_newlines=True).stdout

            if output and 'TTL' not in output:
                return False
        else:
            subprocess.run(args, check=True)

        return True
    except (subprocess.CalledProcessError, subprocess.TimeoutExpired):
        return False
Комментарии (0)

У меня было аналогичное требование, поэтому я реализовал ее так, как показано ниже. Это проверено на Windows 64 бит и Linux.

import subprocess
def systemCommand(Command):
    Output = ""
    Error = ""     
    try:
        Output = subprocess.check_output(Command,stderr = subprocess.STDOUT,shell='True')
    except subprocess.CalledProcessError as e:
        #Invalid command raises this exception
        Error =  e.output 

    if Output:
        Stdout = Output.split("\n")
    else:
        Stdout = []
    if Error:
        Stderr = Error.split("\n")
    else:
        Stderr = []

    return (Stdout,Stderr)

#in main
Host = "ip to ping"
NoOfPackets = 2
Timeout = 5000 #in milliseconds
#Command for windows
Command = 'ping -n {0} -w {1} {2}'.format(NoOfPackets,Timeout,Host)
#Command for linux 
#Command = 'ping -c {0} -w {1} {2}'.format(NoOfPackets,Timeout,Host)
Stdout,Stderr = systemCommand(Command)
if Stdout:
   print("Host [{}] is reachable.".format(Host))
else:
   print("Host [{}] is unreachable.".format(Host))

Если IP не доступен подпроцесса.check_output() вызывает исключение. Дополнительная проверка может быть сделано путем извлечения информации из выходной линии 'пакетов: отправлено = 2, получено = 2, потеряно = 0 (0% потерь)'.

Комментарии (1)

Кажется достаточно простым, но дал мне подходит. Я продолжал получать "по протоколу ICMP открытые операции на сокете, не допускается" или другого решения бы повесить, если сервер был отключен. Если, однако, то, что вы хотите знать это, что сервер жив и работает веб-сервер на этом сервере, тогда завиток будет делать эту работу. Если у вас есть SSH и сертификаты, то SSH и простую команду хватит. Вот код:

from easyprocess import EasyProcess # as root: pip install EasyProcess
def ping(ip):
    ping="ssh %s date;exit"%(ip) # test ssh alive or
    ping="curl -IL %s"%(ip)      # test if http alive
    response=len(EasyProcess(ping).call(timeout=2).stdout)
    return response #integer 0 if no response in 2 seconds
Комментарии (0)