我需要提取两组 IP 的网络掩码并以 CIDR 格式打印到屏幕上。考虑使用 shell 或 tcl 来做到这一点。猜猜这里的主要问题是将十六进制网络掩码转换为 CIDR 格式。
尝试了一些不同的东西,但似乎没有按预期工作。
我们可以编写一个函数来遍历掩码的数字,将每个数字中设置的位数相加。符合 CIDR 的网络掩码中只有五个合法数字。
Bash 有${variable:offset}
和${variable:offset:length}
替换来获取变量的子字符串,所以很容易一次挑出一个数字。
function bitCountForMask {
local -i count=0
local mask="${1##0x}"
local digit
while [ "$mask" != "" ]; do
digit="${mask:0:1}"
mask="${mask:1}"
case "$digit" in
[fF]) count=count+4 ;;
[eE]) count=count+3 ;;
[cC]) count=count+2 ;;
8) count=count+1 ;;
0) ;;
*)
echo 1>&2 "error: illegal digit $digit in netmask"
return 1
;;
esac
done
echo $count
}
刚刚发现有一个 tcl 包实用程序允许我们这样做。
package require ip
::ip::maskToLength <hex_netmask>
This will output the CIDR format of the netmask.