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

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

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

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

Ответы [ 26 ]

0 голосов
/ 08 июня 2018

ТОЛЬКО для WINDOWS - Не могу поверить, что никто не взломал Win32_PingStatus Используя простой запрос WMI, мы бесплатно возвращаем объект, полный действительно подробной информации

import wmi


# new WMI object
c = wmi.WMI()

# here is where the ping actually is triggered
x = c.Win32_PingStatus(Address='google.com')

# how big is this thing? - 1 element
print 'length x: ' ,len(x)


#lets look at the object 'WMI Object:\n'
print x


#print out the whole returned object
# only x[0] element has values in it
print '\nPrint Whole Object - can directly reference the field names:\n'
for i in x:
    print i



#just a single field in the object - Method 1
print 'Method 1 ( i is actually x[0] ) :'
for i in x:
    print 'Response:\t', i.ResponseTime, 'ms'
    print 'TTL:\t', i.TimeToLive


#or better yet directly access the field you want
print '\npinged ', x[0].ProtocolAddress, ' and got reply in ', x[0].ResponseTime, 'ms'

образец вывода

0 голосов
/ 02 марта 2018

Одна вещь, которую многие ответы упускают, заключается в том, что (по крайней мере в Windows) команда ping возвращает 0 (указывает на успешность), если она получает ответ «Хост назначения недоступен».

Вот мой код, который проверяет, есть ли в ответе b'TTL=', поскольку он присутствует, только когда пинг достиг хоста. Примечание: большая часть этого кода основана на других ответах здесь.

import platform
import subprocess

def ping(ipAddr, timeout=100):
    '''
    Send a ping packet to the specified host, using the system ping command.
    Accepts ipAddr as string for the ping destination.
    Accepts timeout in ms for the ping timeout.
    Returns True if ping succeeds otherwise Returns False.
        Ping succeeds if it returns 0 and the output includes b'TTL='
    '''
    if platform.system().lower() == 'windows':
        numFlag = '-n'
    else:
        numFlag = '-c'
    completedPing = subprocess.run(['ping', numFlag, '1', '-w', str(timeout), ipAddr],
                                   stdout=subprocess.PIPE,    # Capture standard out
                                   stderr=subprocess.STDOUT)  # Capture standard error
    # print(completedPing.stdout)
    return (completedPing.returncode == 0) and (b'TTL=' in completedPing.stdout)

print(ping('google.com'))

Примечание. Это захватывает вывод вместо его печати, поэтому, если вы хотите увидеть вывод ping, вам нужно будет напечатать completedPing.stdout до возврата.

0 голосов
/ 15 марта 2014
  1 #!/usr/bin/python
  2
  3 import os
  4 import sys
  5 import time
  6
  7 os.system("clear")
  8 home_network = "172.16.23."
  9 mine = []
 10
 11 for i in range(1, 256):
 12         z =  home_network + str(i)
 13         result = os.system("ping -c 1 "+ str(z))
 14         os.system("clear")
 15         if result == 0:
 16                 mine.append(z)
 17
 18 for j in mine:
 19         print "host ", j ," is up"

Простой, который я только что приготовил за минуту ... используя icmplib, нужны root-привилегии, приведенные ниже работают довольно хорошо! НТН

0 голосов
/ 11 апреля 2015

Используйте это, он протестирован на python 2.7 и работает нормально, он возвращает время ping в миллисекундах, если успех, и возвращает False при ошибке.

import platform,subproccess,re
def Ping(hostname,timeout):
    if platform.system() == "Windows":
        command="ping "+hostname+" -n 1 -w "+str(timeout*1000)
    else:
        command="ping -i "+str(timeout)+" -c 1 " + hostname
    proccess = subprocess.Popen(command, stdout=subprocess.PIPE)
    matches=re.match('.*time=([0-9]+)ms.*', proccess.stdout.read(),re.DOTALL)
    if matches:
        return matches.group(1)
    else: 
        return False
0 голосов
/ 28 мая 2019

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

def ping(host, timeout=3):
    """
    Send a ping (ICMP) request to a remote host.

    The command is set to ``ping -c 1 -W 1 <host>``, which sends exactly 1 ping
    packet, and waits for 1 second before terminating.

    Args:
        host (str): Hostname or IP address.
        timeout (int): Ping command timeout (in seconds).

    Returns:
        bool: The ping response. ``True`` if the host responds to a ping request 
            within the specified timeout period. ``False`` otherwise.

    Note:
        A host may not respond to a ping (ICMP) request even if the host name is 
        valid because of firewall rules.
    """
    # Building the command. Ex: "ping -c 1 google.com"
    command = ['ping', host, '-W', '1', '-c', '1']

    try:
        subprocess.run(command, timeout=timeout, check=True)
        return True
    except (subprocess.CalledProcessError, subprocess.TimeoutExpired):
        #log.warning("Failed to ping host: %s with timeout: %d", host, timeout)
        return False
0 голосов
/ 10 февраля 2015

Кажется, достаточно просто, но подвело меня. Я продолжал получать сообщение «Работа с открытым сокетом ICMP запрещена», иначе решения зависали бы, если бы сервер был отключен. Если, однако, вы хотите знать, что сервер активен и на этом сервере запущен веб-сервер, то curl сделает эту работу. Если у вас есть 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
...