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)
我有ifconfig和ip可用的命令,但是解析它们的输出有点棘手,因为 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,以防万一。
使用“-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"行首先出现(由于之前的排序)。