Risposte:
One-liner:
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}'
Nota: funziona solo se la macchina è l'unica sulla reteip route show | grep -i 'default via'| awk '{print $3 }'
uscita: 192.168.0.1
per me
NOTA :
Per il 15.04 e successivi, no nm-tool
, quindi usa nmcli dev show <IFACE>
. Per esempio,
$ nmcli dev show wlan7 | grep GATEWAY
IP4.GATEWAY: 192.168.0.1
IP6.GATEWAY:
Modifiche e informazioni aggiuntive
Come puoi vedere dall'esame del comando, prendiamo l'output di nm-tool
(che, nota, prende le informazioni da NetworkManager), troviamo la riga contenente word gateway
, stampa delle informazioni con eco (separato da spazi) e quindi tagliamo solo il secondo elemento dell'intero produzione. Nota che se hai due o più connessioni lì, potresti aver bisogno di rimuovere la xargs echo | cut -d' ' -f2
parte superiore e sostituirla con awk '{print $2}'
; in altre parole l'intera linea sarebbe simile a questa nm-tool | grep -i gateway | awk '{print $2}'
. In alternativa, avresti potuto usare nm-tool | grep -oP '(?i)gateway:\s*\K\S+'
come proposto da Avinash Raj nei commenti. Come puoi vedere non c'è niente di speciale fatto qui, e l'intero calvario qui è semplicemente un esercizio nell'uso di strumenti di modifica dell'output come cut, awk e grep.
Un altro metodo per ottenere le informazioni sul gateway è attraverso nmcli dev list
il comando (sì, ancora facendo affidamento sul gestore di rete). nmcli
è la versione da riga di comando di Network Manager. Potresti correre nmcli dev list | grep -i routers
o potresti correre nmcli dev list | grep -i 'gw ='
. Ancora una volta, puoi esercitarti nel tagliare tutte le altre informazioni tranne l'indirizzo IP desiderato, se lo desideri.
Dato che nella domanda originale l'unica specifica era stampare solo il gateway predefinito, qui mi affido all'output di nm-tool. NetworkManager viene fornito con Ubuntu per impostazione predefinita, questo è il modo standard per gestire le connessioni di rete di Ubuntu. Se usi qualcos'altro, come wicd o connettiti tramite wpa_cli, nm-tool non ti fornirà una risposta. In tal caso potresti trovare più utili le risposte di altre persone.
Un'opzione più distro-neutrale e config-neutra sarebbe usare netstat -n
, che usa una tabella di routing del kernel, simile a route -n
. L'output è muggito, niente di sorprendente.
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
Ed ecco il modo per ritagliare le informazioni desiderate: netstat -nr | awk '$1 == "0.0.0.0"{print$2}'
Un altro, anche neutrale: arp -n | awk '{print $1}'
eth0
e wlan0
, entrambi attivamente connessi ma con un gateway configurato solo su wlan0
, nm-tool | grep -i gateway | xargs echo | cut -d' ' -f2
solo uscite 0.0.0.0
. nm-tool | grep -oP '(?i)gateway:\s*\K\S+'
genera due righe: 0.0.0.0
seguito da 192.168.1.1
. (I modi ip route ...
e route -n ...
producono giusto 192.168.1.1
, che considererei il risultato più desiderabile.)
network-manager
ad es. Da ifupdown
o ... in ifconfig
quei casi nm-tool
non genererà l'output desiderato ... in poche parole questa risposta si basa solo sulla rete gestita da network-manager
...
Puoi trovarlo in molti modi
ip route show default
Una domanda migliore, cosa o come vuoi modellare l'output?
ip route show | awk '/default/ {print $3}'
tracepath -m 1 8.8.8.8 | awk '/1:/ {print $2}' | uniq
Dai commenti - (grazie Avinash Raj 0
tracepath -m 1 8.8.8.8 | awk '/1:/ {print $2;exit}'
uniq
solo 5 tracepath -m 1 8.8.8.8 | awk '/1:/ {print $2;exit}'
pollici.
Di solito route -n
, puoi provare questa sed
soluzione insieme a route -n
:
route -n | sed -nr 's/(0\.0\.0\.0) +([^ ]+) +\1.*/\2/p'
Ecco un 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
Un altro modo sarebbe usare grep
:
$ route -n | tr -s ' ' | grep -Po "(?<=0\.0\.0\.0 )[^ ]+(?= 0\.0\.0\.0)"
192.168.1.1
Come ha sottolineato @AvinashRaj, questo può essere fatto solo usando grep
(non c'è bisogno di schiacciare gli spazi usando tr
):
route -n | grep -Po "0\.0\.0\.0\s*\K\S+(?=\s*0\.0\.0\.0)"
192.168.1.1
tr
, solo grep farà il lavororoute -n | grep -Po "0\.0\.0\.0 \s*\K\S+(?=\s*0\.0\.0\.0)"
Lo uso abbastanza spesso:
route -n | awk '{ print $2 }' | grep -Eo '[1-9]{0,3}\.[1-9]{0,3}\.[0-9]{0,3}\.[1-9]{0,3}'
192.168.0.1
?
Se hai accesso a un browser web sul sistema puoi andare su http://whatsmyrouterip.com/ e dovrebbe essere in grado di trovare il tuo IP senza alcun comando.
Altrimenti, basta aprire semplicemente il terminale e fare un ip route | grep default
dovrebbe. Potrebbe dare più di uno a seconda delle interfacce di rete.
hostname -I
190.200.200.107 172.21.0.1 172.17.0.1 172.19.0.1 172.18.0.1
quindi per ottenere solo il problema IP
hostname -I | cut -d' ' -f1
190.200.200.107
nm-tool | grep -oP '(?i)gateway:\s*\K\S+'