如何找出我用于连接互联网的接口?


47

根据ifconfig我有eth0和wlan0,我可以ping google.com。我如何找出(对于普通用户而不是root用户)哪个接口处于活动状态,例如,ping(或强制ping不是强制性的)使用了哪个接口?

注意:使用Ubuntu 11.04或Fedora 14


2
以下解决方案似乎希望您进行推断,但这似乎不正确。(而且每个人的路由表看起来都非常简单!)当我在寻找Windows的等效表时,看来“ ip route get <ip-address>”将告诉您如果您尝试连接到哪个接口,使用哪个接口指定的IP地址。
mwardm '16

与服务器故障有关:查找到特定主机的路由的接口(这是我在这里总结时要寻找的)。
通配符

Answers:


48

您可以route用来查找默认路线:

$ 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

Iface目标行中的列default告诉您使用哪个接口。


1
@Job,如果我们有一个IP地址,我们如何找到它使用的接口。
Bionix1441

1
这不应是公认的答案。如果已使用iproute定义自定义路由规则,route则无法使用。@Torgeir有一个明智的答案。
Joseph Garrone

1
这个答案是不正确的。例如(如果给定的路由与答案中显示的相同),如果您ping 192.168.1.16(本地网络上的一台PC),则以开头的条目192.168.1.0...就是将要使用的路由。当然,在这种情况下,它指的是相同的Iface,但这仅仅是因为您的计算机上只有一个接口。
kdehairy

1
@Job即使使用google.com,如果您在不同的界面上都有两条路由,则会选择带有较长掩码的匹配项(不一定是默认值)。默认值的全部意思是,如果找不到其他路由,让我们咨询一下 :)
kdehairy

1
我得到一行“ default ... eth0”和一行“ default ... wlan0”。那么真正的默认值是哪一个呢?
AstroFloyd

25

我的版本,这基本上是根据这个这个

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

而对于macOS,这是实验性的

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

1
有没有一种方法可以将其翻译为OSX?
John Allard

1
@JohnAllard:让我知道我的更新现在是否为macOS给出了正确答案。
伊布

您不需要多个管道,只需使用route |awk '/^default/{print $NF}'
P ....

我得到两行:“ eth0”和“ wlan0”,所以我仍然不知道哪个是活动的……
AstroFloyd

9

在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
请解释这些命令的作用。另外,您在这里可能很安全,因为您知道自己的值是什么,但是通常应该引用shell变量引用(除非您有充分的理由不这样做,并且您确定自己知道自己在做什么) )。
G-Man说'Resstate Monica''2014年

1
做到一定程度。仅发布此内容是因为我找不到能做到这一点的任何东西。我正在用这个作为人偶清单中的自定义事实...
Torgeir 2014年

如果将host用作脚本的输入参数,则答案会更正确。由于路由(以及接口)对于不同的ip可能会有所不同。
kdehairy

6

运行ifconfig将为您提供所需的信息。

活动界面将具有inet addr和,并显示已传输数据的记录,如下所示:

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

您也可以使用该ip addr命令,任何不活动的接口都将被指定为具有:NO-CARRIER


由于OP不想成为root用户,也许您应该提供可执行文件的完整路径?
tshepang 2011年

这两个命令都不需要提升的特权。
jasonwryan 2011年

1
Ubuntu和Arch:都以普通权限运行(尽管在Ubuntu上是/ sbin)
jasonwryan 2011年

1
@Shadur不在我安装的Ubuntu 10.10上,根据help.ubuntu.com/community/EnvironmentVariables,默认$ PATH为/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:
jasonwryan 2011年

2
正如发帖人指出的那样,这不一定会对具有多个接口的系统有所帮助。更好的答案是使用route命令,尽管由于路由选择,这不一定是万无一失的。默认路由不一定是到达Internet的路由,尽管它经常是这样。
user1801810

6

一班轮:

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


那里有个悬空的报价。根本不起作用
Krease

@Krease作者更新了他的答案
Vadim Kotov

5

获取默认网络接口,该接口通常用于路由到与通常显式路由的DMZ,专用网络,VM主机等相反的“剩余” Internet。

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

它并不总是将您带到所需地点的默认路线。尽管OP最有可能使用默认路由来访问Internet,但这是一个概括,可能并不总是成立。一个忠告
MelBurslan

当然,这只是默认的网络接口。如果存在多个连接,则不应真正谈论“连接到互联网”,而应该谈论用于路由到确切目的地的网络接口。
EugeneP '16

您不需要使用多个管道/手柄,ip -4 route ls |awk '/^default/{print $5}'
P ....

2

该命令ip route ls将给出活动路由及其来源的列表:

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

使用命令:

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

[root @ linux1 network-scripts]#route | grep默认值| awk'{print $ 8}'enp0s3 [root @ linux1 network-scripts]#
Larry Catt


0

如果您的计算机具有多个接口(我假设是这样),则没有一个接口可用于连接到Internet。

根据要连接的目的地,系统将查询ip表(执行route命令时显示的地址)以查找下一个希望/路由器,当找到希望/路由器时,它将使用与其关联的接口。

也就是说,请参考@torgeir的答案,因为它确实做到了:

  1. 给定一个域(硬编码为google.com,这是答案中唯一的缺点)
  2. 解决它的ip
  3. 请查阅ip表以了解要使用的路由(以及接口)。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.