背景
當無法使用 ipcalc 時,可以考慮使用 shell 實現一個 ipcalc.sh。
ipcalc.sh.
#!/bin/bash
net="$1"
ip=(${net%/*})
cdr=(${net##*/})
cdr2mask(){
#set -- $((5-("$1"/8))) 255 255 255 255 $((2**8-2**(8-"$1"%8))) 0 0 0
set -- $(( 5-("$1"/8) )) 255 255 255 255 $(( (255 << (8-("$1"%8))) & 255 )) 0 0 0
[[ $1 -gt 1 ]] && shift $1 || shift
#echo $#:$@
#255 255 255 255 253 0 0 0 shift
#^_____________^ 255.255.255.255 shift
# ^_____________^ 255.255.255.253 shift 2
# ^___________^ 255.255.253.0 shift 3
#default 0, just in case
echo ${1-0}.${2-0}.${3-0}.${4-0}
}
msk=$(cdr2mask $cdr)
IFS=. read -r i1 i2 i3 i4 <<< "${ip}"
IFS=. read -r m1 m2 m3 m4 <<< "${msk}"
printf "%d.%d.%d.%d" "$((i1 & m1))" "$((i2 & m2))" "$((i3 & m3))" "$((i4 & m5))"
## usage
# route=$(sh ipcalc.sh 192.168.31.123/24)
# echo $route
基於上述腳本實現的小程序(僞代碼).
get_matched_interface(){
xxxx
for eth in eths;do
ip=get_ip_eth $eth
if ipcalc.sh $ip == ipcalc.sh $float_ip;then
return eth.name
fi
done
}