¿Hacer ping a un sitio en Python?

Resuelto user40572 asked hace 15 años • 0 respuestas

¿Cómo hago ping a un sitio web o dirección IP con Python?

user40572 avatar Nov 25 '08 16:11 user40572
Aceptado

Vea este ping puro de Python realizado por Matthew Dixon Cowles y Jens Diemer . Además, recuerde que Python requiere root para generar sockets ICMP (es decir, ping) en 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

El código fuente en sí es fácil de leer; consulte las implementaciones de verbose_pingy de Ping.dopara inspirarse.

orip avatar Nov 25 '2008 12:11 orip

Dependiendo de lo que desee lograr, probablemente sea más fácil llamar al comando ping del sistema.

Usar el módulo de subproceso es la mejor manera de hacerlo, aunque debe recordar que el comando ping es diferente en diferentes sistemas operativos.

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

No necesita preocuparse por los caracteres de escape del shell. Por ejemplo..

host = "google.com; `echo test`

..no ejecutará el comando echo.

Ahora, para obtener realmente los resultados del ping, puedes analizar la outvariable. Salida de ejemplo:

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

Ejemplo de expresión regular:

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')

Nuevamente, recuerde que el resultado variará según el sistema operativo (e incluso la versión de ping). Esto no es ideal, pero funcionará bien en muchas situaciones (donde sepas en qué máquinas se ejecutará el script)

dbr avatar Nov 25 '2008 10:11 dbr

Puede encontrar la presentación de Noah Gift Creación de herramientas ágiles de línea de comandos con Python . En él combina subprocesos, colas y subprocesos para desarrollar una solución que sea capaz de hacer ping a los hosts simultáneamente y acelerar el proceso. A continuación se muestra una versión básica antes de agregar el análisis de la línea de comandos y algunas otras características. El código de esta versión y otras se puede encontrar aquí.

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

También es autor de: Python para Unix y Linux System Administration

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

Ryan Cox avatar Nov 25 '2008 12:11 Ryan Cox

Es difícil decir cuál es su pregunta, pero existen algunas alternativas.

Si quiere ejecutar literalmente una solicitud utilizando el protocolo de ping ICMP, puede obtener una biblioteca ICMP y ejecutar la solicitud de ping directamente. Busque en Google "Python ICMP" para encontrar cosas como esta icmplib . Es posible que también quieras mirar scapy .

Esto será mucho más rápido que usar os.system("ping " + ip ).

Si quiere hacer "ping" genéricamente a un cuadro para ver si está activo, puede usar el protocolo de eco en el puerto 7.

Para echo, usa la biblioteca de sockets para abrir la dirección IP y el puerto 7. Escribe algo en ese puerto, envía un retorno de carro ( "\r\n") y luego lee la respuesta.

Si desea hacer "ping" a un sitio web para ver si se está ejecutando, debe utilizar el protocolo http en el puerto 80.

Para comprobar correctamente un servidor web, utilice urllib2 para abrir una URL específica. ( /index.htmlsiempre es popular) y lea la respuesta.

Todavía hay más significados potenciales de "ping", incluidos "traceroute" y "dedo".

S.Lott avatar Nov 25 '2008 11:11 S.Lott