Eu não quero ser um idiota, mas existe um jeito correto e é isso. Você ajusta a saída de ip route
para obter apenas o IP de origem. Dependendo do IP que você está tentando acessar, "meu próprio endereço IP" (palavras do OP) será diferente. Se você se preocupa em acessar a Internet pública, o uso do servidor DNS do Google 8.8.8.8 é bastante normal. Então ...
A resposta curta é:
ip route get 8.8.8.8 | sed -n '/src/{s/.*src *//p;q}'
Aqui está a explicação detalhada
Se eu quiser que o ip que eu uso para acessar a internet , eu uso isso:
pi@et3:~ $ ip route get 8.8.8.8 | sed -n '/src/{s/.*src *//p;q}'
10.55.0.200
Se eu quiser que o ip que eu uso para alcançar algo na minha VPN , eu uso isso:
pi@et3:~ $ ip route get 172.31.0.100 | sed -n '/src/{s/.*src *//p;q}'
172.29.0.9
This next one is really just for illustrative purposes. But, it should work on any Linux system. So, you can use this to demonstrate that, yes, all machines have multiple IP addresses at all times.
Se eu quisesse que o ip eu usasse para eu mesmo , eu usaria isso:
pi@et3:~ $ my_ip=$(getent hosts $(cat /etc/hostname) | awk '{print $1; exit}')
pi@et3:~ $ ip route get $my_ip | sed -n '/src/{s/.*src *//p;q}'
127.0.0.1
Mais sobre esse comando sed
Primeiro, deixe-me dizer que, ao escolher ferramentas unix, você tenta escolher as ferramentas que exigem o menor número de tubos. Assim, enquanto algumas respostas canalizam
ifconfig
para
grep
para
sed
para
head
, isso raramente é necessário. Quando você vê, deve levantar uma bandeira vermelha que você está tomando conselhos de alguém com pouca experiência.
Isso não torna a "solução" errada. Mas, provavelmente, poderia usar alguma otimização.
Eu escolhi sed
porque é mais concisa do que o mesmo fluxo de trabalho em awk
. Eu não acho que qualquer outra ferramenta além dessas 2 seria apropriada.
Vamos examinar o que o sed -n '/src/{s/.*src *//p;q}'
faz:
sed # the sed executable located via $PATH
-n # no output unless explicitly requested
' # begin the command space
/src/ # regex match the string 'src'
{ # begin a block of commands **
s/.*src *// # regex match "anything followed by 'src' followed by any number of spaces" and replace it with "nothing"
p # print (explicitly, remember) the result
; # designate the end of the command
q # quit
} # end the block of commands
' # end the command space
** all of which will be performed "on match"
- otherwise only the first command to following the match would be performed "on match"
- any other commands would be performed whether there was a match or not
Mais sobre minha rede
Meu ifconfig
mostra que tenho tun0
para minha VPN e eth0
para minha lan.
pi@et3:~ $ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.55.0.200 netmask 255.255.252.0 broadcast 10.55.3.255
inet6 fe80::71e6:5d7c:5b4b:fb25 prefixlen 64 scopeid 0x20<link>
ether b8:27:eb:b2:96:84 txqueuelen 1000 (Ethernet)
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
inet 172.29.0.9 netmask 255.255.255.255 destination 172.29.0.10
inet6 fe80::3a8e:8195:b86c:c68c prefixlen 64 scopeid 0x20<link>
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 100 (UNSPEC)
wlan0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether b8:27:eb:e7:c3:d1 txqueuelen 1000 (Ethernet)