Comment obtenir la passerelle par défaut sous LINUX compte tenu de la destination?

11

J'essaye d'obtenir la passerelle par défaut, en utilisant la destination 0.0.0.0

j'ai utilisé cette commande: netstat -rn | grep 0.0.0.0

et il retourne cette liste:

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

Mon objectif ici est d'envoyer une requête ping à la passerelle par défaut en utilisant la destination 0.0.0.0; c'est-à-dire "133.88.31.70"; mais celui-ci renvoie une liste en raison de l'utilisation de 'grep'.

La question est: comment obtenir la passerelle par défaut uniquement? J'en aurai besoin pour que mon script bash identifie si la connexion Internet est active ou non.

Suezy
la source

Réponses:

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

Cela devrait résoudre votre problème.

David Pashley
la source
@Suezy Ha! Voir? awk!
Jeremy Powell
fermer les guillemets simples / fermer les parenthèses à la fin je pense - fonctionne très bien sinon!
Mark K Cowan
3
J'ai vu pas mal de réponses en ligne avec cette commande, mais aucune d'entre elles n'explique pourquoi "show default" est utilisé. En fait, "ip route show" sans aucun paramètre fait exactement la même chose pour moi. Donc ma question est pourquoi a "default" dans la commande? Qu'est-ce que ça veut dire?
user658991
@ user658991 J'ai descendu ce terrier de lapin et vous avez parfaitement raison. Il ne fait rien sur les versions les plus courantes ip. En fait, ip route showc'est un alias pour ip route listet vous pouvez vérifier man ipque cette sous-commande a la syntaxe ip route { list | flush } SELECTOR... Et pas un seul de ces sélecteurs valides répertoriés ne l'est default. Je pense que nous ip route show table default devrions faire ce que nous voulons, mais malheureusement, ce n'est pas le cas. Pour tout le monde, faites correspondre le début de la ligne aussi (vous avez été averti):ip route show | awk '/^default/{print $3}'
L0j1k
5
 ip route show default 0.0.0.0/0

Cette commande est beaucoup plus rapide que celle ip route | greppar défaut sur le système avec de nombreux (10000+) itinéraires

Recherchez par exemple à partir de mon routeur avec BGP complet et route par défaut manuelle comme sauvegarde

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
  • parce que ip route show default showtous les itinéraires pour moi, non seulement l'itinéraire par défaut
  • car ip route getn'accepte pas la valeur par défaut ou 0.0.0.0/0 comme paramètre
Martin MaKr Kratochvíl
la source
+1 pour avoir démontré le filtrage natif direct via iproute2 ! il y a tellement de cas où cette étonnante suite d'utilitaires est plus précise, fiable et performante que l'héritage Linux textfu (certes créatif)
RubyTuesdayDONO
1
C'est une excellente réponse! mais je suis toujours un peu confus par la documentation d'iproute2. Que signifie le "défaut" dans la commande? Si je lis correctement le document, cette commande doit être la même que "ip route show to default 0/0", ai-je raison? qu'est-ce que le format "0/0"?
user658991
3

ip route show defaultdevrait faire l'affaire pour la passerelle par défaut, ou vous pouvez utiliser ip route get <someip>pour voir quel est l'itinéraire pour une adresse IP particulière.

Zanchey
la source
j'ai essayé la route ip et il affiche la liste de toutes les passerelles .. et oui, celle par défaut est également affichée en bas. Merci pour ça. =) Mais mon objectif ici est d'obtenir l'adresse IP utilisée pour cette passerelle par défaut. En utilisant le script bash, je vais envoyer une requête ping à celui-ci pour vérifier s'il est activé ou non.
Suezy
J'obtiens quatre entrées pour "show default". "ip route show default | awk '/ default / {print $ 3}'" devrait vous procurer l'adresse IP seule.
David Pashley
2

Si vous voulez faire cela en utilisant netstat(donc ça marchera sur quelque chose qui n'est PAS Linux ) la solution générale est:

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

Cela montre les tables de routage, en utilisant des adresses IP plutôt que de résoudre les noms d'hôte ( netstat -rn),
recherche la passerelle par défaut (lignes commençant par 0.0.0.0ou default)
et imprime l'hôte de la passerelle (deuxième champ des résultats).

La prolifération des \caractères dans l'expression régulière est significative:

  • \(et \)spécifiez un groupe
  • \| est le caractère d'alternance (la chose à gauche ou la chose à droite correspond)
  • les points de l'adresse IP sont représentés par \.- signifiant le caractère littéral .par opposition à une expression régulière .(correspondant à n'importe quel caractère)
voretaq7
la source
1
grep -eou egrepferait aussi l'affaire sans que les supports et le tuyau ne s'échappentegrep '^(default|0\.0\.0\.0)'
Mark K Cowan
1

Voici comment je le fais:

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

Est-ce ici

ActionParsnip
la source
Pourquoi grep defaultalors que vous spécifiez déjà l' defaultitinéraire dans votre ipcommande?
lindhe
0

La manière TRÈS simple ... demandez à la table de routage comment elle parvient à une adresse IP en dehors de son réseau

DNS DNS == 8.8.8.8

ip route get 8.8.8.8

Dave.B
la source
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

Si je comprends bien, la recherche de passerelle par défaut pour cette route exacte - la route tous zéros - est soit 0.0.0.0/0.0.0.0 (ou 0/0) pour IPv4 ou 0000: 0000: 0000: 0000: 0000: 0000 : 0000: 0000 (ou: :) pour IPv6.

Cependant (!), Sans spécifier l'AF que vous souhaitez utiliser (-4 ou -6 ou -f inet ou -f inet6), ni spécifier la route des zéros en tant que préfixe IPv4 ou IPv6 (0/0 implique IPv4) , il ne peut pas comprendre ce qu'est le "défaut" ...

Personnellement, je ne pense pas que la page de manuel soit très claire à ce sujet, mais c'est juste mes deux cents.

user155186
la source