Como exibir o endereço IP da interface padrão com conexão com a Internet?

5

Eu preciso criar um script que produza o endereço IP interno, que está configurado como a interface padrão.

    
por Marcello de Sales 09.11.2014 / 18:59

6 respostas

5

Aqui está outro método ligeiramente mais terser usando procfs (presume que você esteja usando o Linux):

default_iface=$(awk '$2 == 00000000 { print $1 }' /proc/net/route)
ip addr show dev "$default_iface" | awk '$1 ~ /^inet/ { sub("/.*", "", $2); print $2 }'

Isso retorna o endereço IPv4 e (se disponível) o endereço IPv6 da interface. Você pode alterar o teste se desejar apenas um ou outro (procure inet para IPv4 e inet6 para IPv6).

$ default_iface=$(awk '$2 == 00000000 { print $1 }' /proc/net/route)
$ ip addr show dev "$default_iface" | awk '$1 ~ /^inet/ { sub("/.*", "", $2); print $2 }'
10.0.2.15
fe80::a00:27ff:fe45:b085
$ ip addr show dev "$default_iface" | awk '$1 == "inet" { sub("/.*", "", $2); print $2 }'
10.0.2.15
$ ip addr show dev "$default_iface" | awk '$1 == "inet6" { sub("/.*", "", $2); print $2 }'
fe80::a00:27ff:fe45:b085
    
por 09.11.2014 / 19:51
1

Veja o que escrevi:

  1. Obtenha a interface padrão do comando "route".

Ele irá imprimir qual interface é a "padrão". Para meu host, preciso obter a última coluna da linha padrão.

[root@pppdc9prd3ga mdesales]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.4.0     *               255.255.252.0   U     0      0        0 bridge0
10.132.60.0     *               255.255.252.0   U     0      0        0 eth4
link-local      *               255.255.0.0     U     1002   0        0 eth4
link-local      *               255.255.0.0     U     1003   0        0 bridge0
default         10.132.60.1     0.0.0.0         UG    0      0        0 eth4
  1. Use "ifconfig" para recuperar o endereço IP dessa interface.

Apenas pegando o addr: value.

[root@pppdc9prd3ga mdesales]# ifconfig eth4
eth4      Link encap:Ethernet  HWaddr 00:50:56:01:42:91  
          inet addr:10.132.63.191  Bcast:10.132.63.255  Mask:255.255.252.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1346288 errors:0 dropped:0 overruns:0 frame:0
          TX packets:438844 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:276243478 (263.4 MiB)  TX bytes:116188062 (110.8 MiB)

Então aqui está o script que eu criei.

/app/myPublicIp.sh 
defaultInterface=$(route | grep default | awk '{print $(NF)}')
ifconfig $defaultInterface | grep 'inet addr:' | cut -d: -f2 |  awk '{ print $1}'

Aqui está a execução:

/app/ipFor.sh 
10.132.63.191

Espero que ajude!

    
por 09.11.2014 / 19:09
0

Se o que você deseja é o endereço IP atribuído à interface padrão (que é o que eu entendi dos comentários na pergunta), usar o canivete suíço da configuração de rede ( ip ) deve ser suficiente:

$ ip route | grep '^default'
default via 10.176.143.1 dev eth1  metric 203 
$ ip addr show eth1
4: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether c0:de:f1:72:30:48 brd ff:ff:ff:ff:ff:ff
    inet 10.176.143.71/24 brd 10.176.143.255 scope global eth1
       valid_lft forever preferred_lft forever

Isso encurta para

$ ip addr show \
    $( /sbin/ip route \
        | grep '^default'\
        | sed 's/^.*dev \([^ \t]*\) .*$//' )

que é feio, porque está analisando algo que provavelmente não foi realmente destinado a ser analisado (saída de ip route ), mas deve funcionar.

    
por 09.11.2014 / 22:59
0

Muitas boas respostas aqui, mas queria incluir minha abordagem usual:

A solução mais simples é obter o caminho para um endereço público na Internet:

$ ip route get 1.1.1.1 | grep -oP 'src \K\S+'
192.168.0.20

Outra solução é obter o gateway padrão e, em seguida, obter o endereço IP usado para se comunicar com esse gateway:

$ ip route get $(ip route show 0.0.0.0/0 | grep -oP 'via \K\S+') | grep -oP 'src \K\S+'
192.168.0.20
    
por 10.11.2014 / 01:02
0

O meu favorito é o seguinte.

Obtenha a interface padrão:

$ ip r | grep -oP 'default .* \K.+'
eth0

Obtenha o ip de uma interface:

$ ip a show eth0 | grep -oP 'inet \K[\d\.]+'
10.33.44.135

Combinado:

$ ip a show $(ip r | grep -oP 'default .* \K.+') | grep -oP 'inet \K[\d\.]+'
10.33.44.135
    
por 12.08.2018 / 19:11
0

Comando simples com interface padrão.

ip route | grep src | awk '{print $NF; exit}'

Testado em todos os sistemas operacionais Unix

    
por 02.12.2018 / 20:29