Publi

Obtener la IP y sólo la IP de un dispositivo de red en nuestros scripts

photo-1414495984329-50d61ce35d7e_r

Cuando estamos haciendo un script, en ocasiones necesitamos la información muy masticada, para pasarla como parámetro a otro programa, para realizar operaciones con un dato en concreto, para introducirlo en una condición, etc.

Este es el caso de la IP de un dispositivo de red (la privada), o puede que la pública, depende de si tenemos conexión directa o no.

¿Par qué nos puede interesar?

Para compartir nuestra dirección con otros dispositivos de nuestra red, por ejemplo. En mi caso, tenía que crear un túnel y que éste estuviera disponible a varios ordenadores de la misma red.

El gran problema, es que mi conexión con la red local era por DHCP, es decir, cada vez que me conecto a esa red, el router me asigna una IP de forma dinámica, diferente a la actual, y a la hora de vincular el túnel a mi dispositivo de red debía decirle la IP del mismo.

Varias maneras de hacerlo

Conocemos ifconfig, que tiene una salida parecida a esta:

$ /sbin/ifconfig
eth0 Link encap:Ethernet direcciónHW c8:60:00:3d:7f:65
Direc. inet:192.168.0.24 Difus.:192.168.0.31 Másc:255.255.255.224
Dirección inet6: fe80::ca60:ff:fe3d:7f65/64 Alcance:Enlace
ACTIVO DIFUSIÓN FUNCIONANDO MULTICAST MTU:1500 Métrica:1
Paquetes RX:913229 errores:0 perdidos:287 overruns:0 frame:0
Paquetes TX:658288 errores:0 perdidos:0 overruns:0 carrier:1
colisiones:0 long.colaTX:1000
Bytes RX:959665104 (959.6 MB) TX bytes:87001781 (87.0 MB)

lo Link encap:Bucle local
Direc. inet:127.0.0.1 Másc:255.0.0.0
Dirección inet6: ::1/128 Alcance:Anfitrión
ACTIVO BUCLE FUNCIONANDO MTU:65536 Métrica:1
Paquetes RX:34631 errores:0 perdidos:0 overruns:0 frame:0
Paquetes TX:34631 errores:0 perdidos:0 overruns:0 carrier:0
colisiones:0 long.colaTX:0
Bytes RX:3286955 (3.2 MB) TX bytes:3286955 (3.2 MB)

Jugando con ifconfig

En este caso, debemos extraer el 192.168.0.24 pero sin nada más. Por ejemplo podríamos utilizar:

1
BINDIP=`LC_ALL=C /sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`; zenity --info --text="Tu IP es $BINDIP";

Este pequeño script almacena en BINDIP la dirección IP del dispositivo eth0 y la muestra en pantalla con zenity (podemos hacer echo «Tu IP es $BINDIP» pero con zenity queda más chulo, si lo tenemos instalado)

En principio estamos cambiando la locale del sistema a la locale por defecto, con esto obtendremos los mensajes de ifconfig en inglés y haremos que nuestro programa no dependa del idioma del sistema. Por ejemplo «inet addr:» en mi ordenador es «Direc. inet» y ya que lo utilizamos como cadena para filtrar la salida si omitimos LC_ALL=C no funcionará.

Por lo demás, estamos llamando a ifconfig, filtrando con grep (con el que sacamos una sola línea de la salida, luego recortamos la línea en los «:» y luego separamos por espacio. Esto lo podemos hacer más directamente así:

1
BINDIP=`LC_ALL=C /sbin/ifconfig eth0 | awk -F' ' '/inet addr:/ {split($2,ip,":"); print ip[2]}'`; zenity --info --text="Tu IP es $BINDIP";

En este caso sólo utilizamos ifconfig y awk para filtrar, pero podríamos filtrar con sed:

1
BINDIP=`LC_ALL=C /sbin/ifconfig eth0 | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'`; zenity --info --text="Tu IP es $BINDIP";

Hasta ahora estamos haciendo lo mismo de varias formas diferentes, aunque, como siempre, dependiendo del sistema nos puede interesar más una u otra.

Con ip

¿Queremos más formas? Si podemos, o si queremos cacharrear un poco, podemos utilizar otros métodos:

1
BINDIP=`ip addr show eth0 | awk '/inet/ {print $2}'`; zenity --info --text="Tu IP es $BINDIP";

Que nos devolverá IP y los bits de la máscara de red, o

1
BINDIP=`ip route get 1 | awk '{print $NF;exit}'`; zenity --info --text="Tu IP es $BINDIP";

Con hostname

También se lo podemos pedir a hostname. Normalmente nos devuelve el nombre del host actual, pero también podemos pedirle las direcciones IP de todos los dispositivos conectados, en este caso, el primer dispositivo coincidirá con la primera palabra, el segundo con la segunta y así sucesivamente:

1
BINDIP=`hostname -I | cut -d' ' -f1`; zenity --info --text="Tu IP es $BINDIP";

¿Algún método más?

Está bien disponer de varios métodos ya que puede que nos encontremos en sistemas empotrados con versiones mínimas de Unix en las que no dispongamos de muchas utilidades, o simplemente en el sistema actual no tengamos permiso para acceder a la información.

Foto principal: Luisa Rusche

También podría interesarte....

Leave a Reply