Como obtenho o gateway padrão no LINUX, dependendo do destino?

11

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 é executar 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 obtenho apenas o gateway padrão? Vou precisar dele para o meu script bash para identificar se a conexão de rede está ativa ou não.

Suezy
fonte

Respostas:

21
DEFAULT_ROUTE=$(ip route show default | awk '/default/ {print $3}')
ping -c 1 $DEFAULT_ROUTE

Isso deve resolver seu problema.

David Pashley
fonte
@Suezy Ha! Vejo? awk!
30711 Jeremy Powell
falta de correspondência entre aspas simples / colchetes próximos no final, eu acho - funciona muito bem de outra maneira!
Mark K Cowan
3
Eu já vi algumas respostas online com esse comando, mas nenhuma delas explica por que "show default" é usado. De fato, "ip route show" sem nenhum parâmetro faz exatamente a mesma coisa para mim. Então, minha pergunta é por que tem "padrão" no comando? O que isso significa?
user658991
@ user658991 Estive nesta toca de coelho e você está exatamente certo. Não faz nada nas versões mais comuns do mercado ip. Na verdade, ip route showé um alias para ip route liste você pode verificar man ipse esse subcomando tem a sintaxe ip route { list | flush } SELECTOR... E não é um único seletor válido listado default. Eu sinto que ip route show table default deveria fazer o que queremos, mas infelizmente isso não acontece. Para qualquer outra pessoa, coincide com o início da linha, também (você foi avisado):ip route show | awk '/^default/{print $3}'
L0j1k
5
 ip route show default 0.0.0.0/0

Esse comando é muito mais rápido que o ip route | greppadrão no sistema com muitas rotas (10000+)

Veja, por exemplo, no 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
  • porque ip route show default showtodas as rotas para mim não apenas a rota padrão
  • porque ip route getnão aceita o padrão ou 0.0.0.0/0 como parâmetro
Martin MaKr Kratochvíl
fonte
+1 para demonstrar a filtragem nativa direta via iproute2 ! há tantos casos em que esta suite incrível utilidade é mais preciso, confiável e eficaz do que (reconhecidamente criativo) legado Linux textfu
RubyTuesdayDONO
1
Esta é uma ótima resposta! mas ainda estou um pouco confuso com a documentação do iproute2. O que significa o "padrão" no comando? Se estou lendo o documento corretamente, esse comando deve ser o mesmo que "ip route show to default 0/0", estou certo? qual é o formato "0/0"?
user658991
3

ip route show defaultdeve executar o truque para o gateway padrão ou você pode usar ip route get <someip>para ver qual é a rota para um endereço IP específico.

Zanchey
fonte
Eu tentei o ip route e ele exibe a lista de todos os gateways. e sim, o padrão também é exibido na parte inferior. obrigado por isso. =) Mas meu objetivo aqui é obter o endereço IP usado para esse gateway padrão. Usando o script bash, vou executar ping para verificar se está ativo ou não.
Suezy 30/07/2009
Eu recebo quatro entradas para "show default". "ip route show default | awk '/ default / {print $ 3}'" "deve obter o endereço IP sozinho.
David Pashley
2

Se você quiser fazer isso usando netstat(para que funcione em algo que NÃO seja 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 começando com 0.0.0.0ou default)
e imprime o host de gateway (segundo campo dos resultados).

A proliferação de \caracteres na expressão regular é significativa:

  • \(e \)especifique um grupo
  • \| é o caractere de alternância (a coisa à esquerda ou a coisa à direita corresponde)
  • os pontos no endereço IP são representados por \.- significando o caractere literal .em oposição a uma Expressão regular .(que corresponde a qualquer caractere único)
voretaq7
fonte
1
grep -eou egreptambém fazer o truque sem a necessidade dos suportes e do tubo a ser escapouegrep '^(default|0\.0\.0\.0)'
Mark K Cowan
1

É assim que eu faço:

#!/bin/sh
GATEWAY_DEFAULT=$(ip route list | sed -n -e "s/^default.*[[:space:]]\([[:digit:]]\+\.[[:digit:]]\+\.[[:digit:]]\+\.[[:digit:]]\+\).*/\1/p")
echo ${GATEWAY_DEFAULT}
Noah Spurrier
fonte
1
 ip route show default | grep default | awk {'print $3'}

Faz aqui

ActionParsnip
fonte
Por que grep defaultquando você já especifica a defaultrota em seu ipcomando?
Lindhe
0

A maneira MUITO fácil ... pergunte à tabela de roteamento como chega a um IP fora da rede

DNS do Google == 8.8.8.8

ip route get 8.8.8.8

Dave.B
fonte
0
ip route show 0/0

ou

ip route show 0.0.0.0/0

ou

ip route show 0.0.0.0/0.0.0.0

ou

ip -f inet route show default

ou

ip -4 route show default

Se entendi direito, a pesquisa de gateway padrão para essa rota exata - a rota com todos os zeros - é 0.0.0.0/0.0.0.0 (ou 0/0) para IPv4 ou 0000: 0000: 0000: 0000: 0000: 0000 : 0000: 0000 (ou: :) para IPv6.

No entanto (!), Sem especificar o AF que você deseja usar (-4 ou -6 ou -f inet ou -f inet6) ou especificar a rota all-zeros como um prefixo IPv4 ou IPv6 (0/0 implica IPv4) , ele não pode descobrir o que é 'padrão' ...

Pessoalmente, não acho que a página de manual seja muito clara sobre isso, mas esses são apenas meus dois centavos.

user155186
fonte