¿Hacer ping a un sitio en Python?
¿Cómo hago ping a un sitio web o dirección IP con Python?
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_ping
y de Ping.do
para inspirarse.
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 out
variable. 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)
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
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.html
siempre es popular) y lea la respuesta.
Todavía hay más significados potenciales de "ping", incluidos "traceroute" y "dedo".