¿Cómo averiguar qué interfaz estoy usando para conectarme a Internet?

48

Tengo eth0 y wlan0 según ifconfig y puedo ping google.com. ¿Cómo puedo averiguar (con un usuario normal, no root) qué interfaz está activa , como en qué interfaz usó el ping (o lo que sea, ping no es obligatorio)?

NOTA: usando Ubuntu 11.04 o Fedora 14

LanceBaynes
fuente
2
Las siguientes soluciones parecen querer que se infiera usted mismo, lo que no parece correcto. (¡Y las tablas de enrutamiento de todos se ven increíblemente sencillas!) Mientras busco el equivalente de Windows, parece que "ip route get <ip-address>" le dirá qué interfaz se usaría si intentara conectarse a un Dirección IP dada.
mwardm
Relacionado con la falla del servidor: busque la interfaz para la ruta a un host específico (que es lo que estaba buscando cuando terminé aquí).
Comodín el

Respuestas:

48

Puede usar routepara encontrar su ruta predeterminada:

$ 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 Ifacecolumna en la línea con el destino defaultle indica qué interfaz se utiliza.

Trabajo
fuente
1
@Job en caso de que tengamos una dirección IP, ¿cómo podemos encontrar qué interfaz utiliza?
Bionix1441
1
Esta no debería ser la respuesta aceptada. Si iproute se ha utilizado para definir reglas de enrutamiento personalizadas, routeno se pueden utilizar. @Torgeir tiene la respuesta correcta.
Joseph Garrone
1
Esta respuesta no es correcta. Por ejemplo (y con las mismas rutas que se muestran en la respuesta), si hace ping a 192.168.1.16 (una PC en su red local), la entrada que comienza 192.168.1.0...es la ruta que se utilizará. Por supuesto, en este caso se refiere al mismo Iface, pero eso es solo porque tiene una interfaz en su máquina.
kdehairy
1
@ Job Incluso con google.com, si tiene dos rutas cada una en una interfaz diferente, se seleccionará la coincidencia con la máscara más larga (no necesariamente la predeterminada). Todo lo que significa por defecto es que si no se encuentra otra ruta, consultemos esta :) :)
kdehairy
1
Me sale una línea "predeterminada ... eth0" y una línea "predeterminada ... wlan0". Entonces, ¿cuál es el valor predeterminado real?
AstroFloyd
26

Mi versión que se basa básicamente en esto y esto :

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

Y esto, experimentalmente , para macOS:

route -n get default | grep 'interface:' | grep -o '[^ ]*$'
Ebrahim Byagowi
fuente
1
¿Hay alguna manera de traducir esto para OSX?
John Allard
1
@JohnAllard: avíseme si mi actualización ahora da la respuesta correcta allí para macOS.
Ebrahim Byagowi
no necesita múltiples tuberías, solo useroute |awk '/^default/{print $NF}'
P ....
Recibo dos líneas: "eth0" y "wlan0", así que todavía no sé cuál está activo ...
AstroFloyd
9

En sistemas 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)'
Torgeir
fuente
1
Por favor explique qué están haciendo estos comandos. Además, probablemente esté bastante seguro aquí, porque sabe cuáles son sus valores, pero, en general, debe citar referencias de variables de shell (a menos que tenga una buena razón para no hacerlo, y está seguro de saber lo que está haciendo) )
G-Man dice 'Restablecer a Monica' el
1
Hecho, hasta cierto punto. Solo publiqué esto porque no pude encontrar nada que hiciera exactamente esto. Estoy usando esto como un hecho personalizado en un manifiesto de títeres ...
Torgeir
Su respuesta es más correcta si hostes un argumento de entrada para el script. Como la ruta (y por lo tanto la interfaz) puede ser diferente para diferentes ips.
kdehairy
6

Correr ifconfigte dará la información que necesitas.

La interfaz activa tendrá un inet addry mostrará un registro de los datos transmitidos, así:

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

También puede utilizar el ip addrmando y las interfaces inactivas serán designados por tener: NO-CARRIER.

jasonwryan
fuente
Dado que OP no quiere ser root, ¿tal vez debería dar la ruta completa al ejecutable?
tshepang
Ninguno de los comandos requiere privilegios elevados.
jasonwryan
1
Ubuntu y Arch: ambos se ejecutan con privilegios normales (aunque en Ubuntu es / sbin)
jasonwryan
1
@Shadur No en mi instalación de Ubuntu 10.10 y de acuerdo con help.ubuntu.com/community/EnvironmentVariables el valor predeterminado de $ PATH es/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:
jasonwryan
2
Esto no necesariamente ayudará en un sistema con múltiples interfaces, como el cartel indica que tiene. Una mejor respuesta es usar el routecomando, aunque eso no sería necesariamente infalible debido al enrutamiento. La ruta predeterminada no tiene por qué ser la que lleva a Internet, aunque a menudo puede ser.
user1801810
6

Un trazador de líneas:

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

h0tw1r3
fuente
Hay una cita colgante allí. No funciona en absoluto como está
Krease
@Krease El autor actualizó su respuesta
Vadim Kotov
5

Obtenga la interfaz de red predeterminada que normalmente se usa para enrutar a Internet "restante" en lugar de DMZ, red privada, host de máquina virtual, etc., que generalmente se enruta explícitamente.

$ ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)'
eth0
EugeneP
fuente
no siempre es la ruta predeterminada que lo lleva a donde desea. Aunque lo más probable es que el OP esté usando la ruta predeterminada para llegar a Internet, esta es una generalización y puede que no siempre sea así. Una palabra de precaución
MelBurslan
Claro, solo es la interfaz de red predeterminada. Si hay varias conexiones, no se debe hablar realmente de "conectarse a Internet", sino de la interfaz de red utilizada para enrutar al destino exacto.
EugeneP
No necesita usar múltiples tuberías / greps,ip -4 route ls |awk '/^default/{print $5}'
P ....
2

El comando ip route lsdará una lista de rutas activas y sus fuentes:

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 
Shadur
fuente
1

Usa este comando:

$ route | grep default | awk '{print $8}'
enp0s3
Larry Catt
fuente
[root @ linux1 scripts de red] # route | grep default | awk '{print $ 8}' enp0s3 [root @ linux1 network-scripts] #
Larry Catt
0

Si su máquina tiene varias interfaces (lo que supongo), no hay una interfaz que se utilizará para conectarse a Internet.

Dependiendo del destino al que se está conectando, su sistema consultará la tabla de IP (la que se muestra cuando hace el routecomando) para encontrar la próxima esperanza / enrutador, cuando encuentre uno, usará la interfaz asociada con él.

Dicho esto, consulte la respuesta de @ torgeir, ya que hace exactamente eso:

  1. Dado un dominio (codificado como google.com, que es el único punto negativo en la respuesta)
  2. Resuelve es ip
  3. Consulta la tabla ip para la ruta a utilizar (y, por lo tanto, la interfaz).
kdehairy
fuente