Jak uzyskać domyślną bramę w systemie LINUX, biorąc pod uwagę miejsce docelowe?


11

Próbuję uzyskać domyślną bramę, używając miejsca docelowego 0.0.0.0

użyłem tego polecenia: netstat -rn | grep 0.0.0.0

i zwraca tę listę:

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

Moim celem jest pingowanie domyślnej bramy przy użyciu miejsca docelowego 0.0.0.0; czyli „133.88.31.70”; ale ta zwraca listę z powodu użycia 'grep'.

Pytanie brzmi: jak uzyskać tylko domyślną bramę? Będę go potrzebować do skryptu bash, aby ustalić, czy połączenie sieciowe działa.

Odpowiedzi:


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

To powinno rozwiązać twój problem.


@Suezy Ha! Widzieć? awk!
Jeremy Powell

zamknij niedopasowanie pojedynczego cudzysłowu / ścisłego nawiasu na końcu, myślę, że działa świetnie, w przeciwnym razie!
Mark K Cowan,

3
Za pomocą tego polecenia widziałem sporo odpowiedzi online, ale żadne z nich nie wyjaśnia, dlaczego użyto „pokaż domyślne”. W rzeczywistości „ip route show” bez żadnego parametru robi dokładnie to samo dla mnie. Więc moje pytanie brzmi: dlaczego w poleceniu jest „default”? Co to znaczy?
user658991 18.04.17

@ user658991 Byłem w tej króliczej dziurze i masz rację. Nie robi nic w najpopularniejszych wersjach ip. W rzeczywistości ip route showjest to alias dla ip route listi możesz sprawdzić, man ipczy ta podkomenda ma składnię ip route { list | flush } SELECTOR... I żaden z wymienionych poprawnych selektorów nie jest default. Czuję, że ip route show table default powinienem robić to, co chcemy, ale niestety tak nie jest. Do kogokolwiek innego, dopasuj również początek linii (zostałeś ostrzeżony):ip route show | awk '/^default/{print $3}'
L0j1k

5
 ip route show default 0.0.0.0/0

To polecenie jest znacznie szybsze niż ip route | grepdomyślne w systemie z wieloma (ponad 10000) trasami

Spójrz na przykład z mojego routera z pełnym BGP i ręczną domyślną trasą jako kopię zapasową

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
  • ponieważ ip route show default showdla mnie wszystkie trasy to nie tylko domyślna trasa
  • ponieważ ip route getnie akceptuje wartości domyślnej lub 0.0.0.0/0 jako parametru

+1 za demonstrowanie bezpośredniego filtrowania natywnego przez iproute2 ! jest tak wiele przypadków, w których ten niesamowity pakiet narzędzi jest bardziej dokładny, niezawodny i wydajny niż (co prawda kreatywny) starsza wersja Linux-a
RubyT wtorekDONO

1
To świetna odpowiedź! ale nadal jestem nieco zdezorientowany dokumentacją iproute2. Co oznacza „domyślne” w poleceniu? Jeśli poprawnie czytam dokument, to polecenie powinno być takie samo jak „Pokaż trasę ip do domyślnej wartości 0/0”, czy mam rację? jaki jest format „0/0”?
user658991 18.04.17

3

ip route show defaultpowinieneś zrobić lewą bramę domyślną lub możesz użyć, ip route get <someip>aby zobaczyć, jaka jest trasa dla określonego adresu IP.


Próbowałem IP Route i wyświetla listę wszystkich bram .. i tak, domyślna jest również wyświetlana na dole. Dziękuję za to. =) Ale moim celem tutaj jest uzyskanie adresu IP używanego dla tej domyślnej bramy. Za pomocą skryptu bash wyślę ping do tego, aby sprawdzić, czy działa.
Suezy

Dostaję cztery wpisy dla „pokaż domyślne”. „ip route show default | awk '/ default / {print $ 3}'” powinno dać ci sam adres IP.
David Pashley

2

Jeśli chcesz to zrobić za pomocą netstat(aby działało na czymś, co NIE jest Linuksem ), ogólne rozwiązanie to:

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

Pokazuje tablice routingu, wykorzystując adresy IP zamiast rozpoznawania nazw hostów ( netstat -rn),
szuka domyślnej bramy (linie rozpoczynające się od 0.0.0.0lub default)
i drukuje host bramy (drugie pole wyników).

Liczba \znaków w wyrażeniu regularnym jest znacząca:

  • \(i \)określ grupę
  • \| jest znakiem naprzemiennym (rzecz po lewej lub rzecz po prawej pasuje)
  • kropki w adresie IP są reprezentowane przez \.- co oznacza dosłowny znak .w przeciwieństwie do wyrażenia regularnego .(dopasowanie dowolnego pojedynczego znaku)

1
grep -elub egrepteż wykonałby lewę bez potrzeby ucieczki nawiasów i ruryegrep '^(default|0\.0\.0\.0)'
Mark K Cowan

1

Tak to robię:

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

Czy to tutaj?


Dlaczego, grep defaultkiedy już podałeś defaulttrasę w swoim ippoleceniu?
Lindhe

0

BARDZO łatwy sposób ... zapytaj tablicę routingu, w jaki sposób dostaje się do adresu IP poza siecią

Google DNS == 8.8.8.8

ip route get 8.8.8.8


0
ip route show 0/0

lub

ip route show 0.0.0.0/0

lub

ip route show 0.0.0.0/0.0.0.0

lub

ip -f inet route show default

lub

ip -4 route show default

Jeśli dobrze to rozumiem, domyślne wyszukiwanie bramy dla tej dokładnej trasy - trasy z zerami - to albo 0.0.0.0/0.0.0.0 (lub 0/0) dla IPv4, albo 0000: 0000: 0000: 0000: 0000: 0000 : 0000: 0000 (lub: :) dla IPv6.

Jednak (!), Nie określając AF, którego chcesz używać (-4 lub -6 lub -f inet lub -f inet6), ani nie podając trasy zerowej jako prefiksu IPv4 lub IPv6 (0/0 oznacza IPv4) , nie może ustalić, co to jest „domyślna” ...

Osobiście nie wydaje mi się, żeby strona podręcznika była bardzo jasna, ale to tylko moje dwa centy.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.