Exibindo o endereço IP na interface eth0

17

Como posso exibir o endereço IP mostrado na eth0 usando um script?

    
por user43389 11.12.2014 / 23:56

15 respostas

23

salve isso em um arquivo e execute bash <filename>

#!/bin/bash
ifconfig eth0 | grep "inet addr"

sendo mais preciso para obter apenas o número que mostra o endereço IP:

#!/bin/bash
ifconfig eth0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1
    
por edward torvalds 12.12.2014 / 00:00
16

Para fornecer outra opção, você pode usar o comando ip addr desta maneira para obter o endereço IP:

ip addr show eth0 | grep "inet\b" | awk '{print }' | cut -d/ -f1
  • ip addr show eth0 mostra informações sobre eth0
  • grep "inet\b" mostra apenas a linha que possui o endereço IPv4 (se você quiser o endereço IPv6, altere-o para "inet6\b" )
  • awk '{print }' é impresso no segundo campo, que possui o endereço de ip / máscara, exemplo 172.20.20.15/25
  • cut -d/ -f1 só recebe a parte do endereço IP.

Em um script:

#!/bin/bash
theIPaddress=$(ip addr show eth0 | grep "inet\b" | awk '{print }' | cut -d/ -f1)
    
por Alaa Ali 12.12.2014 / 03:16
13

Extraído do link

hostname -i

No entanto, isso pode retornar um endereço IP local (127.0.0.1), então você pode ter que usar e filtrar:

hostname -I

A partir das páginas de manual do nome do host:

  

-i, --ip-address

     

Exibe o (s) endereço (s) de rede do nome do host. Observe que isso funciona apenas se o nome do host puder ser resolvido. Evite usar essa opção; use hostname --all-ip-addresses.

     

-I, --all-ip-addresses

     

Exibe todos os endereços de rede do host. Esta opção enumera todos os endereços configurados em todas as inter-faces da rede. A interface de loopback e os endereços locais do link IPv6 são omitidos. Ao contrário da opção -i, essa opção não depende da resolução de nomes. Não faça suposições sobre a ordem da saída.

    
por ThorSummoner 09.03.2016 / 21:01
4

Aqui estão alguns oneliners .....

Awk

ifconfig eth0 | awk '/inet addr/{split(,a,":"); print a[2]}'

A função split no comando awk acima divide a segunda coluna com base no delimitador : e armazena o valor dividido em uma matriz associativa a . Então a[2] contém o valor da segunda parte.

sed

ifconfig eth0 | sed -n '/inet addr/s/.*inet addr: *\([^[:space:]]\+\).*//p'

No sed básico, \(...\) denomina grupo de captura que é usado para capturar os caracteres. Poderíamos referenciar esses caracteres capturados por meio de back-referencing. \([^[:space:]]\+\) captura qualquer caractere, mas não o espaço uma ou mais vezes.

grep

ifconfig eth0 | grep -oP 'inet addr:\K\S+'

\K descarta que os caracteres correspondidos anteriormente sejam impressos no final e \S+ corresponde a um ou mais caracteres não espaciais.

Perl

ifconfig eth0 | perl -lane 'print  if /inet addr:(\S+)/'

Um ou mais caracteres não espaciais que estão ao lado da string inet addr: são capturados e, finalmente, imprimimos apenas esses caracteres capturados.

    
por Avinash Raj 12.12.2014 / 08:28
4

@ resposta de markus-lindberg é o meu favorito. Se você adicionar -o -4 aos flags do ip, você terá uma saída muito mais fácil de analisar (e consistente):

ip -o -4 a | awk ' == "eth0" { gsub(/\/.*/, "", ); print  }'

-o significa --oneline , que deve ajudar exatamente nesse tipo de situação. O -4 é adicionado para limitar ao endereço IPv4, que é o que todas as outras respostas implicam.

    
por Amos Shapira 14.06.2016 / 03:43
1

Sugiro usar uma biblioteca python como as redes especificamente projetadas para essa finalidade.

sudo pip install netifaces
python -c "import netifaces; print netifaces.ifaddresses('eth0')[netifaces.AF_INET][0]['addr']"

Para obter a interface de rede padrão que está em uso.

default_inf = netifaces.gateways()['default'][netifaces.AF_INET][1]
    
por Sandeep 09.04.2016 / 02:34
1
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print }'

Isso só usa ip addr , que é um substituto para ifconfig e awk combinados com substituição (gsub).

Pare de usar muitos processos para tarefas simples

    
por Markus Lindberg 23.10.2015 / 10:42
1

Apenas mais uma opção que pode ser útil se você não tiver o awk (como é o caso de alguns dispositivos incorporados):

ip addr show dev eth0 scope global | grep "inet\b" | cut -d/ -f 1 | egrep -o "([[:digit:]]{1,3}[.]{1}){3}[[:digit:]]{1,3}"
    
por Fulvio Flaco 02.08.2016 / 14:43
1

Aqui está um bom, só usa grep como comando secundário:

ip addr show eth0 | grep -oP 'inet \ K \ S [0-9.] +'

Não vejo por que você deve usar mais comandos do que o necessário

    
por Rick 18.07.2017 / 21:10
1

ifconfig eth0|grep 'inet '|awk '{print }'

    
por Maksim Kostromin 10.11.2017 / 21:58
1

aqui para o IPv4 :

ip -f inet a|grep -oP "(?<=inet ).+(?=\/)"

aqui para IPv4 & amp; particular dev (eth0):

ip -f inet a show eth0|grep -oP "(?<=inet ).+(?=\/)"

para IPv6 :

ip -6 -o a|grep -oP "(?<=inet6 ).+(?=\/)"

    
por XXL 13.02.2018 / 13:04
0

isso também pode ser usado com um usuário normal.

ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
    
por Matheus Baldasso 24.03.2017 / 20:34
0

Este é o caminho mais curto que encontrei:

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

Substitua pela sua interface de rede.

ip -f inet diz ao ip para retornar apenas valores para a família inet (ipv4).

grep -Po diz ao grep para interpretar o próximo valor como um perl-regex e imprimir apenas os valores correspondentes.

O regex \K[\d.]+ diz: "descarte tudo até este ponto (\ K) e corresponda a tantos valores numéricos seguidos por um ponto em uma linha quanto possível". Portanto, isso corresponderá ao endereço IP e ignorará tudo após ele, incluindo a máscara de sub-rede \ XX de formato curto.

    
por Ryan 19.07.2017 / 08:27
0

nesses dias com interfaces múltiplas (por exemplo, se você usa uma janela de encaixe) e a interface de nomenclatura da ETH não é mais as normas

Eu uso este comando para extrair o IP / Máscara:

IPMASK=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6)

Então, quantas interfaces eu tiver e qualquer que seja o seu nome, o GREP só vai pegar o primeiro com a opção MULTICAST.

Eu uso este comando para extrair apenas o IP sem a máscara:

IP=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6|cut -d'/' -f1)

Eu uso esses comandos em diferentes BDS & amp; NIX nunca falha;)

    
por JOduMonT 26.10.2017 / 09:28
0

No meu script, estou usando algo assim:

 
re="inet[[:space:]]+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)"
if [[ $(ip addr show eth0) =~ $re ]]; then
    echo ${BASH_REMATCH[1]}
else
    echo "Cannot determin IP" 1>&2
fi

Não gera nenhum processo.

    
por Maciej Wawrzyńczuk 29.10.2017 / 19:43

Tags