Come posso ottenere il gateway predefinito in LINUX data la destinazione?


11

Sto cercando di ottenere il gateway predefinito, usando la destinazione 0.0.0.0

ho usato questo comando: netstat -rn | grep 0.0.0.0

e restituisce questo elenco:

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

Il mio obiettivo qui è eseguire il ping del gateway predefinito utilizzando la destinazione 0.0.0.0; quindi, questo è "133.88.31.70"; ma questo restituisce un elenco a causa dell'utilizzo di 'grep'.

La domanda è: come posso ottenere solo il gateway predefinito? Ne avrò bisogno perché il mio script bash identifichi se la connessione di rete è attiva o meno.

Risposte:


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

Questo dovrebbe risolvere il tuo problema.


@Suezy Ha! Vedere? awk!
Jeremy Powell,

chiudere una virgoletta singola / chiudere la parentesi chiusa alla fine credo - funziona benissimo altrimenti!
Mark K Cowan,

3
Ho visto alcune risposte online con questo comando, ma nessuno di loro spiega perché viene usato "show default". In effetti "ip route show" senza alcun parametro fa esattamente la stessa cosa per me. Quindi la mia domanda è: perché ha "default" nel comando? Cosa significa?
user658991

@ user658991 Sono stato in questa tana del coniglio e hai ragione. Non fa nulla sulle versioni più comuni di iplà fuori. In realtà ip route showè un alias per ip route liste puoi controllare man ipper vedere che questo sottocomando ha la sintassi ip route { list | flush } SELECTOR... E non uno solo di quei selettori validi elencati default. Sento che ip route show table default dovremmo fare quello che vogliamo, ma sfortunatamente no. Per chiunque altro, abbina anche l'inizio della riga (sei stato avvisato):ip route show | awk '/^default/{print $3}'
L0j1k

5
 ip route show default 0.0.0.0/0

Questo comando è molto più veloce del ip route | grepdefault sul sistema con molti (10000+) percorsi

Cerca ad esempio dal mio router con BGP completo e percorso predefinito manuale come 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
  • perché ip route show default showtutti i percorsi per me non sono solo percorsi predefiniti
  • perché ip route getnon accetta il parametro predefinito o 0.0.0.0/0

+1 per dimostrare il filtro nativo diretto tramite iproute2 ! ci sono così tanti casi in cui questa straordinaria suite di utility è più accurata, affidabile e performante rispetto al legacy textfu
ammettibilmente

1
Questa è un'ottima risposta! ma sono ancora un po 'confuso dalla documentazione di iproute2. Cosa significa "predefinito" nel comando? Se sto leggendo il documento correttamente, questo comando dovrebbe essere lo stesso di "ip route show to default 0/0", vero? che cos'è il formato "0/0"?
user658991

3

ip route show defaultdovrebbe fare il trucco per il gateway predefinito, oppure è possibile utilizzare ip route get <someip>per vedere qual è il percorso per un determinato indirizzo IP.


ho provato il percorso ip e visualizza l'elenco per tutti i gateway .. e sì, quello predefinito viene visualizzato anche in basso. grazie per quello. =) Ma il mio obiettivo qui è ottenere l'indirizzo IP utilizzato per quel gateway predefinito. Usando lo script bash, eseguirò il ping per verificare se è attivo o meno.
Suezy,

Ottengo quattro voci per "show default". "ip route show default | awk '/ default / {print $ 3}'" dovrebbe avere solo l'indirizzo IP.
David Pashley,

2

Se vuoi farlo usando netstat(quindi funzionerà su qualcosa che NON è Linux ) la soluzione generale è:

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

Questo mostra le tabelle di routing, usando gli IP anziché risolvere i nomi host ( netstat -rn),
cerca il gateway predefinito (linee che iniziano con 0.0.0.0o default)
e stampa l'host gateway (secondo campo dei risultati).

La proliferazione di \personaggi nell'espressione regolare è significativa:

  • \(e \)specificare un gruppo
  • \| è il carattere di alternanza (la cosa a sinistra o la cosa a destra corrisponde)
  • i punti nell'indirizzo IP sono rappresentati da \.- che significa il carattere letterale .in contrapposizione a un'espressione regolare .(corrispondente a un singolo carattere)

1
grep -eo egrepfarebbe anche il trucco senza la necessità di sfuggire alle staffe e al tuboegrep '^(default|0\.0\.0\.0)'
Mark K Cowan,

1

Ecco come lo faccio:

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

1
 ip route show default | grep default | awk {'print $3'}

Lo fa qui


Perché grep defaultquando si specifica già il defaultpercorso nel ipcomando?
lindhe,

0

Il modo MOLTO semplice ... chiedi alla tabella di routing come arriva a un IP al di fuori della sua rete

DNS di Google == 8.8.8.8

ip route get 8.8.8.8


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

Se lo capisco correttamente, la ricerca del gateway predefinita per quel percorso esatto - il percorso di tutti zeri - è 0.0.0.0/0.0.0.0 (o 0/0) per IPv4 o 0000: 0000: 0000: 0000: 0000: 0000 : 0000: 0000 (o: :) per IPv6.

Tuttavia (!), Senza specificare l'AF che si desidera utilizzare (-4 o -6 o -f inet o -f inet6) o specificare il percorso di tutti zeri come prefisso IPv4 o IPv6 (0/0 implica IPv4) , non riesce a capire cosa sia "default" ...

Personalmente, non credo che la pagina man sia molto chiara al riguardo, ma sono solo i miei due centesimi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.