Ping con Python

Vamos a hacer ping a otras computadoras con Python3 y la librería ping3.

Lo primero es instalarla en nuestro sistema para ello hacemos uso del administrador de paquetes pip.

pip install ping3

Hay que tener en cuenta que esta librería necesita permisos de root para ejecutarse por lo que si queremos probar su funcionamiento desde el interprete interactivo de Python, deberemos de ejecutarlo como administrador. En el caso de Linux sería así:

$ sudo python3

Dentro del interprete lo primero es importar el módulo, concretamente los métodos a usar que son ping y verbose_ping.

El primer método hace un ping y devuelve el tiempo que se demora en responder la máquina remota, en segundos. El segundo hace 4 intentos y muestra algo más de información.

El código en el interprete interactivo de Python 3 quedaría así.

$ sudo python3
Python 3.8.3 (v3.8.3:6f8c8320e9, May 13 2020, 16:29:34) 
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from ping3 import ping , verbose_ping
>>> ping('www.google.com')
0.011239290237426758
>>> verbose_ping('www.google.com')
ping 'www.google.com' ... 10ms
ping 'www.google.com' ... 11ms
ping 'www.google.com' ... 10ms
ping 'www.google.com' ... 10ms
>>> 

Si quisiéramos ejecutar directamente el ping podríamos usar el módulo ping3 directamente desde Python 3 de la siguiente manera:

$ sudo python3 -m ping3 'www.google.com'
ping 'www.google.com' ... 11ms
ping 'www.google.com' ... 10ms
ping 'www.google.com' ... 11ms
ping 'www.google.com' ... 11ms

Es posible pasar argumentos con nombre como timeout para especificar el tiempo de espera antes de indicar que no se alcanza el host o el ttl (time to live) que será el tiempo durante el que circularán los datos. Además el método devolverá False si no puede resolver el nombre del host o None si no puede alcanzarlo o se acaba el tiempo.

>>> print(ping3.ping('www.googlessss.com'))
False
>>> print(ping3.ping('192.168.0.23'))
None
>>> print(ping3.ping('www.google.com'))
0.011266946792602539
>>> print(ping3.ping('www.google.es',timeout=1))
0.01219320297241211
>>> print(ping3.ping('www.google.com',timeout=0.0001))
None
>>> 
>>> print(ping3.ping('www.google.es',ttl=5))
None
>>> print(ping3.ping('www.google.es',ttl=10))
0.012539863586425781
>>> 

Las excepciones están deshabilitadas por defecto, por lo que no se debería producir ningún error en caso de timeout o host desconocido. Para habilitarlas y poder tratarlas hay que establecer el valor del parámetro EXCEPTIONS a True y gestionar las excepciones: Timeout, HostUnknown y TimeToLiveExpired.

>>> import ping3
>>> ping3.EXCEPTIONS = True
>>> ping3.ping('192.168.0.240')
    raise errors.DestinationUnreachable()
errors.DestinationUnreachable

También podemos ver la ayuda de la librería de la siguiente manera:

$ sudo python3 -m ping3 --help
usage: ping3 [-h] [-v] [-c COUNT] [-w TIMEOUT] [-i INTERVAL] [-I INTERFACE]
             [-t TTL] [-l SIZE] [--debug] [--exceptions]
             [DEST_ADDR [DEST_ADDR ...]]

A pure python3 version of ICMP ping implementation using raw socket.

positional arguments:
  DEST_ADDR             The destination address, can be an IP address or a
                        domain name. Ex. 192.168.1.1/example.com.

optional arguments:
  -h, --help            show this help message and exit
  -v, --version         show program's version number and exit
  -c COUNT, --count COUNT
                        How many pings should be sent. Default is 4.
  -w TIMEOUT, --wait TIMEOUT
                        Time to wait for a response, in seconds. Default is 4.
  -i INTERVAL, --interval INTERVAL
                        Time to wait between each packet, in seconds. Default
                        is 0.
  -I INTERFACE, --interface INTERFACE
                        LINUX ONLY. The gateway network interface to ping
                        from. Default is None.
  -t TTL, --ttl TTL     The Time-To-Live of the outgoing packet. Default is
                        64.
  -l SIZE, --load SIZE  The ICMP packet payload size in bytes. Default is 56.
  --debug               Turn on DEBUG mode.
  --exceptions          Turn on EXCEPTIONS mode.

!!Note: ICMP messages can only be sent from processes running as root.

3 comentarios en «Ping con Python»

  1. Hola amigo,

    Estuve revisando el código con ping3 y me aparece un error de la librería, sabes qué puede ser??
    esto me aparece cuando hago el ping a una IP que no está online, o sea debería entregarme un False.

    Traceback (most recent call last):
    File “/home/usuario/ping.py”, line 19, in
    print (ping(‘192.168.1.1′))
    File “/usr/local/lib/python3.9/dist-packages/ping3/__init__.py”, line 83, in wrapper
    func_return = func(*args, **kwargs)
    File “/usr/local/lib/python3.9/dist-packages/ping3/__init__.py”, line 311, in ping
    delay = receive_one_ping(sock=sock, icmp_id=icmp_id, seq=seq, timeout=timeout) # in seconds
    File “/usr/local/lib/python3.9/dist-packages/ping3/__init__.py”, line 83, in wrapper
    func_return = func(*args, **kwargs)
    File “/usr/local/lib/python3.9/dist-packages/ping3/__init__.py”, line 240, in receive_one_ping
    raise errors.DestinationHostUnreachable(ip_header=ip_header, icmp_header=icmp_header)
    File “/usr/local/lib/python3.9/dist-packages/ping3/errors.py”, line 30, in __init__
    super().__init__(self.message)
    File “/usr/local/lib/python3.9/dist-packages/ping3/errors.py”, line 21, in __init__
    self.message = message if self.ip_header is None else message + ” (Host='{}’)”.format(self.ip_header.get(“src_addr”))
    AttributeError: ‘str’ object has no attribute ‘get’

      1. Hola Lalo.

        La información del error indica que no encuentra el dispositivo destino, revisa el código porque veo una comilla simple rara al final y no sé si es por el editor de WordPress o es un error. El equipo destino debería responder a ICMP para obtener respuesta, aunque realmente el módulo responde con None si no encuentra destino.
        raise errors.DestinationHostUnreachable(ip_header=ip_header, icmp_header=icmp_header)

        Aquí tienes el enlace al proyecto por si quieres investigar un poco mas:
        ping3

        Saludos
        Manuel

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *