Ping сайт в Python?

Как мне пропинговать сайт или IP-адрес с помощью Python?

Ответ 1

Смотрите чистый Python ping Matthew Dixon Cowles и Jens Diemer. Кроме того, помните, что Python требует, чтобы root запускал ICMP (то есть ping) сокеты в Linux.

import ping, socket
try:
    ping.verbose_ping('www.google.com', count=3)
    delay = ping.Ping('www.wikipedia.org', timeout=2000).do()
except socket.error, e:
    print "Ping Error:", e

Исходный код легко читается, см. реализации verbose_ping и Ping.do для вдохновения.

Ответ 2

В зависимости от того, что вы хотите достичь, вы, вероятно, проще всего вызываете команду ping системы.

Использование модуля подпроцесса - лучший способ сделать это, хотя вам нужно помнить, что команда ping отличается от разных операционных систем!

import subprocess

host = "www.google.com"

ping = subprocess.Popen(
    ["ping", "-c", "4", host],
    stdout = subprocess.PIPE,
    stderr = subprocess.PIPE
)

out, error = ping.communicate()
print out

Вам не нужно беспокоиться о символах запуска оболочки. Например..

host = "google.com; `echo test`

.. будет не выполнять команду эхо.

Теперь, чтобы получить результаты ping, вы можете проанализировать переменную out. Пример вывода:

round-trip min/avg/max/stddev = 248.139/249.474/250.530/0.896 ms

Пример regex:

import re
matcher = re.compile("round-trip min/avg/max/stddev = (\d+.\d+)/(\d+.\d+)/(\d+.\d+)/(\d+.\d+)")
print matcher.search(out).groups()

# ('248.139', '249.474', '250.530', '0.896')

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

Ответ 3

Вы можете найти презентацию Noah Gift Создание гибких инструментов командной строки с помощью Python. В нем он объединяет подпроцесс, очередь и многопоточность для разработки решения, способного одновременно пинговать хосты и ускорять процесс. Ниже приведена базовая версия, прежде чем он добавит синтаксический анализ командной строки и некоторые другие функции. Код этой версии и другие можно найти здесь

#!/usr/bin/env python2.5
from threading import Thread
import subprocess
from Queue import Queue

num_threads = 4
queue = Queue()
ips = ["10.0.1.1", "10.0.1.3", "10.0.1.11", "10.0.1.51"]
#wraps system ping command
def pinger(i, q):
    """Pings subnet"""
    while True:
        ip = q.get()
        print "Thread %s: Pinging %s" % (i, ip)
        ret = subprocess.call("ping -c 1 %s" % ip,
            shell=True,
            stdout=open('/dev/null', 'w'),
            stderr=subprocess.STDOUT)
        if ret == 0:
            print "%s: is alive" % ip
        else:
            print "%s: did not respond" % ip
        q.task_done()
#Spawn thread pool
for i in range(num_threads):

    worker = Thread(target=pinger, args=(i, queue))
    worker.setDaemon(True)
    worker.start()
#Place work in queue
for ip in ips:
    queue.put(ip)
#Wait until worker threads are done to exit    
queue.join()

Он также является автором: Python для системного администрирования Unix и Linux

http://ecx.images-amazon.com/images/I/515qmR%2B4sjL._SL500_AA240_.jpg

Ответ 4

Трудно сказать, каков ваш вопрос, но есть некоторые альтернативы.

Если вы хотите буквально выполнить запрос с использованием протокола ping ICMP, вы можете получить библиотеку ICMP и выполнить запрос ping напрямую. Google "Python ICMP", чтобы найти такие вещи icmplib. Возможно, вы захотите посмотреть scapy.

Это будет намного быстрее, чем при использовании os.system("ping " + ip ).

Если вы хотите в общем случае "пинговать" поле, чтобы узнать, может ли он использоваться, вы можете использовать протокол эха на порте 7.

Для эха вы используете библиотеку socket, чтобы открыть IP-адрес и порт 7. Вы пишете что-то на этом порту, отправляете возврат каретки ("\r\n"), а затем прочитать ответ.

Если вы хотите "ping" на веб-сайте, чтобы узнать, работает ли сайт, вам нужно использовать протокол http на порту 80.

Для правильной проверки веб-сервера вы используете urllib2, чтобы открыть определенный URL-адрес. (/index.html всегда популярен) и читайте ответ.

Есть еще больше потенциального значения "ping", включая "traceroute" и "finger".

Ответ 5

Я сделал нечто подобное, как вдохновение:

import urllib
import threading
import time

def pinger_urllib(host):
  """
  helper function timing the retrival of index.html 
  TODO: should there be a 1MB bogus file?
  """
  t1 = time.time()
  urllib.urlopen(host + '/index.html').read()
  return (time.time() - t1) * 1000.0


def task(m):
  """
  the actual task
  """
  delay = float(pinger_urllib(m))
  print '%-30s %5.0f [ms]' % (m, delay)

# parallelization
tasks = []
URLs = ['google.com', 'wikipedia.org']
for m in URLs:
  t = threading.Thread(target=task, args=(m,))
  t.start()
  tasks.append(t)

# synchronization point
for t in tasks:
  t.join()

Ответ 6

Вот короткий фрагмент с использованием subprocess. Метод check_call либо возвращает 0 для успеха, либо вызывает исключение. Таким образом, мне не нужно разбирать вывод ping. Я использую shlex для разделения аргументов командной строки.

  import subprocess
  import shlex

  command_line = "ping -c 1 www.google.comsldjkflksj"
  args = shlex.split(command_line)
  try:
      subprocess.check_call(args,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
      print "Website is there."
  except subprocess.CalledProcessError:
      print "Couldn't get a ping."

Ответ 7

прочитайте имя файла, файл содержит один URL-адрес в строке, например:

http://www.poolsaboveground.com/apache/hadoop/core/
http://mirrors.sonic.net/apache/hadoop/core/

использовать команду:

python url.py urls.txt

получить результат:

Round Trip Time: 253 ms - mirrors.sonic.net
Round Trip Time: 245 ms - www.globalish.com
Round Trip Time: 327 ms - www.poolsaboveground.com

исходный код (url.py):

import re
import sys
import urlparse
from subprocess import Popen, PIPE
from threading import Thread


class Pinger(object):
    def __init__(self, hosts):
        for host in hosts:
            hostname = urlparse.urlparse(host).hostname
            if hostname:
                pa = PingAgent(hostname)
                pa.start()
            else:
                continue

class PingAgent(Thread):
    def __init__(self, host):
        Thread.__init__(self)        
        self.host = host

    def run(self):
        p = Popen('ping -n 1 ' + self.host, stdout=PIPE)
        m = re.search('Average = (.*)ms', p.stdout.read())
        if m: print 'Round Trip Time: %s ms -' % m.group(1), self.host
        else: print 'Error: Invalid Response -', self.host


if __name__ == '__main__':
    with open(sys.argv[1]) as f:
        content = f.readlines() 
    Pinger(content)

Ответ 8

Посмотрите код Джереми Хилтона, если вам нужно выполнить более сложную, детальную реализацию на Python, а не просто позвонить ping.

Ответ 9

Вы можете найти обновленную версию упомянутого script, которая работает как на Windows, так и на Linux здесь

Ответ 10

import subprocess as s
ip=raw_input("Enter the IP/Domain name:")
if(s.call(["ping",ip])==0):
    print "your IP is alive"
else:
    print "Check ur IP"

Ответ 11

Я использую модуль ping Lars Strand. Google для "Python ping pars" Lars Strand, и вы найдете много ссылок.

Ответ 12

используя команду ping для ping для списка хостов:

import re
from subprocess import Popen, PIPE
from threading import Thread


class Pinger(object):
    def __init__(self, hosts):
        for host in hosts:
            pa = PingAgent(host)
            pa.start()

class PingAgent(Thread):
    def __init__(self, host):
        Thread.__init__(self)        
        self.host = host

    def run(self):
        p = Popen('ping -n 1 ' + self.host, stdout=PIPE)
        m = re.search('Average = (.*)ms', p.stdout.read())
        if m: print 'Round Trip Time: %s ms -' % m.group(1), self.host
        else: print 'Error: Invalid Response -', self.host


if __name__ == '__main__':
    hosts = [
        'www.pylot.org',
        'www.goldb.org',
        'www.google.com',
        'www.yahoo.com',
        'www.techcrunch.com',
        'www.this_one_wont_work.com'
       ]
    Pinger(hosts)

Ответ 13

Использовать его для тестирования на 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

Ответ 14

Если вы действительно хотите что-то в Python, с чем можно поиграть, взгляните на Scapy:

from scapy.all import *
request = IP(dst="www.google.com")/ICMP()
answer = sr1(request)