Uma maneira mais curta (e mais interessante) é hostname -i
. Não há mais problemas com ipconfig, ip, sed, awk e tal.
Como posso atribuir o endereço IP da eth0 a uma variável de ambiente, digamos $ ip, o mais facilmente possível?
Atualização: Distro é o Ubuntu Server 12.04 LTS.
Uma maneira mais curta (e mais interessante) é hostname -i
. Não há mais problemas com ipconfig, ip, sed, awk e tal.
Usar ip address show
é o caminho a percorrer. Especialmente em qualquer sistema Linux moderno em que a interface que você está consultando possa ter vários endereços que ifconfig
não conheceria.
$ ip a s eth0 | awk '/inet / {print$2}'
10.13.211.83/24
192.168.17.21/16
E, claro, se você não quiser a máscara de rede, basta enviar isso para qualquer número de itens, por exemplo:
cut -d/ -f1
Nota: No mesmo sistema, ifconfig mostra:
$ ifconfig em1 | awk '/inet / {print $2}'
10.13.211.83
Não responda ao seu problema exato como você deseja que o IP atribuído a uma interface definida, mas eu pensei que poderia ser útil ter listado aqui para informações futuras a maneira de ter seu IP externo (mesmo se por trás de um NAT):
ip='wget -qO- ipecho.net/plain'
Tente fazer isso:
ip=$(
ifconfig eth0 |
perl -ne 'print $1 if /inet\s.*?(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\b/'
)
echo "$ip"
Como você pode ver, hostname -i
pode mostrar 127.0.0.1 (não NAT
here (archlinux)), isso não é o que queremos.
Então eu proponho:
dev=eth0
ip=$(
ip a s dev $dev |
awk '/inet /{gsub("/.*", "");print $2}'
)
echo "$ip"
Ou se você tiver -P
alternar para grep
:
ip a s dev eth0 | grep -oP 'inet\s+\K[^/]+'
Eu acho que é a solução mais curta =)
Confira também:
ifconfig eth0 | awk '/inet /{print $2}' | cut -f2 -d':'
que funcionará mesmo no Solaris e no HP-UX (use dev de rede apropriado em vez de eth0
).
Quanto ao comando hostname -i
, tente hostname -I
se você tiver uma interface configurada (exceto loopback).
Você também pode tentar isso,
IP='wget -q -O- http://checkip.dyndns.org/index.html | grep 'IP'| html2text | cut -c 21-36'
Tags networking ip linux shell