像`ip`这样的工具的输出是否应该被解析?

4
例如,Ubuntu中的lxc-start-ephemeral bash脚本会执行以下操作来检测正在启动的容器的IP地址:
# Grab all the public globally routed IPv4 and IPv6 addresses
(sudo ip netns exec $NAME ip -4 addr show scope global && \
 sudo ip netns exec $NAME ip -6 addr show scope global) | grep inet | while read line; do
    ip=$(echo $line | awk '{print $2}' | cut -d '/' -f1)
    echo "$ip"
done

个人而言,我不是很喜欢这种方法,因为它需要大量地处理字符串和输出。有没有编程API可以访问相同的信息(不一定在bash中),或者总是通过像ip这样的工具来进行外壳操作,并希望您的解析不会在其他版本的相同工具中出问题,是“正确的方法”呢?

3个回答

2

还要考虑使用 /sys (sysfs),例如 /sys/class/net/<设备名称>/...


我有点困惑,您是说接口的IP地址在那里吗?因为我查找了一下,不幸的是没有看到它。 - Ulrar

1
在shell脚本中,您往往通过解析文本来获取数据。这主要是因为shell代码只能真正操作字符串,而且文本比二进制表示更具可移植性。
然而,作为一条规则,有UI命令和API命令,shell脚本应该使用后者而不是前者。例如,您应该调用stat而不是尝试解析ls -l输出。或者可能有一个文件在/proc中包含您想要的信息,因此您根本不需要运行命令-但是该文件中的数据仍将以文本形式存在。
所以,是的-当您编写shell脚本时,基本上是为了解析所有内容的文本。

0

使用Proc文件系统

如果您只是想以不同的方式解析IP地址,可以直接解析/proc/net/arp。您仍然需要解析出所需的数据,但数据的格式应该只会在Linux内核更改Proc文件系统时才发生变化。对于大多数目的来说,这似乎足够稳定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接