查找设备的IPv4广播地址

我需要使用shell脚本来确定设备的IPv4广播地址(如果有的话)。 如果有几个,请select一个(例如首先按/ sbin / ip命令)。

我有一个解决scheme,但我不喜欢它,因为它作出/ 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 /中没有东西可以简单地使用猫吗? 为什么不?

我需要该解决scheme可靠地工作,至less在整个Debian / Ubuntu Linux系列中。


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

  • 我可以期望跨越架构和Linux风格的ipifconfig的事)具有相同的输出格式,这样我可以可靠地parsing,例如从它的接口的IPv4广播地址?
  • 如果没有:是否有另一种方式以更可预测的方式输出接口的IPv4广播地址?
  • 为什么没有/ proc / sys / net / ipv4 / conf / eth0 / {地址,掩码,广播},我可以简单地cat

我可以期望跨越体系结构和Linux风格的IP(ifconfig的事)具有相同的输出格式,这样我可以可靠地parsing

我不会。 尽pipeifconfig已经死了 ,所以不应该改变太多,但是发行版还是会有一些细微的变化来保持这个被弃用的工具的某些function,因为很多人似乎都不想学习如何切换。 ip的输出真的不是伟大的parsing国际海事组织。

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

如果我是你,我可能会考虑安装和使用像facter这样的工具来为你做这项工作。 我不认为它直接给你的广播地址,但它应该是微不足道的地址/networking掩码和执行math来获得广播地址。

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

iproute2通过NETLINK套接字连接到内核。 Ifconfig使用不推荐使用的ioctl方法 。 如果你想获得正确的信息而不需要获取某些用户空间程序的输出或安装某些东西,那么你需要使用其中的一个API。

如果你想要,你可以做一些像strace ip addr show或者strace ifconfig这样的工具来查看这些工具正在做什么来检索这些值的输出。

我不知道为什么的历史,但这不是这个网站的问题。 这是它的方式。 如果你想“为什么”去和内核开发者交谈。

对于Redhat,广播IP地址是使用ipcalc – AFAIK自动计算的,没有包含它的configuration文件。 它也可能有所帮助: 红帽文档 – 接口configuration文件

你考虑过路由数据吗? 这个脚本应该返回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默认情况下可能不安装。

awk是你的朋友。

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