DEFAULT_ROUTE=$(ip route show default | awk '/default/ {print $3}')
ping -c 1 $DEFAULT_ROUTE
Isso deve resolver seu problema.
Estou tentando obter o gateway padrão, usando o destino 0.0.0.0
eu usei este comando: netstat -rn | grep 0.0.0.0
e retorna esta lista:
Destination - Gateway - Genmask - Flags - MSS - Window - irtt - Iface
10.9.9.17 - 0.0.0.0 - 255.255.255.255 - UH - 0 0 0 - tun0
133.88.0.0 - 0.0.0.0 - 255.255.0.0 - U - 0 0 0 - eth0
0.0.0.0 - 133.88.31.70 - 0.0.0.0 - UG - 0 0 0 - eth0
Meu objetivo aqui é fazer ping no gateway padrão usando o destino 0.0.0.0; assim, isso é "133.88.31.70"; mas este retorna uma lista por causa do uso de 'grep'.
A pergunta é: como faço para obter apenas o gateway padrão? Vou precisar dele para o meu script bash para identificar se a conexão com a rede está ativa ou não.
ip route show default
deve fazer o truque para o gateway padrão ou você pode usar ip route get <someip>
para ver qual é a rota de um determinado endereço IP.
ip route show default 0.0.0.0/0
Este comando é muito mais rápido que ip route | grep
default no sistema com muitas rotas (10000+)
Procure, por exemplo, meu roteador com BGP completo e rota padrão manual como backup
router:~# time ip route show default 0.0.0.0/0
default via XXX.XXX.192.254 dev eth0.123
real 0m0.707s
router:~# time ip route | grep default
default via XXX.XXX.192.254 dev eth0.123
real 0m8.596s
ip route show default show
todas as rotas para mim não apenas a rota padrão ip route get
não aceita padrão ou 0.0.0.0/0 como parâmetro Se você quiser fazer isso usando netstat
(para que funcione em algo que é NÃO Linux ), a solução geral é:
netstat -rn | grep '^\(default\|0\.0\.0\.0\)' | awk '{print $2}'
Isso mostra as tabelas de roteamento, usando IPs em vez de resolver nomes de host ( netstat -rn
),
procura o gateway padrão (linhas que começam com 0.0.0.0
ou default
),
e imprime o host do gateway (segundo campo dos resultados).
A proliferação de caracteres \
na expressão regular é significativa:
\(
e \)
especificam um grupo \|
é o caractere de alternação (a coisa à esquerda ou a coisa à direita) \.
- significando o caractere literal .
em oposição a uma Expressão Regular .
(correspondendo a qualquer caractere único) É assim que eu faço:
#!/bin/sh
GATEWAY_DEFAULT=$(ip route list | sed -n -e "s/^default.*[[:space:]]\([[:digit:]]\+\.[[:digit:]]\+\.[[:digit:]]\+\.[[:digit:]]\+\).*//p")
echo ${GATEWAY_DEFAULT}
ip route show default | grep default | awk {'print $3'}
Isso aqui
A maneira muito fácil ... perguntar a tabela de roteamento como ele chega a um IP fora de sua rede
DNS do Google == 8.8.8.8
ip route obtém 8.8.8.8