Come scoprire quale interfaccia sto usando per connettermi a Internet?


48

Ho eth0 e wlan0 secondo ifconfig e posso ping google.com. Come posso scoprire (con un utente normale, non root) quale interfaccia è attiva , come in quale interfaccia ha usato il ping (o qualunque cosa, il ping non è obbligatorio)?

NOTA: usando Ubuntu 11.04 o Fedora 14


2
Le soluzioni seguenti sembrano voler farti dedurre te stesso, il che non sembra giusto. (E le tabelle di routing di tutti sembrano incredibilmente semplici!) Mentre sto cercando l'equivalente di Windows, sembra che "ip route get <ip-address>" ti dirà quale interfaccia verrebbe utilizzata se tu provassi a connetterti a un dato indirizzo IP.
mwardm,

Correlato a Errore del server: trova l'interfaccia per il percorso verso l'host specifico (che è quello che stavo cercando quando sono finito qui).
Wildcard il

Risposte:


48

È possibile utilizzare routeper trovare il percorso predefinito:

$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0     *               255.255.255.0   U     1      0        0 eth0
link-local      *               255.255.0.0     U     1000   0        0 eth0
default         192.168.1.1     0.0.0.0         UG    0      0        0 eth0

La Ifacecolonna nella riga con destinazione defaultindica quale interfaccia viene utilizzata.


1
@Job nel caso in cui abbiamo un indirizzo IP come possiamo trovare quale interfaccia utilizza.
Bionix1441,

1
Questa non dovrebbe essere la risposta accettata. Se iproute è stato utilizzato per definire regole di routing personalizzate routenon può essere utilizzato. @Torgeir ha la risposta giusta.
Joseph Garrone,

1
Questa risposta non è corretta Ad esempio (e dati gli stessi percorsi visualizzati nella risposta), se si esegue il ping 192.168.1.16 (un PC sulla rete locale), la voce che inizia con 192.168.1.0...è il percorso che verrà utilizzato. Ovviamente in questo caso si riferisce allo stesso Iface, ma è solo perché hai un'interfaccia sulla tua macchina.
kdehairy,

1
@Job Anche con google.com, se hai due percorsi ciascuno su un'interfaccia diversa, verrà scelta la corrispondenza con la maschera più lunga (non necessariamente quella predefinita). Tutto ciò che significa predefinito, è che se non viene trovato nessun altro percorso, consultiamo questo :)
kdehairy

1
Ottengo una riga "default ... eth0" e una riga "default ... wlan0". Quindi qual è il vero default?
AstroFloyd,

26

La mia versione che si basa sostanzialmente su questo e questo :

route | grep '^default' | grep -o '[^ ]*$'

E questo, sperimentalmente , per macOS:

route -n get default | grep 'interface:' | grep -o '[^ ]*$'

1
c'è un modo per tradurre questo per OSX?
John Allard,

1
@JohnAllard: fammi sapere se il mio aggiornamento ora fornisce una risposta corretta per macOS.
Ebrahim Byagowi,

non hai bisogno di più tubi, basta usareroute |awk '/^default/{print $NF}'
P ....

Ricevo due righe: "eth0" e "wlan0", quindi ancora non so quale sia attiva ...
AstroFloyd

9

Su sistemi GNU / Linux:

#!/bin/sh

# host we want to "reach"
host=google.com

# get the ip of that host (works with dns and /etc/hosts. In case we get  
# multiple IP addresses, we just want one of them
host_ip=$(getent ahosts "$host" | awk '{print $1; exit}')

# only list the interface used to reach a specific host/IP. We only want the part
# between dev and src (use grep for that)
ip route get "$host_ip" | grep -Po '(?<=(dev )).*(?= src| proto)'

1
Spiegare cosa stanno facendo questi comandi. Inoltre, probabilmente sei abbastanza sicuro qui, perché sai quali sono i tuoi valori, ma, in generale, dovresti citare i riferimenti alle variabili della shell (a meno che tu non abbia una buona ragione per non farlo e sei sicuro di sapere cosa stai facendo ).
G-Man dice "Reinstate Monica" il

1
Fatto, in una certa misura. Solo pubblicato questo perché non sono riuscito a trovare nulla che abbia fatto esattamente questo. Sto usando questo come un fatto personalizzato in un manifest di marionette ...
Torgeir,

La tua risposta è più corretta se si hosttratta di un argomento di input per lo script. Poiché il percorso (e quindi l'interfaccia) potrebbe essere diverso per ips differenti.
kdehairy,

6

La corsa ifconfigti fornirà le informazioni di cui hai bisogno.

L'interfaccia attiva avrà un inet addre mostrerà un record di dati trasmessi, in questo modo:

RX bytes:1930741 (1.8 Mb)  TX bytes:204768 (199.9 Kb)

È inoltre possibile utilizzare il ip addrcomando e le interfacce inattive sarà designato come avendo: NO-CARRIER.


Poiché OP non vuole essere root, forse dovresti dare il percorso completo all'eseguibile?
Tshepang,

Nessuno dei due comandi richiede privilegi elevati.
Jasonwryan,

1
Ubuntu e Arch: entrambi funzionano con privilegi normali (anche se su Ubuntu è / sbin)
jasonwryan

1
@Shadur Non sulla mia installazione di Ubuntu 10.10 e secondo help.ubuntu.com/community/EnvironmentVariables il $ PATH predefinito è/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:
jasonwryan il

2
Questo non aiuterà necessariamente su un sistema con più interfacce, come indicato dal poster. Una risposta migliore sta usando il routecomando, sebbene non sia necessariamente infallibile a causa del routing. La rotta predefinita non deve essere quella per arrivare a Internet, anche se spesso può esserlo.
user1801810

6

Una fodera:

ip route get 8.8.8.8 | sed -n 's/.*dev \([^\ ]*\) table.*/\1/p'


C'è una citazione penzolante lì. Non funziona così
com'è

@Krease Autore ha aggiornato la sua risposta
Vadim Kotov il

5

Ottieni l'interfaccia di rete predefinita in genere utilizzata per instradare verso Internet "rimanente" in opposizione a DMZ, rete privata, host di macchine virtuali ecc. Che di solito vengono instradati in modo esplicito.

$ ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)'
eth0

non è sempre la rotta predefinita che ti porta dove vuoi. Sebbene l'OP molto probabilmente stia utilizzando la route predefinita per accedere a Internet, questa è una generalizzazione e potrebbe non essere sempre vera. Un avvertimento
MelBurslan il

Certo, è solo l'interfaccia di rete predefinita. Se ci sono più connessioni, non si dovrebbe davvero parlare di "connessione a Internet", ma piuttosto dell'interfaccia di rete utilizzata per il routing verso la destinazione esatta.
EugeneP,

Non è necessario utilizzare più pipe / greps,ip -4 route ls |awk '/^default/{print $5}'
P ....

2

Il comando ip route lsfornirà un elenco di percorsi attivi e le loro fonti:

caleburn: ~/ >ip route ls
192.168.10.0/24 dev eth0  proto kernel  scope link  src 192.168.10.7 
default via 192.168.10.254 dev eth0 

1

Usa questo comando:

$ route | grep default | awk '{print $8}'
enp0s3

[root @ linux1 network-script] # route | grep default | awk '{print $ 8}' enp0s3 [root @ linux1 network-script] #
Larry Catt


0

Se la tua macchina ha più interfacce (che presumo), non esiste un'unica interfaccia che verrà utilizzata per la connessione a Internet.

A seconda della destinazione a cui ti stai connettendo, il tuo sistema consulterà la tabella ip (quella mostrata quando esegui il routecomando) per trovare la prossima speranza / router, quando ne troverà una, userà l'interfaccia ad essa associata.

Detto questo, si prega di fare riferimento alla risposta di @ torgeir poiché fa esattamente questo:

  1. Dato un dominio (codificato come google.com, che è l'unico punto negativo nella risposta)
  2. Risolve il suo IP
  3. Consulta la tabella ip per il percorso da utilizzare (e quindi l'interfaccia).
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.