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.
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’
Este es mi código, super simple:
from ping3 import ping, verbose_ping
print (ping(«192.168.1.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