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