Проверить с помощью ping-запросов сайт в Python?

72
задан Stevoisiak supports Monica 24 June 2019 в 18:52
поделиться

7 ответов

Посмотрите этот чистый ping Python Matthew Dixon Cowles и Jens Diemer . Кроме того, помните, что Python требует, чтобы корень породил 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 для вдохновения.

77
ответ дан jaapz 24 November 2019 в 12:32
поделиться

В зависимости от того, что Вы хотите к achive, Вы - вероятно, самый легкий вызов системной команды 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

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

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). Это не идеально, но это будет хорошо работать во многих ситуациях (где Вы знаете машины, сценарий будет работать)

40
ответ дан compie 24 November 2019 в 12:32
поделиться

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

#!/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

39
ответ дан paulski 24 November 2019 в 12:32
поделиться

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

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

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

, Если Вы означаете в общем "проверять с помощью ping-запросов" поле, чтобы видеть, произошло ли оно, можно использовать протокол эха на порте 7.

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

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

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

существует еще более потенциальное значение "ping" включая "traceroute" и "палец".

9
ответ дан S.Lott 24 November 2019 в 12:32
поделиться

использование системы проверяет с помощью 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)
0
ответ дан Corey Goldberg 24 November 2019 в 12:32
поделиться

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

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()
8
ответ дан 24 November 2019 в 12:32
поделиться

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

1
ответ дан 24 November 2019 в 12:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: