查找设备的 IPv4 广播地址

查找设备的 IPv4 广播地址

我需要使用 shell 脚本确定设备(如果有)的 IPv4 广播地址。如果有多个,请选择一个(例如,按照 /sbin/ip 的顺序选择第一个)。

我有一个解决方案,但我不喜欢它,因为它对 /sbin/ip 的输出格式做出了假设,而且我不知道该输出格式在各个系统之间的稳定性如何。

DEV=eth0
BROADCAST=`ip address show $DEV | grep 'inet .* brd ' | head -1 | sed -e 's/^.* brd \([0-9\.]*\) .*$/\1/'`
echo $BROADCAST

/proc/ 或 /sys/ 中没有我可以简单 cat 的东西吗?为什么?

我需要一个能够可靠运行的解决方案,至少在整个 Debian/Ubuntu Linux 系列中。


编辑:这不是关于 sed/awk/grep 魔法的问题。问题是:

  • 我是否可以期望ipifconfig就此而言)跨架构和 Linux 版本具有相同的输出格式,以便我可以从中可靠地解析例如接口的 IPv4 广播地址?
  • 如果没有:是否有其他方法以更可预测的方式输出接口的 IPv4 广播地址?
  • 为什么没有 /proc/sys/net/ipv4/conf/eth0/{address,mask,broadcast} 可以让我简单查找cat

答案1

我是否可以期望跨架构和 Linux 版本的 ip(就此而言是 ifconfig)具有相同的输出格式,以便我可以可靠地解析

我不会。不过ifconfig 已死因此不应该有太大变化,发行版已经做了一些小改动,以保持这个弃用的工具有一定的功能,因为很多人似乎不想学习如何进行切换。在我看来,的输出ip真的不适合解析。

如果没有:是否有其他方法以更可预测的方式输出接口的 IPv4 广播地址?

如果我是你,我可能会考虑安装和使用类似的工具因素为您完成工作。我认为它不会直接为您提供广播地址,但获取地址/网络掩码并执行数学运算以获取广播地址应该很简单。

为什么没有 /proc/sys/net/...

iproute2 通过网联套接字。Ifconfig 使用ioctl 方法已弃用。如果您想要获取正确的信息,而无需抓取某些用户空间程序的输出或安装某些东西,则需要使用其中一个 API。

如果您愿意,您可以执行类似的操作strace ip addr showstrace ifconfig查看这些工具为检索值所执行的操作的输出。

我不知道为什么会这样,但这不是这个网站要问的问题。事情就是这样。如果你想知道“为什么”,那就去找内核开发人员谈谈。

答案2

对于 Redhat,广播 IP 地址是使用以下方法自动计算的ipcalc- 据我所知,没有包含它的配置文件。它也可能有帮助:Red Hat 文档 - 接口配置文件

答案3

您是否考虑过路由数据。此脚本应返回 Internet 接口的广播地址:

ipcalc $(route | awk '$2 ~ /\*/ {print $1 "/" $3}') | \
    awk '/^Broadcast/ {print $2}'

或者这个使用ip route可能返回多个地址。

for x in $(ip route show | awk '/^[1-9]/ {print $1}'); do 
    ipcalc $x | awk '/^Broadcast/ {print $2}'; 
done

ipcalc默认情况下可能未安装。

答案4

awk是你的朋友。

ip a s dev $DEV | awk '/inet / {print $4}'

相关内容