创建映射 network_iface_name <--> IPv4 地址

Bor*_*jaX 4 networking bash ip network-interface

我想实现一个 bash 脚本,该脚本在我的计算机中的网卡(或接口)名称与其 IP 地址(如果可能,采用 CIDR 格式)之间创建映射。

目标是拥有一个类似关联数组的东西,或者一个看起来像这样的文件:

lo: "127.0.0.1/8"
eth0: "192.168.1.123/24"
br-priv: ""      # <-- No IP assigned
wlan0: "10.42.0.10/24"
Run Code Online (Sandbox Code Playgroud)

我有ifconfigip可用的命令,但是解析它们的输出有点棘手,因为 IP 地址和接口的名称不会出现在同一行中,所以我必须找到接口 IP 地址,然后回滚才能找到网络的名称,反之亦然。

有没有其他方法可以找到我的接口 IP 地址?

我在下面有所有接口名称(作为目录名称) /sys/class/net/

root@borrajax:~# ls /sys/class/net/
br-priv/   eth0/    lo/    mon0/   wlan0/
Run Code Online (Sandbox Code Playgroud)

但是我一直无法在这些目录中找到他们的 IP。这样做会很棒,因为我可以遍历目录,检索目录的名称,然后从其他文件中读取 IP。

这旨在在运行OpenWRT的嵌入式系统中运行,但基于 Debian 的系统的解决方案可能是合适的。我bash的版本是 4.2.28,以防万一。

jof*_*fel 5

使用“-o”选项ip

ip  -o addr  | sed -e 's/^[0-9]: \([^ ]*\).*inet \([^ \t]*\).*/\1: "\2"/;t;s/^[0-9]*: \([^ :]*\).*/\1: ""/g' | sort -r | sort -u -t: -k1,1
Run Code Online (Sandbox Code Playgroud)

输出应该是你的情况:

br-priv: "" 
eth0: "192.168.1.123/24"
lo: "127.0.0.1/8"
wlan0: "10.42.0.10/24"
Run Code Online (Sandbox Code Playgroud)

该命令仅打印每个网络设备一个 IPv4(可以在同一接口上配置多个 IP 地址)。


说明:

sed表达

s/^[0-9]: \([^ ]*\).*inet \([^ \t]*\).*/\1: "\2"/;
Run Code Online (Sandbox Code Playgroud)

替换1: lo inet 127.0.0.1/8 brd 255 [...]lo: "127.0.0.1/8"

t;
Run Code Online (Sandbox Code Playgroud)

如果可以这样做,则跳转到结尾(=找到 IPv4 地址),否则:

s/^[0-9]*: \([^ :]*\).*/\1: ""/
Run Code Online (Sandbox Code Playgroud)

替换没有 IPv4 地址的行,例如1: lo inet6 ::1/128 [...]lo: "".

所有行都会自动打印出来(无-n标志)。

该命令sort -r现在对行进行反向排序。带有 IPv4 地址(例如lo: "127.0.0.1/8")的行在所有情况下都位于不带(lo: "")的行之前。

该命令sort -u -t: -k1,1对第一个字段应用唯一排序(接口名称,分隔符设置为:)。在我们的示例中,只有 "lo: "127.0.0.1/8"行首先出现(由于之前的排序)。