É melhor evitar usar ifconfig
para 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 ifconfig
difere 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 ifconfig
não é recomendado: BBB: `bbb-conf --check` mostrando endereços IP como` inet` - ifconfig woes
Para entender por que ifconfig
está 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, iproute2
use esse mecanismo de soquete netlink full-duplex, enquanto se ifconfig
baseia em uma chamada do sistema ioctl.