¿Cómo obtengo la puerta de enlace predeterminada en LINUX dado el destino?

11

Estoy tratando de obtener la puerta de enlace predeterminada, usando el destino 0.0.0.0

utilicé este comando: netstat -rn | grep 0.0.0.0

y devuelve 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

Mi objetivo aquí es hacer ping a la puerta de enlace predeterminada utilizando el destino 0.0.0.0; así, eso es "133.88.31.70"; pero este devuelve una lista por usar 'grep'.

La pregunta es: ¿cómo obtengo solo la puerta de enlace predeterminada? Lo necesitaré para que mi script bash identifique si la conexión de red está activa o no.

Suezy
fuente

Respuestas:

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

Esto debería solucionar tu problema.

David Pashley
fuente
@Suezy Ha! ¿Ver? awk!
Jeremy Powell el
Cerrar comillas simples / cierre de corchete no coinciden al final, creo que funciona de lo contrario.
Mark K Cowan
3
He visto bastantes respuestas en línea con este comando, pero ninguna de ellas explica por qué se usa "show default". De hecho, "ip route show" sin ningún parámetro hace exactamente lo mismo para mí. Entonces mi pregunta es ¿por qué tiene "default" en el comando? Qué significa eso?
user658991
@ user658991 He estado en este agujero de conejo y tienes toda la razón. No hace nada en las versiones más comunes de ippor ahí. De hecho, ip route showes un alias ip route listy puede verificar man ipsi este subcomando tiene la sintaxis ip route { list | flush } SELECTOR... Y ninguno de los selectores válidos enumerados es default. Siento que ip route show table default debería hacer lo que queremos, pero desafortunadamente no lo hace. Para cualquier otra persona, coincida también con el comienzo de la línea (se le ha advertido):ip route show | awk '/^default/{print $3}'
L0j1k
5
 ip route show default 0.0.0.0/0

Este comando es mucho más rápido que el ip route | greppredeterminado en el sistema con muchas (10000+) rutas

Mire, por ejemplo, desde mi enrutador con BGP completa y ruta predeterminada manual como respaldo

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 las rutas para mí no solo la ruta predeterminada
  • porque ip route getno acepta el valor predeterminado o 0.0.0.0/0 como parámetro
Martin MaKr Kratochvíl
fuente
¡+1 para demostrar el filtrado nativo directo a través de iproute2 ! hay tantos casos en los que este sorprendente conjunto de utilidades es más preciso, confiable y eficaz que el textfu Linux heredado (ciertamente creativo)
RubyTuesdayDONO
1
¡Esta es una respuesta genial! pero todavía estoy un poco confundido por la documentación de iproute2. ¿Qué significa el "valor predeterminado" en el comando? Si estoy leyendo el documento correctamente, este comando debería ser el mismo que "ip route show to default 0/0", ¿estoy en lo cierto? ¿Cuál es el formato "0/0"?
user658991
3

ip route show defaultdebería hacer el truco para la puerta de enlace predeterminada, o puede usar ip route get <someip>para ver cuál es la ruta para una dirección IP en particular.

Zanchey
fuente
intenté ip route y muestra la lista de todas las puertas de enlace ... y sí, la predeterminada también se muestra en la parte inferior. gracias por eso. =) Pero mi objetivo aquí es obtener la dirección IP utilizada para esa puerta de enlace predeterminada. Usando el script bash, haré un ping para verificar si está activo o no.
Suezy el
Recibo cuatro entradas para "show default". "ip route show default | awk '/ default / {print $ 3}'" debería obtener solo la dirección IP.
David Pashley
2

Si desea hacer esto usando netstat(para que funcione en algo que NO sea Linux ) la solución general es:

netstat -rn | grep '^\(default\|0\.0\.0\.0\)' | awk '{print $2}'

Esto muestra las tablas de enrutamiento, utilizando IP en lugar de resolver nombres de host ( netstat -rn),
busca la puerta de enlace predeterminada (líneas que comienzan con 0.0.0.0o default)
e imprime el host de la puerta de enlace (segundo campo de los resultados).

La proliferación de \caracteres en la expresión regular es significativa:

  • \(y \)especificar un grupo
  • \| es el carácter de alternancia (la cosa de la izquierda o la de la derecha coincide)
  • los puntos en la dirección IP están representados por \., es decir, el carácter literal .en lugar de una expresión regular .(que coincide con cualquier carácter individual)
voretaq7
fuente
1
grep -eo egreptambién haría el truco sin necesidad de escapar de los soportes y la tuberíaegrep '^(default|0\.0\.0\.0)'
Mark K Cowan
1

Así es como lo hago:

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

Lo hace aqui

ActionParsnip
fuente
¿Por qué grep defaultcuando ya especificas la defaultruta en tu ipcomando?
lindhe
0

La manera MUY fácil ... pregunte a la tabla de enrutamiento cómo llega a una IP fuera de su red

Google DNS == 8.8.8.8

ruta ip obtener 8.8.8.8

Dave.B
fuente
0
ip route show 0/0

o

ip route show 0.0.0.0/0

o

ip route show 0.0.0.0/0.0.0.0

o

ip -f inet route show default

o

ip -4 route show default

Si lo entiendo correctamente, la búsqueda de puerta de enlace predeterminada para esa ruta exacta, la ruta de todos ceros, es 0.0.0.0/0.0.0.0 (o 0/0) para IPv4 o 0000: 0000: 0000: 0000: 0000: 0000 : 0000: 0000 (o: :) para IPv6.

Sin embargo (!), Sin especificar el AF que desea utilizar (-4 o -6 o -f inet o -f inet6), o especificar la ruta de todos ceros como un prefijo IPv4 o IPv6 (0/0 implica IPv4) , no puede descubrir qué es 'predeterminado' ...

Personalmente, no creo que la página del manual sea muy clara al respecto, pero eso es solo mis dos centavos.

usuario155186
fuente