Existe uma maneira fácil de extrair programaticamente o endereço IP? [duplicado]

38

Existe uma maneira fácil de extrair programaticamente o endereço IP, sem a análise tediosa de ifconfig ? Eu não me importaria com o processamento de saída de comando simples usando sed para fazer isso, mas sem processar arquivos de múltiplas linhas de /etc em algum lugar. O que estou tentando fazer é modificar meu .bashrc para exibir o endereço IP do host na mensagem de saudação. Eu estou usando Ubuntu 12.04 mas decidi postar aqui em vez do fórum do Ubuntu porque eu considero que isso não é específico da distribuição.

    
por amphibient 20.08.2013 / 18:05

3 respostas

41

NOTAS

  1. Identificadores de dispositivos NIC

    Os exemplos abaixo assumem que a interface de rede é uma placa sem fio chamada wlan0 . Ajuste este bit nos exemplos para sua situação particular. Por exemplo, se é um cartão NIC com fio, é provável que seja eth0 .

  2. IPv4 - (Protocolo de Internet versão 4)

    Além disso, esses exemplos estão retornando o endereço IPv4. o "quad pontilhado" que a maioria das pessoas identifica como "Endereço IP".

    Por exemplo:

    inet addr:192.168.1.20  Bcast:192.168.1.255  Mask:255.255.255.0
    
  3. IPv6 - (Protocolo de Internet versão 6)

    Se o seu sistema estiver configurado para suportar IPv6, você verá tanto o "quad pontilhado" quanto os endereços IP IPv6 na saída ifconfig .

    Por exemplo:

    inet6 addr: fe80::226:c7ff:fe85:a720/64 Scope:Link
    

    Os comandos abaixo explicitamente ignoram isso, mas podem ser adaptados facilmente para obter essa informação.

Soluções (usando ifconfig )

Existem várias maneiras de fazer isso. Você poderia, por exemplo, usar este script awk para analisar o endereço IP de sua NIC de LAN sem fio (wlan0):

$ ifconfig wlan0 | grep "inet " | awk -F'[: ]+' '{ print $4 }'
192.168.1.20

Você pode fazer isso e torná-lo mais compacto:

$ ifconfig wlan0 | awk '/t addr:/{gsub(/.*:/,"",$2);print$2}'
192.168.1.20

Você também pode fazer isso usando perl :

$ ifconfig wlan0 | perl -nle'/t addr:(\S+)/&&print$1'
192.168.1.20

O exemplo do Perl é o mais compacto possível.

Existem inúmeras outras maneiras de fazer isso, estes são apenas alguns exemplos para você começar.

EDIT # 1

Algumas notas e comentários adicionais. @StephaneChazelas demonstrou que existe uma versão ainda mais compacta usando grep :

$ ifconfig wlan0|grep -Po 't addr:\K[\d.]+'
192.168.1.20

Esta solução faz uso da capacidade de grep em versões mais recentes para fazer uso de PCRE (expressões regulares Perl), junto com a opção -o para retornar apenas o que corresponde à expressão regular.

Soluções (usando ip )

Como também foi mencionado nos comentários, ifconfig pode ser problemático para usar em sistemas que possuem vários endereços IP atribuídos a um dispositivo de rede, dado que ele retorna apenas o primeiro. Por isso, é melhor usar o comando ip nessas situações.

Por exemplo:

$ ip addr show wlan0 | grep -Po 'inet \K[\d.]+'
192.168.1.20

Você também pode dizer a ip para mostrar apenas informações IPv4 para uma determinada interface de rede. Neste caso, estamos olhando apenas para a interface chamada wlan0 :

$ ip -f inet addr show wlan0 | grep -Po 'inet \K[\d.]+'
192.168.1.20

Referências

por 20.08.2013 / 18:22
21

$ hostname -I

Por exemplo:

$ hostname -I
192.168.1.18

Info. de manpages:

link
link

    
por 20.08.2013 / 23:19
7

Aqui está outro usando "ip", mas isso funciona melhor quando o dispositivo pode estar conectado a interfaces diferentes, como Ethernet com fio às vezes e Wi-Fi outras vezes. Eu também usei "sed" em vez de "grep" ou "perl", para variar.

Isso encontra qualquer fonte que o IP tenha uma rota para a Internet. Ou para o DNS do Google, de qualquer forma.

ip -o route get 8.8.8.8 | sed -e 's/^.* src \([^ ]*\) .*$//'
    
por 13.01.2017 / 23:00