我需要使用 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 魔法的问题。问题是:
- 我是否可以期望
ip
(ifconfig
就此而言)跨架构和 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 show
或strace 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}'