Conocer la IP asociada a un interfaz de red (solo para Linux)

Transcribo una receta, de código Python, publicada en ActiveState Code por Paul Cannon, donde se ve como conocer la dirección IP asociada a un interfaz de red (bajo Linux) mediante la llamada a sistema ioctl SIOCGIFADDR.

1
2
3
4
5
6
7
8
9
10
11
import socket
import fcntl
import struct
 
def get_ip_address(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    return socket.inet_ntoa(fcntl.ioctl(
        s.fileno(),
        0x8915, # SIOCGIFADDR
        struct.pack('256s', ifname[:15])
    )[20:24])

Ejemplo de llamada:

get_ip_address('lo')

Con resultado: 127.0.0.1

Otro ejemplo de llamada:

get_ip_address('eth0')

Con resultado: 192.168.50.19

Tal y como comenta el autor, probablemente esta solución únicamente funcione bajo Linux, dada la dependencia de este con ciertas estructuras (tamaño, etc.) en C y donde SIOCGIFADDR es 0x8915. Incluso es probable que únicamente funcione bajo kernels 2.4 y 2.6. Bajo otras distribuciones de Unix puede ser que requiera algún ajuste; que si alguien sabe siempre será bienvenido.

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>