Wie erhalte ich das Standard-Gateway in LINUX unter Angabe des Ziels?


11

Ich versuche, das Standard-Gateway mit dem Ziel 0.0.0.0 abzurufen

Ich habe diesen Befehl verwendet: netstat -rn | grep 0.0.0.0

und es gibt diese Liste zurück:

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

Mein Ziel hier ist es, das Standard-Gateway mit dem Ziel 0.0.0.0 zu pingen. das ist also "133.88.31.70"; aber dieser gibt eine Liste zurück, weil 'grep' verwendet wird.

Die Frage ist: Wie bekomme ich nur das Standard-Gateway? Ich benötige es für mein Bash-Skript, um festzustellen, ob eine Netzverbindung besteht oder nicht.

Antworten:


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

Dies sollte Ihr Problem lösen.


@ Suezy Ha! Sehen? awk!
Jeremy Powell

Ich denke, am Ende passt die Nichtübereinstimmung zwischen Anführungszeichen und Klammer - funktioniert aber ansonsten großartig!
Mark K Cowan

3
Ich habe mit diesem Befehl einige Antworten online gesehen, aber keine erklärt, warum "show default" verwendet wird. Tatsächlich macht "ip route show" ohne Parameter genau das Gleiche für mich. Meine Frage ist also, warum der Befehl "default" enthält. Was bedeutet es?
user658991

@ user658991 Ich war in diesem Kaninchenbau und du bist genau richtig. Es macht nichts auf den gängigsten Versionen von ipda draußen. In der Tat ip route showist ein Alias ​​für ip route listund Sie können überprüfen man ip, ob dieser Unterbefehl die Syntax hat ip route { list | flush } SELECTOR... Und kein einziger dieser gültigen Selektoren ist aufgeführt default. Ich habe das Gefühl, wir ip route show table default sollten tun, was wir wollen, aber leider nicht. ip route show | awk '/^default/{print $3}'
Passen

5
 ip route show default 0.0.0.0/0

Dieser Befehl ist viel schneller als der ip route | grepStandard auf einem System mit vielen (10000+) Routen

Suchen Sie zum Beispiel von meinem Router mit vollständigem BGP und manueller Standardroute als 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
  • weil ip route show default showalle Routen für mich nicht nur Standardroute
  • weil ip route getnicht Standard oder 0.0.0.0/0 als Parameter akzeptieren

+1 für die Demonstration der direkten nativen Filterung über iproute2 ! Es gibt so viele Fälle, in denen diese erstaunliche Utility-Suite genauer, zuverlässiger und leistungsfähiger ist als (zugegebenermaßen kreativer) älterer Linux-Text
RubyTuesdayDONO

1
Das ist eine großartige Antwort! aber ich bin immer noch ein bisschen verwirrt von der Dokumentation von iproute2. Was bedeutet der "Standard" im Befehl? Wenn ich das Dokument richtig lese, sollte dieser Befehl mit "ip route show to default 0/0" identisch sein. Stimmt das? Was ist das "0/0" -Format?
Benutzer658991

3

ip route show defaultsollte den Trick für das Standard-Gateway tun, oder Sie können verwenden, um ip route get <someip>zu sehen, wie die Route für eine bestimmte IP-Adresse ist.


Ich habe versucht, IP-Route und es zeigt die Liste für alle Gateways .. und ja, die Standard ist auch unten angezeigt. Dank dafür. =) Aber mein Ziel hier ist es, die IP-Adresse zu erhalten, die für dieses Standard-Gateway verwendet wird. Mit dem Bash-Skript werde ich dieses anpingen, um zu überprüfen, ob es aktiv ist oder nicht.
Suezy

Ich bekomme vier Einträge für "show default". "ip route show default | awk '/ default / {print $ 3}'" sollte nur die IP-Adresse enthalten.
David Pashley

2

Wenn Sie dies mit verwenden möchten netstat(damit es auf etwas funktioniert, das NICHT Linux ist ), lautet die allgemeine Lösung:

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

Dies zeigt, dass die Routing-Tabellen IPs verwenden, anstatt Hostnamen ( netstat -rn)
aufzulösen, nach dem Standard-Gateway suchen (Zeilen, die mit 0.0.0.0oder beginnen default),
und den Gateway-Host drucken (zweites Feld der Ergebnisse).

Die Verbreitung von \Zeichen im regulären Ausdruck ist signifikant:

  • \(und \)geben Sie eine Gruppe an
  • \| ist das Wechselzeichen (das Ding links oder das Ding rechts stimmt überein)
  • Die Punkte in der IP-Adresse werden dargestellt durch \.- das Literalzeichen .im Gegensatz zu einem regulären Ausdruck .(der mit einem einzelnen Zeichen übereinstimmt).

1
grep -eoder egrepwürde auch den Trick machen, ohne dass die Klammern und das Rohr entkommen müssenegrep '^(default|0\.0\.0\.0)'
Mark K Cowan

1

So mache ich es:

#!/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'}

Tut es hier


Warum, grep defaultwenn Sie die defaultRoute bereits in Ihrem ipBefehl angegeben haben?
Lindhe

0

Der SEHR einfache Weg ... fragen Sie die Routing-Tabelle, wie sie zu einer IP außerhalb ihres Netzwerks gelangt

Google DNS == 8.8.8.8

IP-Route erhalten 8.8.8.8


0
ip route show 0/0

oder

ip route show 0.0.0.0/0

oder

ip route show 0.0.0.0/0.0.0.0

oder

ip -f inet route show default

oder

ip -4 route show default

Wenn ich es richtig verstehe, ist die Standard-Gateway-Suche für genau diese Route - die Route mit allen Nullen - entweder 0.0.0.0/0.0.0.0 (oder 0/0) für IPv4 oder 0000: 0000: 0000: 0000: 0000: 0000 : 0000: 0000 (oder: :) für IPv6.

Jedoch (!), Ohne entweder den AF anzugeben, den Sie verwenden möchten (-4 oder -6 oder -f inet oder -f inet6) oder die Route mit allen Nullen als IPv4- oder IPv6-Präfix anzugeben (0/0 impliziert IPv4) kann es nicht herausfinden, was "Standard" ist ...

Persönlich glaube ich nicht, dass die Manpage diesbezüglich sehr klar ist, aber das sind nur meine zwei Cent.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.