Exibindo o endereço IP na interface eth0

24

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

user43389
fonte

Respostas:

28

salve isso em um arquivo e execute bash <filename>

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

sendo mais preciso 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

Atualização : se isso não funcionar, tente a outra resposta

Edward Torvalds
fonte
2
claro que isso não funciona no ubuntu mais recente. o ifconfig mais recente retorna "inet <ip>" em vez de "inet addr <ip>"
thang
você pode simplesmente usargrep "inet"
Andrei Radulescu 10/11
26

Para fornecer outra opção, você pode usar o ip addrcomando dessa maneira para obter o endereço IP:

ip addr show eth0 | grep "inet\b" | awk '{print $2}' | 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 $2}' imprime no segundo campo, que possui o endereço ip / máscara, exemplo 172.20.20.15/25
  • cut -d/ -f1 leva apenas a parte do endereço IP.

Em um script:

#!/bin/bash
theIPaddress=$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)
Alaa Ali
fonte
Esta solução realmente funciona!
Thang
ip -4 ... e ip -6 ...! Obrigado!
TamusJRoyce
17

Retirado de /programming//a/14910952/1695680

hostname -i

No entanto, isso pode retornar um endereço IP local (127.0.0.1), portanto, você pode precisar usar e filtrar:

hostname -I

Nas páginas de manual do nome do host:

-i, --ip-address

Exibir os endereços de rede do nome do host. Observe que isso funciona apenas se o nome do host puder ser resolvido. Evite usar esta opção; use o nome do host - todos os endereços IP.

-I, --all-ip-addresses

Exibir todos os endereços de rede do host. Esta opção enumera todos os endereços configurados em todas as interfaces de rede. A interface de loopback e os endereços locais de 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.

ThorSummoner
fonte
Para o registro, eu gosto ip addr show label 'enp*'melhor, mas eu é parse irritante, algo como ip addr show label 'enp*' | grep -oP inet\ \\S+ | cut -d' ' -f2o trabalho pode ... o quão bonita
ThorSummoner
5

A resposta de @ markus-lindberg é a minha favorita. Se você adicionar -o -4aos sinalizadores do ip, obterá uma saída muito mais facilmente analisável (e consistente):

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

-osignifica --oneline, que se destina a ajudar exatamente nesse tipo de situação. O -4é adicionado ao limite para o endereço IPv4, que é o que todas as outras respostas implicam.

Amos Shapira
fonte
Ame as ipbandeiras. Usando um cutpouco de awkbruxaria avançada :ip -o -4 addr show eth0 scope global | awk '{print $4;}' | cut -d/ -f 1
DuffJ 16/16/16
@DuffJ é provavelmente uma questão de gosto pessoal. Eu "descobri" cutmuito depois de aprender awke gosto de minimizar o número de comandos em meus pipelines. Sugestão agradável em qualquer caso.
Amos Shapira
Eu concordo completamente, Amos. Obrigado pela sua solução!
precisa
3

Aqui estão alguns oneliners .....

Awk

ifconfig eth0 | awk '/inet addr/{split($2,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]mantém o valor da segunda parte.

sed

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

No sed básico, \(...\)chamado grupo de captura que é usado para capturar os caracteres. Poderíamos referenciar os caracteres capturados por meio de referência posterior.\([^[:space:]]\+\)captura qualquer personagem, mas não espaço, uma ou mais vezes.

grep

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

\Kdescarta os caracteres correspondidos anteriormente da impressão na final e \S+corresponde a um ou mais caracteres não espaciais.

Perl

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

Um ou mais caracteres não espaciais próximos à inet addr:sequência são capturados e, finalmente, imprimimos apenas esses caracteres capturados.

Avinash Raj
fonte
@edwardtorvalds adicionou algumas explicações. Eu acho que isso seria útil para futuros leitores. Sinta-se à vontade para fazer qualquer pergunta com os comandos acima ... :)
Avinash Raj
2

Aqui está uma boa, apenas usa grep como comando secundário:

endereço IP show eth0 | grep -oP 'inet \ K \ S [0-9.] +'

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

Rick
fonte
2

Você deve usar ip(em vez de ifconfig) como é atual, mantida e talvez o mais importante para fins de script, produz uma saída consistente e analisável. A seguir, algumas abordagens semelhantes:

Se você deseja o endereço IPv4 para sua interface Ethernet eth0:

$ ip -4 -o addr show eth0 | awk '{print $4}'
192.168.1.166/24  

Como um script:

$ INTFC=eth0  
$ MYIPV4=$(ip -4 -o addr show $INTFC | awk '{print $4}') 
$ echo $MYIPV4
192.168.1.166/24

A saída produzida acima está na notação CIDR. Se a notação CIDR não for desejada, ela poderá ser removida:

$ ip -4 -o addr show eth0 | awk '{print $4}' | cut -d "/" -f 1 
192.168.1.166  

Outra opção que o IMHO é "mais elegante" obtém o endereço IPv4 para qualquer interface usada para conectar-se ao host remoto especificado (8.8.8.8 neste caso). Cortesia de @gatoatigrado nesta resposta :

$ ip route get 8.8.8.8 | awk '{ print $NF; exit }'
192.168.1.166

Como um script:

$ RHOST=8.8.8.8  
$ MYIP=$(ip route get $RHOST | awk '{ print $NF; exit }')
$ echo $MYIP
192.168.1.166

Isso funciona perfeitamente bem em um host com uma única interface, mas mais vantajosamente também funcionará em hosts com várias interfaces e / ou especificações de rota.

Embora ipseja minha abordagem preferida, certamente não é a única maneira de esfolar esse gato. Aqui está outra abordagem usada hostnamese você preferir algo mais fácil / mais conciso:

$ hostname --all-ip-addresses | awk '{print $1}'  

Ou, se você deseja o endereço IPv6:

$ hostname --all-ip-addresses | awk '{print $2}'  

Como um script:

$ MYV4IP=$(hostname --all-ip-addresses | awk '{print $1}') 
$ MYV6IP=$(hostname --all-ip-addresses | awk '{print $2}')
$ echo $MYV4IP
192.168.1.166 
$ echo $MYV6IP 
2601:7c1:103:b27:352e:e151:c7d8:3379
Seamus
fonte
1

Sugiro o uso de uma biblioteca python, como netifaces, projetada especificamente para esse fim.

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]
Sandeep
fonte
1

Apenas mais uma opção que pode ser útil se você não tiver o awk (como é o caso em 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}"
Fulvio Flaco
fonte
1

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

Maksim Kostromin
fonte
1

aqui está o IPv4 :

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

aqui está para IPv4 e dev particular (eth0):

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

para IPv6 :

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

XXL
fonte
0

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

ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
Matheus Baldasso
fonte
ele pedir eth0, esta versão do seu script poderia ajudar (também mostram loopback tho)ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
TiloBunt
Esta é praticamente a mesma resposta que askubuntu.com/a/560466/367990 , apenas usando cutduas vezes em vez de uma combinação de awke cutpara analisar a saída. Da próxima vez, verifique melhor todas as outras respostas primeiro e garanta que não publique uma solução duplicada. Nesse caso, acho que é discutível se é uma duplicata ou se é semelhante; portanto, tome isso como uma dica geral. Obrigado.
Byte Commander
0

Esta é a maneira mais curta que pude encontrar:

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

Substituir $1 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 interoperar o próximo valor como um perl-regex e imprima apenas os valores correspondentes.

O regex \K[\d.]+diz "jogue fora tudo até esse ponto (\ K) e combine o máximo de valores numéricos seguidos por um ponto em uma linha possível". Portanto, isso corresponderá apenas ao endereço IP e ignorará tudo depois dele, incluindo a máscara de sub-rede de atalho \ XX.

Ryan
fonte
0

hoje em dia com múltiplas interfaces (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 / Mask:

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

Portanto, quaisquer que sejam as interfaces que eu tenha e o nome delas, o GREP será o primeiro a ter 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 & NIX e nunca falha;)

JOduMonT
fonte
Se você estiver analisando a saída de ip, use a -oopção
Muru
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.

Maciej Wawrzyńczuk
fonte
0

Ainda de outra maneira (supondo que você não queira um CIDRendereço e queira IPv4):

$ ip -br -4 addr show dev eth0 | awk '{split($3,a,"/"); print a[1]}'
  • Usa o ipcomando que não édeprecated
  • Usa apenas um comando para filtrar
htaccess
fonte