Jak wyświetlić (tylko) adres IP mojego routera?

22

Jakie polecenie mogę uruchomić, aby uzyskać tylko adres IP mojego routera?

Za pomocą tego polecenia powinienem mieć tylko adres IP routera, a nie na przykład całą tabelę routingu (jak podczas uruchamiania route -n).

kaio
źródło

Odpowiedzi:

22

Jednowarstwowe:

  • nm-tool | grep -i gateway | xargs echo | cut -d' ' -f2
  • nm-tool | grep -i gateway | awk '{print $2}
  • netstat -nr | awk '$1 == "0.0.0.0"{print$2}'
  • arp -n | awk '{print $1}' Uwaga: działa tylko wtedy, gdy twoje urządzenie jest jedynym w sieci
  • ip route show | grep -i 'default via'| awk '{print $3 }'

wyjście: 192.168.0.1dla mnie

UWAGA :

Do 15.04 i późniejszych nie ma nm-tool, więc użyj nmcli dev show <IFACE>. Na przykład,

$ nmcli dev show wlan7 | grep GATEWAY                                                                                    
IP4.GATEWAY:                            192.168.0.1
IP6.GATEWAY:                            

Zmiany i dodatkowe informacje

Jak widać z analizy polecenia, pobieramy dane wyjściowe nm-tool(które, uwaga, pobiera informacje z NetworkManager), znajdujemy wiersz zawierający słowo gateway, drukujemy niż informacje za pomocą echa (oddzielone spacjami), a następnie odcinamy tylko drugi element całości wydajność. Uwaga: jeśli masz tam dwa lub więcej połączeń, możesz potrzebować górnej xargs echo | cut -d' ' -f2części do usunięcia i zastąp ją awk '{print $2}'; innymi słowy, cała linia wyglądałaby tak nm-tool | grep -i gateway | awk '{print $2}'. Alternatywnie możesz użyć, nm-tool | grep -oP '(?i)gateway:\s*\K\S+'jak zaproponował Avinash Raj w komentarzach. Jak widać, nie ma tu nic specjalnego, a cała ta próba jest jedynie ćwiczeniem w korzystaniu z narzędzi do edycji danych wyjściowych, takich jak cut, awk i grep.

Inną metodą uzyskania informacji o bramie jest nmcli dev list(tak, nadal poleganie na menedżerze sieci) polecenie. nmclito wersja menedżera sieci w wierszu polecenia. Możesz biegać nmcli dev list | grep -i routerslub biegać nmcli dev list | grep -i 'gw ='. Ponownie, jeśli chcesz, możesz ćwiczyć wycinanie wszystkich innych informacji oprócz pożądanego adresu IP.

Ponieważ w pierwotnym pytaniu jedyną specyfikacją było wydrukowanie tylko domyślnej bramy, polegam tutaj na wyjściu nm-tool. NetworkManager jest domyślnie dostarczany z Ubuntu, jest to standardowy sposób zarządzania połączeniami sieciowymi Ubuntu. Jeśli użyjesz czegoś innego, na przykład wicd lub połączysz przez wpa_cli, nm-tool nie dostarczy ci odpowiedzi. W takim przypadku odpowiedzi innych osób mogą okazać się bardziej przydatne.

Bardziej neutralną dla dystrybucji i neutralną dla konfiguracji opcją byłoby użycie netstat -n, która korzysta z tabeli routingu jądra, podobnej do route -n. Jego wydajność jest poniżej, nic dziwnego.

  Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 wlan0
192.168.0.0     0.0.0.0         255.255.255.0   U     9      0        0 wlan0

A oto sposób na wycięcie żądanych informacji: netstat -nr | awk '$1 == "0.0.0.0"{print$2}'

Kolejny, również neutralny: arp -n | awk '{print $1}'

Sergiy Kolodyazhnyy
źródło
prostenm-tool | grep -oP '(?i)gateway:\s*\K\S+'
Avinash Raj,
@AvinashRaj Thanks! Nie studiowałem grep i awk zbyt głęboko, więc działając na wiedzy, którą już miałem. Będzie dobrze wiedzieć
Sergiy Kolodyazhnyy
Być może jest to spowodowane jakimś (dodatkowe) specyfiki mojej konfiguracji, ale na maszynie z adapterami eth0i wlan0zarówno aktywnie podłączony ale z bramy skonfigurowanym tylko wlan0, nm-tool | grep -i gateway | xargs echo | cut -d' ' -f2wyjść tylko 0.0.0.0. nm-tool | grep -oP '(?i)gateway:\s*\K\S+'wypisuje dwie linie: 0.0.0.0następnie 192.168.1.1. (A ip route ...i route -n ...sposoby dają po prostu 192.168.1.1, co uważam za najbardziej pożądany rezultat.)
Eliah Kagan
To nie będzie działać, jeśli sieć nie jest zarządzana przez network-managernp przez ifupdownlub ifconfig..w tych przypadkach nm-toolnie przyniesie pożądanego output..in skrócie odpowiedź ta opiera się wyłącznie na sieci zarządzane przez network-manager..
heemayl
@EliahKagan Ach, rozumiem. W przypadku mojego polecenia znajduje wiersze z „bramą”, następnie echa jako jedna linia oddzielona spacjami i odcina drugi element. Ponieważ masz tam dwie takie linie, moje polecenie wypisuje tylko jedną z nich. W tym przypadku lepsza jest komenda Avinasha. Jeśli chodzi o 0.0.0.0, oto coś związanego . Jeśli chodzi o komentarz heemayla, tak, to prawda, i w pytaniu PO nie było żadnych specyfikacji poza pokazaniem wyników
Sergiy Kolodyazhnyy
7

Możesz to znaleźć na wiele sposobów

ip route show default

Lepsze pytanie, co lub jak chcesz kształtować wynik?

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

tracepath -m 1 8.8.8.8 | awk '/1:/ {print $2}' | uniq

Z komentarzy - (dziękuję Avinash Raj 0

tracepath -m 1 8.8.8.8 | awk '/1:/ {print $2;exit}'
Pantera
źródło
nie musisz o, bo uniqpo prostu tracepath -m 1 8.8.8.8 | awk '/1:/ {print $2;exit}'byłoby 5 cali.
Avinash Raj,
tak wiele wyborów. W moim systemie drukuje dwa razy bez uniq. Twoje rozwiązanie również działa.
Panther,
Uwaga tracepathpodpory -mna niektórych wersjach Ubuntu , ale nie na innych .
Eliah Kagan,
Nawiasem mówiąc, @ bodhi.zazen, twoja odpowiedź różni się, użyj traceroute. Ten sam pomysł, inne polecenie, prawda?
Sergiy Kolodyazhnyy
@serg pewno, prawdopodobnie jest to długa lista komend i opcji filtrowania, sed, awk, Perl, grep ...
Panther
6

Jak zwykle używasz route -n, możesz wypróbować to sedrozwiązanie w połączeniu z route -n:

route -n | sed -nr 's/(0\.0\.0\.0) +([^ ]+) +\1.*/\2/p' 

Oto test:

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
192.168.0.0     0.0.0.0         255.255.240.0   U     0      0        0 eth0

$ route -n | sed -nr 's/(0\.0\.0\.0) +([^ ]+) +\1.*/\2/p' 
192.168.1.1

Innym sposobem byłoby użycie grep:

$ route -n | tr -s ' ' | grep -Po "(?<=0\.0\.0\.0 )[^ ]+(?= 0\.0\.0\.0)"
192.168.1.1

Jak zauważył @AvinashRaj, można to zrobić tylko za pomocą grep(nie trzeba wciskać spacji za pomocą tr):

route -n | grep -Po "0\.0\.0\.0\s*\K\S+(?=\s*0\.0\.0\.0)"
192.168.1.1
heemayl
źródło
nie musisz używać tr, sam grep wykona robotęroute -n | grep -Po "0\.0\.0\.0 \s*\K\S+(?=\s*0\.0\.0\.0)"
Avinash Raj,
1

Używam tego dość często:

route -n | awk '{ print $2 }' | grep -Eo '[1-9]{0,3}\.[1-9]{0,3}\.[0-9]{0,3}\.[1-9]{0,3}'
krt
źródło
Co jeśli adres jest 192.168.0.1?
Avinash Raj,
1

Jeśli masz dostęp do przeglądarki internetowej w systemie, możesz przejść do strony http://whatsmyrouterip.com/ i powinna ona znaleźć Twój adres IP bez żadnego polecenia.

W przeciwnym razie wystarczy otworzyć terminal i zrobić ip route | grep default. Może to dać więcej niż jeden w zależności od interfejsów sieciowych.

MaZZly
źródło
0

Używam tego dość często i łatwo zapamiętać:

route | grep default | awk '{print $2}'
sys0dm1n
źródło
0
hostname  -I

190.200.200.107 172.21.0.1 172.17.0.1 172.19.0.1 172.18.0.1

aby uzyskać tylko problem z adresem IP

hostname -I | cut -d' ' -f1 

190.200.200.107

Scott Stensland
źródło