Como descobrir qual interface eu estou usando para conectar-me à Internet?

48

Eu tenho eth0 e wlan0 de acordo com ifconfig e eu posso ping google.com. Como posso descobrir (com um usuário normal, não root) qual interface está ativa , como em qual interface o ping (ou o que seja, o ping não é obrigatório) usa?

NOTA: usando o Ubuntu 11.04 ou Fedora 14

LanceBaynes
fonte
2
As soluções abaixo parecem querer que você faça a dedução a si mesmo, o que não parece correto. (E tabelas de roteamento de todos parecem incrivelmente simples!) Enquanto eu estou procurando o equivalente do Windows, parece que "ip route get <ip-address>" irá dizer-lhe qual a interface iria ser utilizado se estivesse a tentar se conectar a um dado endereço IP.
mwardm
Relacionado à falha do servidor: Encontre a interface para a rota para um host específico (que é o que eu estava procurando quando acabei aqui).
Wildcard

Respostas:

48

Você pode usar routepara encontrar sua rota padrão:

$ 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

A Ifacecoluna na linha com destino defaultinforma qual interface é usada.

Trabalho
fonte
1
@ Job, no caso de termos um endereço IP, como podemos encontrar qual interface ele usa.
Bionix1441
1
Esta não deve ser a resposta aceita. Se o iproute tiver sido usado para definir regras de roteamento personalizadas, routenão poderá ser usado. @Torgeir tem a resposta certa.
Joseph Garrone
1
Esta resposta não está correta. Por exemplo (e dadas as mesmas rotas exibidas na resposta), se você executar ping em 192.168.1.16 (um PC na sua rede local), a entrada que começa com 192.168.1.0...é a rota que será usada. É claro que, neste caso, refere-se ao mesmo Iface, mas isso é apenas porque você tem uma interface em sua máquina.
kdehairy 25/04
1
@Job Mesmo no google.com, se você tiver duas rotas cada uma em uma interface diferente, a correspondência com a máscara mais longa será selecionada (não necessariamente o padrão). Tudo o que o padrão significa é que, se nenhuma outra rota for encontrada, vamos consultar esta :)
kdehairy
1
Eu recebo uma linha "padrão ... eth0" e uma linha "padrão ... wlan0". Então, qual é o padrão real?
AstroFloyd
26

Minha versão, que é basicamente baseada nisso e no seguinte :

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

E isso, experimentalmente , para o macOS:

route -n get default | grep 'interface:' | grep -o '[^ ]*$'
Ebrahim Byagowi
fonte
1
existe uma maneira de você traduzir isso para o OSX?
John Allard
1
@ JohnAllard: deixe-me saber se minha atualização agora fornece a resposta correta para o macOS.
Ebrahim Byagowi
você não precisa de vários tubos, basta usarroute |awk '/^default/{print $NF}'
P ....
Eu recebo duas linhas: "eth0" e "wlan0", então ainda não sei qual está ativo ...
AstroFloyd em 10/07
9

Nos 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
fonte
1
Por favor, explique o que esses comandos estão fazendo. Além disso, você provavelmente está bem seguro aqui, porque sabe quais são seus valores, mas, geralmente, deve citar referências de variáveis ​​de shell (a menos que tenha um bom motivo para não fazê-lo) e com certeza sabe o que está fazendo )
G-Man diz 'Reinstate Monica
1
Feito, até certo ponto. Só postei isso porque não consegui encontrar nada que fizesse exatamente isso. Estou usando isso como um fato personalizado em um manifesto de marionetes ...
Torgeir
Sua resposta está mais correta se hostfor um argumento de entrada para o script. Como a rota (e, portanto, a interface) pode ser diferente para diferentes ips.
kdehairy 25/04
6

A corrida ifconfigfornecerá as informações necessárias.

A interface ativa terá um inet addre mostrará um registro dos dados transmitidos, assim:

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

Você também pode usar o ip addrcomando e quaisquer interfaces inativas será designado como tendo: NO-CARRIER.

jasonwryan
fonte
Como o OP não quer ser root, talvez você deva dar o caminho completo para o executável?
tshepang
Nenhum dos comandos requer privilégios elevados.
jasonwryan
1
Ubuntu e Arch: sendo executados com privilégios normais (embora no Ubuntu é / sbin)
jasonwryan
1
@Shadur Não na minha instalação do Ubuntu 10.10 e de acordo com help.ubuntu.com/community/EnvironmentVariables o padrão $ PATH é/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:
jasonwryan
2
Isso não necessariamente ajudará em um sistema com várias interfaces, como o pôster indicou. Uma resposta melhor é usar o routecomando, mas isso não seria necessariamente infalível devido ao roteamento. A rota padrão não precisa ser a única a chegar à Internet, por mais frequente que seja.
user1801810
6

Um forro:

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

h0tw1r3
fonte
Há uma citação pendente lá. Não funciona em tudo como está
Krease
@Krease O autor atualizou sua resposta
Vadim Kotov
5

Obtenha a interface de rede padrão normalmente usada para rotear para a Internet "restante", ao contrário de DMZ, rede privada, host de VM etc., que geralmente são roteados explicitamente.

$ ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)'
eth0
EugeneP
fonte
nem sempre é a rota padrão que o leva aonde você deseja. Embora o OP provavelmente esteja usando a rota padrão para acessar a Internet, essa é uma generalização e pode nem sempre ser verdadeira. Uma palavra de cautela
MelBurslan
Claro, é apenas a interface de rede padrão. Se houver várias conexões, não se deve falar sobre "conectar-se à Internet", mas sobre a interface de rede usada para rotear para o destino exato.
precisa saber é o seguinte
Você não precisa usar vários pipes / greps,ip -4 route ls |awk '/^default/{print $5}'
P ....
2

O comando ip route lsfornecerá uma lista de rotas ativas e suas fontes:

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
fonte
1

Use o comando:

[root@linux1 network-scripts]# route|grep default | awk '{print $8}'
enp0s3
Larry Catt
fonte
[scripts de rede root @ linux1] # route | grep padrão | awk '{print $ 8}' enp0s3 [scripts de rede root @ linux1] #
Larry Catt
0

Se sua máquina possui várias interfaces (o que eu assumo), não há uma única interface que será usada para conectar-se à Internet.

Dependendo do destino ao qual você está se conectando, seu sistema consultará a tabela ip (a mostrada quando você routecomanda) para encontrar a próxima esperança / roteador; quando encontrar um, usará a interface associada a ele.

Dito isto, consulte a resposta do @ torgeir, pois faz exatamente isso:

  1. Dado um domínio (codificado como google.com, que é o único ponto ruim na resposta)
  2. Resolve seu ip
  3. Consulta a tabela ip para a rota a ser usada (e, portanto, a interface).
kdehairy
fonte