Пинговать сайт в Python? - PullRequest
       92

Пинговать сайт в Python?

71 голосов
/ 25 ноября 2008

Основной код:

from Tkinter import *
import os,sys

ana= Tk()
def ping1():
    os.system('ping')

a=Button(pen)
ip=("192.168.0.1")

a.config(text="PING",bg="white",fg="blue")
a=ping1.ip ??? 
a.pack()

ana.mainloop()

Как я могу пинговать сайты или адреса?

Ответы [ 13 ]

78 голосов
/ 25 ноября 2008

См. чистый Python ping Мэтью Диксон Коулз и Дженс Димер . Также помните, что 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.

40 голосов
/ 25 ноября 2008

В зависимости от того, чего вы хотите достичь, вам, вероятно, проще всего вызвать системную команду 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`

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

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

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

Пример регулярного выражения:

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

39 голосов
/ 25 ноября 2008

Вы можете найти презентацию Ноя Гитара Создание гибких инструментов командной строки с 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 / изображения / I / 515qmR% 2B4sjL._SL500_AA240_.jpg

9 голосов
/ 25 ноября 2008

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

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

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

Если вы хотите «пинговать» окно, чтобы проверить, работает ли оно, вы можете использовать протокол echo на порту 7.

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

Если вы хотите «пропинговать» веб-сайт, чтобы узнать, работает ли этот сайт, вы должны использовать протокол http на порту 80.

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

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

8 голосов
/ 22 июля 2009

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

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 голосов
/ 19 сентября 2012

Вот короткий фрагмент кода, использующий 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."
3 голосов
/ 01 декабря 2012

читать имя файла, файл содержит один 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)
2 голосов
/ 16 ноября 2009

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

2 голосов
/ 25 ноября 2008

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

1 голос
/ 06 марта 2015
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"
...