Es mejor evitar usar ifconfig
para obtener una dirección IP en un script, ya que está en desuso en algunas distribuciones (por ejemplo, CentOS y otras, ya no lo instale de forma predeterminada).
En otros sistemas, la salida de ifconfig varía según el lanzamiento de la distribución (por ejemplo, la salida/espaciado/campos de ifconfig
difiere de Debian 8 a Debian 9, por ejemplo).
Para obtener la dirección IP con ip
, de manera similar estás preguntando:
ip addr | awk ' !/127.0.0.1/ && /inet/ { gsub(/\/.*/, "", $2); print "IP="$2 } '
O mejor aún:
$ ip -o -4 address show | awk ' NR==2 { gsub(/\/.*/, "", $4); print $4 } '
192.168.1.249
O, como pides "IP="
#!/bin/bash
echo -n "IP="
ip -o -4 address show | awk ' NR==2 { gsub(/\/.*/, "", $4); print $4 } '
Adaptando descaradamente la idea de @Roman
$ ip -o -4 address show | awk ' NR==2 { gsub(/\/.*/, "", $4); print "IP="$4 } '
IP=192.168.1.249
Salida normal:
$ ip -o -4 address show
1: lo inet 127.0.0.1/8 scope host lo\ valid_lft forever preferred_lft forever
2: eth0 inet 192.168.1.249/24 brd 192.168.1.255 scope global eth0\ valid_lft forever preferred_lft forever
Desde man ip
:
-o, -una línea
genera cada registro en una sola línea, reemplazando los saltos de línea con el carácter '\'. Esto es conveniente cuando desea contar registros con wc(1) o grep(1) en la salida.
Vea un ejemplo de por qué ifconfig
no se recomienda:BBB:`bbb-conf --check` mostrando direcciones IP como `inet` - problemas de ifconfig
Para entender por qué ifconfig
está a punto de salir, consulte Diferencia entre los comandos 'ifconfig' e 'ip'
ifconfig
es de net-tools, que no ha podido mantenerse completamente al día con la pila de red de Linux durante mucho tiempo. También sigue usando ioctl para la configuración de red, que es una forma fea y menos potente de interactuar con el núcleo.
Alrededor de 2005, se introdujo un nuevo mecanismo para controlar la pila de red:los sockets de enlace de red.
Para configurar la interfaz de red iproute2
hace uso de ese mecanismo de socket de enlace de red full-duplex, mientras que ifconfig
se basa en la llamada al sistema anioctl.
Awk
solución:
ifconfig -a | awk 'NR==2{ sub(/^[^0-9]*/, "", $2); printf "IP=%s\n", $2; exit }'
Salida de muestra:
IP=10.0.2.15