¿Cómo puedo realizar un ping o traceroute usando python nativo?

Me gustaría poder realizar un ping y traceroute desde Python sin tener que ejecutar los comandos de shell correspondientes, así que prefiero una solución Python nativa.

Ejecutar intérpretes como root a menudo es mal visto por razones de seguridad (y, por supuesto, SÍ necesita tener permiso de root para acceder al “raw” socked según sea necesario por las especificaciones de ICMP de ping y traceroute!), Pero si no tiene problemas con eso no es difícil – por ejemplo, esta publicación ofrece un ping funcional, y la antigua página de Jeremy Hylton tiene un código subyacente aún utilizable para ICMP (tanto ping como traceroute) aunque está escrito para versiones muy antiguas de Python y necesita una pequeña actualización para brillar con las modernas unos, pero, ¡los conceptos ESTÁN todos allí, en las dos URL que te di!

Si no le importa usar un módulo externo y no usar UDP o TCP, scapy es una solución fácil:

from scapy.all import * target = ["192.168.1.254"] result, unans = traceroute(target,l4=UDP(sport=RandShort())/DNS(qd=DNSQR(qname="www.google.com"))) 

O puedes usar la versión tcp

 from scapy.all import * target = ["192.168.1.254"] result, unans = traceroute(target,maxttl=32) 

Tenga en cuenta que tendrá que ejecutar scapy como root para poder realizar estas tareas o obtendrá:

 socket.error: [Errno 1] Operation not permitted 

La biblioteca Webb es muy útil para realizar todo tipo de extractos relacionados con la web … y ping y traceroute se pueden hacer fácilmente a través de ella. Simplemente incluya la URL que desea trazar a:

 import webb webb.traceroute("your-web-page-url") 

Si desea almacenar el registro de traceroute en un archivo de texto automáticamente, use el siguiente comando:

 webb.traceroute("your-web-page-url",'file-name.txt') 

De manera similar, se puede obtener una dirección IP de un URl (servidor) con las siguientes líneas de código:

 print(webb.get_ip("your-web-page-url")) 

¡Espero eso ayude!

es posible que desee revisar el paquete scapy . Es la razor suiza de herramientas de red para python.

ICMP Ping es estándar como parte del protocolo ICMP.

Traceroute utiliza las características de ICMP e IP para determinar una ruta a través de los valores de Time To Live. Usando los valores TTL, puede hacer trazadores de ruta en una variedad de protocolos siempre y cuando IP / ICMP funcione, ya que son los mensajes ICMP TTL Exceeded los que le informan sobre el salto en la ruta.

Si intenta acceder a un puerto en el que no hay un oyente disponible, según las reglas del protocolo ICMP, se supone que el host envía un mensaje de Puerto ICMP inalcanzable.

Escribí un tcptraceroute simple en python que no necesita privilegios de root http://www.thomas-guettler.de/scripts/tcptraceroute.py.txt

Pero no puede mostrar las direcciones IP de los saltos intermedios. Pero a veces es útil, ya que puede adivinar dónde se encuentra el cortafuegos de locking: al principio o al final de la ruta.

El paquete mtrpacket se puede usar para enviar sondas de red, que pueden realizar un ping o un traceroute. Ya que usa el back-end de la herramienta de línea de comandos mtr, no requiere que su script se ejecute como root.

También utiliza el bucle de eventos de asyncio, por lo que puede tener múltiples traceroutes o pings en curso simultáneamente, y lidiar con sus resultados a medida que se completan.

Aquí hay una secuencia de comandos de Python para trazar ruta a ‘example.com’:

 import asyncio import mtrpacket async def trace(): async with mtrpacket.MtrPacket() as mtr: for ttl in range(1, 256): result = await mtr.probe('example.com', ttl=ttl) print(result) if result.success: break asyncio.get_event_loop().run_until_complete(trace()) 

El bucle con ‘ttl’ se usa porque el ‘tiempo de vida’ de un paquete saliente determina la cantidad de saltos de red que el paquete viajará antes de caducar y enviar un error a la fuente original.