如何查找网络接口名称

问题描述 投票:0回答:7

我有一个可以在各种不同的 Ubuntu Linux 机器上运行的 bash 脚本。它的工作是找出本地主机的 LAN IPv4 地址。

脚本正在使用

ip addr show eth0 | sed -n '/inet /{s/^.*inet \([0-9.]\+\).*$/\1/;p}'

这很好,但有些机器由于某种原因使用 eth1 而不是 eth0。我希望能够发现 LAN iface 名称,因此我可以在这里替换它而不是 eth0。

当然,如果你能想出一个不同的 oneliner 来做同样的事情,那就太好了。

linux bash sed ip
7个回答
24
投票

主网卡通常会有默认路由。所以:

ip -o -4 route show to default

网卡:

ip -o -4 route show to default | awk '{print $5}'

网关:

ip -o -4 route show to default | awk '{print $3}'

与 ifconfig 不同,ip 具有一致且可解析的输出。它仅适用于Linux;它不适用于其他 Unixen。


14
投票

不确定这是否有帮助,但似乎

ip route get
将显示它使用哪个接口连接到远程主机。

ubuntu@ip-10-40-24-21:/nail/srv/elasticsearch$ ip route get 8.8.8.8
8.8.8.8 via <gateway address> dev eth0  src <eth0 IP Address>

当然你可以在 shell 脚本中使用类似的东西来自动化它,

ip route get 8.8.8.8 | awk '{ print $NF; exit }'

6
投票

最近,systemd/udev 已自动开始为所有本地以太网、WLAN 和 WWAN 接口分配接口名称,这是我们都习惯的。这与传统的接口命名方案(“eth0”、“eth1”、“wlan0”等)不同。现在我们必须先检查本地接口名称是什么,然后才能使用它,而之前我们是这样的非常准确地猜测“eth0”是正确的名称。您要求的是网络名称..这是一个解决问题的小脚本

  1. 使用“ip route get 8.8.8.8”找出哪个活动接口具有到互联网的路由(或当前正在使用) 输出应如下所示:

    8.8.4.4 通过 10.10.1.1 dev enp0s3 src 10.10.1.118 缓存

  2. 使用 awk 打印 Interface NAME 的第 5 个文本块

    ]# ip 路由获取 8.8.8.8 | awk -- '{打印 $5}' 输出:enp0s3

  3. 使用 awk 打印接口地址的第 7 个文本块

    ]# ip 路由获取 8.8.8.8 | awk -- '{打印 $7}' 输出:10.10.1.118


3
投票

搜索字符串

inet
brd
(用于广播)怎么样?那会给你:

ip addr show|egrep '^ *inet'|grep brd|awk -- '{ print $2; }'|sed -e 's:/[0-9]*$::'

请注意,我使用的命令超出了必要的数量;您可能可以使用

sed
和更复杂的正则表达式来实现相同的目标,但我更喜欢一个命令,它可以清楚地表明我通过哪些步骤得出结果。

如果你想在单个命令中运行它,我建议尝试

awk

ip addr show|awk -- '$1 == "inet" && $3 == "brd"  { split($2,a,"/"); print a[1]; }'

sed
版本长不了多少,但更具可读性。

+1 可读性更好一些:

ip addr show | awk '$1 == "inet" && $3 == "brd" { sub (/\/.*/,""); print $2 }'

3
投票

不管你信不信,没有标准的、简单的方法来获取这些信息。没有标准的“给我当前的 IP 和接口名称”命令。 ifconfig返回的信息甚至没有标准格式。

我建议放弃纯 shell,而使用 Python 这样的脚本语言,你可以在其中执行此操作:

import socket socket.gethostbyname(socket.gethostname())

但它在大多数 Linux 系统上不起作用,因为 
/etc/host

文件中通常有一个条目指向

127.0.0.1
(环回地址)。
Perl
也有同样的问题。 您牢牢掌握了所涉及的脚本,并且您已经看到了问题。我唯一可以推荐的就是在每台要运行它的机器上测试它,看看会弹出什么结果。由于网络的设置方式以及每个位置可能命名接口的方式,不会有一种适用于所有操作系统的通用单线,甚至不会适用于同一操作系统上的不同系统。


1
投票

ip addr show | grep "inet 10.67.5." \ | sed -n '/inet /{s/^.*inet \([0-9.]\+\).*$/\1/;p}'



1
投票

for i in $( ifconfig | grep 'ppp' | awk '{print $1}' ); do printf "$i "; ## Or echo done

结果:

ppp0 ppp1 ppp2

2)这个打印接口名称和IP

declare -a IPADDR index=0 for i in $( ifconfig | grep 'inet addr' | awk '{print $2}'| sed 's#addr:##g' ); do IPADDR[$index]=$i let "index += 1" done index=0 for i in $( ifconfig | grep 'ppp' | awk '{print $1}' ); do echo $i let "index += 1" done

结果:

ppp0 地址:IP

ppp1 地址:IP

ppp2 地址:IP

© www.soinside.com 2019 - 2024. All rights reserved.