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


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.


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 '[^ ]*$'

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)'

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.


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'


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

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 

1

Use o comando:

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

[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).
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.