检查接口 eth0 是否已启动(已配置)

use*_*963 39 linux networking

我需要检查一个脚本,是否 eth0已配置。如果是这样,脚本将不执行任何操作。否则它会启动wlan0。(我不希望同时eth0wlan0在同一时间待涨)。

什么是最简单的检查方法,是否eth0已经启动?

我正在使用 Debian Wheezy

澄清:

我不仅要检查电缆eth0是否已插入,还要检查接口是否已配置(即它设置了静态 IP,或者它已收到 DHCP IP)。如果电缆已插入,但未eth0正确配置,我想开始wlan0

cuo*_*glm 56

您可以通过多种方式做到这一点。这里有一个例子:

$ cat /sys/class/net/eth0/operstate
up
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,这并不能保证接口已完全配置。您可以使用 cat `/sys/class/net/eth0/carrier` 来检查信号,但它可能还没有 DHCP 租用等。 (5认同)

小智 9

ip a show ethX up
Run Code Online (Sandbox Code Playgroud)

如果没有显示,则您的界面已关闭


mik*_*erv 5

ip a | grep -Eq ': eth0:.*state UP' || _do_your_thing 
Run Code Online (Sandbox Code Playgroud)

因此,我们grep在这里使用了无处不在的ip工具,stdout用于包含我们感兴趣的界面和短语“状态 UP”的行(感谢 @Lekensteyn 指出需要比仅仅更具体一点的需求UP)。我们使用参数a作为address,这应该足以获得系统中所有已配置网卡的列表。

使用的好处之一 ip可能是它真的应该在任何地方都可用——例如,这是我通常配置我的 Android 手机的网络设备的方式。

:colons用于避免部分匹配-这样我们保证了比赛eth0,而不是否则可能someothereth0eth007

感谢 @RaphaelAhrens 推动我走向正确并解释我的解决方案。

编辑:

要处理当前的要求,您可以:

ip a | sed -rn '/: '"$if"':.*state UP/{N;N;s/.*inet (\S*).*/\1/p}'
Run Code Online (Sandbox Code Playgroud)

如果您的目标$ifUP、已插入并且有一个CIDR ip 地址,则上面只会打印一个 CIDR ip 地址。对于 ipv6,解决方案同样简单,只需稍作修改。

如果你不喜欢,sed你可以用另一个获得类似的结果,|pipe ... grep-A在第一个中添加一个上下文选项grep- 但我喜欢sed.

  • 这是不够的。如果设备已启动,但未连接电缆,则输出还包含“UP”:“2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000”。您还可以指定设备以避免误报:`ip addr show dev eth0`。 (5认同)