/proc/net/fib_trie
掌握网络拓扑
要简单地打印所有适配器的地址:
$ awk '/32 host/ { print f } {f=$2}' <<< "$(</proc/net/fib_trie)"
127.0.0.1
192.168.0.5
192.168.1.14
要确定这些地址的适配器 (a) 从以下位置查询适配器的目标网络/proc/net/route
,(b)将这些网络与/proc/net/fib_trie
(c) 打印这些网络下列出的相应 /32 主机地址。
再次不python
不幸的是,但是一个相当尴尬的bash
方法:
#!/bin/bash
ft_local=$(awk '$1=="Local:" {flag=1} flag' <<< "$(</proc/net/fib_trie)")
for IF in $(ls /sys/class/net/); do
networks=$(awk '$1=="'$IF'" && $3=="00000000" && $8!="FFFFFFFF" {printf $2 $8 "\n"}' <<< "$(</proc/net/route)" )
for net_hex in $networks; do
net_dec=$(awk '{gsub(/../, "0x& "); printf "%d.%d.%d.%d\n", $4, $3, $2, $1}' <<< $net_hex)
mask_dec=$(awk '{gsub(/../, "0x& "); printf "%d.%d.%d.%d\n", $8, $7, $6, $5}' <<< $net_hex)
awk '/'$net_dec'/{flag=1} /32 host/{flag=0} flag {a=$2} END {print "'$IF':\t" a "\n\t'$mask_dec'\n"}' <<< "$ft_local"
done
done
exit 0
output:
eth0: 192.168.0.5
255.255.255.0
lo: 127.0.0.1
255.0.0.0
wlan0: 192.168.1.14
255.255.255.0
已知限制:
对于与其他主机地址共享网络的主机地址,此方法不能可靠地工作。网络唯一性的丧失使得无法从 fib_trie 确定正确的主机地址,因为这些地址的顺序不一定与路由网络的顺序匹配。
话虽如此,我不确定为什么您首先想要属于同一网络的多个主机地址。因此,在大多数用例中,这种方法应该可以正常工作。