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

9

Como capturar o primeiro endereço IP que vem do ifconfigcomando?

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
yael
fonte
3
A pergunta foi respondida, usando awk ou grep / cut, etc. Mas ainda é uma má idéia em geral usar e grep no ifconfig. O ip é mais adequado e mais suportado nas versões modernas do Linux.
Pedro
1
Isso soa como um problema XY. Que informação você realmente quer? O principal endereço IP da máquina, voltado para a rede? Algum endereço IP da máquina voltado para a rede? O endereço IP do primeiro adaptador de rede? Qualquer endereço IP, não importa qual seja? Provavelmente, existe uma maneira mais direta, precisa e portátil de obter as informações necessárias.
27418 alex.forencich

Respostas:

20

É melhor evitar usar ifconfigpara obter um endereço IP em um script que está obsoleto em algumas distribuições (por exemplo, CentOS e outros, não o instala 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 do ifconfigdifere do Debian 8 para o Debian 9, por exemplo).

Para obter o endereço IP ip, de maneira semelhante, 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ê pede "IP ="

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

Adaptar descaradamente a ideia da @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 gera
cada registro em uma única linha, substituindo os feeds de linha pelo caractere '\'. Isso é conveniente quando você deseja contar registros com wc (1) ou grep (1) com a saída.

Veja um exemplo de por que ifconfignão é recomendado: BBB: `bbb-conf --check` mostrando endereços IP como` inet` - ifconfig woes

Para entender por que ifconfigestá saindo, consulte Diferença entre os comandos 'ifconfig' e 'ip'

ifconfigé da net-tools, que não consegue acompanhar completamente a pilha de redes Linux há muito tempo. Ele também ainda usa o ioctl para configuração de rede, que é uma maneira feia e menos poderosa de interagir com o kernel.

Por volta de 2005, foi introduzido um novo mecanismo para controlar a pilha de rede - soquetes netlink.

Para configurar a interface de rede, iproute2use esse mecanismo de soquete netlink full-duplex, enquanto se ifconfigbaseia em uma chamada do sistema ioctl.

Rui F Ribeiro
fonte
Prefiro não definir eth0 como padrão, porque esse nome é alterado nas máquinas. Podemos fornecer sintaxe flexível
Yael
@yael Alterado, tirou eth0. No entanto, Roman fez melhor do que eu imprimir o "IP =" dentro awk. Muita inteligência para mim, ainda acordando. Evite ifconfig, ele não tem futuro, e a posição do endereço IP muda, há pelo menos duas versões / implementações diferentes (?) Para Linux por aí que eu conheço.
Rui F Ribeiro
Apenas para informação, em versões mais recentes do iproute2 (por exemplo: não no CentOS7 nem no Debian8), o ip pode receber um -briefparâmetro e sua saída fica mais fácil de analisar (31-08-2015: git.kernel.org/pub/scm/network/iproute2 /iproute2.git/commit/… )
AB
@AB também -o que eu uso ajuda, obrigado, irá verificar-lo OU
Rui F Ribeiro
1
Ah, eu não sabia sobre o -oque de fato parece útil para scripts
AB
6

Awk solução:

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

Saída de amostra:

IP=10.0.2.15
RomanPerekhrest
fonte
-3
ip addr | grep -v 127.0.0.1 | grep 'inet ' | \
awk {'print $2'} | awk -F "/" {'print "IP="$1'}
Brian Olson
fonte
1
veja isto:ip addr | awk ' !/127.0.0.1/ && /inet/ { gsub(/\/.*/, "", $2); print "IP="$2 } '
Rui F Ribeiro
1
Por que você está esperando o IP do host local 127.0.0.1?
Jeff Schaller