Como capturar o primeiro endereço IP de um comando ifconfig?

9

Como capturar o primeiro endereço IP que vem do comando ifconfig ?

ifconfig -a
enw178032: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 100.14.22.12  netmask 255.255.0.0  broadcast 100.14.255.255
        inet6 fe80::250:56ff:fe9c:158a  prefixlen 64  scopeid 0x20<link>
        ether 00:10:56:9c:65:8a  txqueuelen 1000  (Ethernet)
        RX packets 26846250  bytes 12068811576 (11.2 GiB)
        RX errors 0  dropped 58671  overruns 0  frame 0
        TX packets 3368855  bytes 1139160934 (1.0 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Resultado esperado:

IP=100.14.22.12
    
por yael 27.02.2018 / 10:12

3 respostas

18

É melhor evitar usar ifconfig para obter um endereço IP em um script, já que ele está obsoleto em algumas distribuições (por exemplo, o CentOS e outros, não o instalam por padrão).

Em outros sistemas, a saída do ifconfig varia de acordo com o lançamento da distribuição (por exemplo, a saída / espaçamento / campos de ifconfig difere do Debian 8 para o Debian 9, por exemplo).

Para obter o endereço IP com ip , da mesma forma que você está perguntando:

ip addr | awk ' !/127.0.0.1/ && /inet/ { gsub(/\/.*/, "", $2); print "IP="$2 } '

Ou melhor ainda:

$ ip -o -4  address show  | awk ' NR==2 { gsub(/\/.*/, "", $4); print $4 } '
192.168.1.249

Ou, como você pergunta "IP="

#!/bin/bash
echo -n "IP="
ip -o -4  address show  | awk ' NR==2 { gsub(/\/.*/, "", $4); print $4 } '

Adaptando descaradamente a ideia do @Roman

$ ip -o -4  address show  | awk ' NR==2 { gsub(/\/.*/, "", $4); print "IP="$4 } ' 
IP=192.168.1.249

Saída 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

De man ip :

-o, -oneline
output each record on a single line, replacing line feeds with the '\' character. This is convenient when you want to count records with wc(1) or to grep(1) the output.

Veja um exemplo do porquê ifconfig não é recomendado: BBB: 'bbb-conf --check' mostrando endereços IP como 'inet' - problemas de ifconfig

Para entender por que ifconfig está saindo, consulte Diferença entre Comandos 'ifconfig' e 'ip'

ifconfig is from net-tools, which hasn't been able to fully keep up with the Linux network stack for a long time. It also still uses ioctl for network configuration, which is an ugly and less powerful way of interacting with the kernel.

Around 2005 a new mechanism for controlling the network stack was introduced - netlink sockets.

To configure the network interface iproute2 makes use of that full-duplex netlink socket mechanism, while ifconfig relies on an ioctl system call.

    
por 27.02.2018 / 10:27
6

Awk solução:

ifconfig -a | awk 'NR==2{ sub(/^[^0-9]*/, "", $2); printf "IP=%s\n", $2; exit }'

Exemplo de saída:

IP=10.0.2.15
    
por 27.02.2018 / 10:30
-3
ip addr | grep -v 127.0.0.1 | grep 'inet ' | \
awk {'print $2'} | awk -F "/" {'print "IP="$1'}
    
por 27.02.2018 / 20:10