BASH:如何将十六进制子网掩码转换为位形式或点至上的地址



到目前为止,我的代码将从iOS系统获得IP地址,并以十六进制形式(ffffff00)获取子网掩码,但我需要位表格(24、23等)的子网地址)或二进制。我该怎么做?我尝试使用16#${subnet}转换它,但数字似乎是错误的。

有点愚蠢的问题 - 如果删除了LINE echo "hello",则代码不会运行,我不确定为什么?那条线扮演什么角色?

if [ $# -ne 0 ]
    echo "hello"
    then
        ip="$(ifconfig | grep "inet " | grep -v 127.0.0.1 | cut -d  -f2)"
        subnet="$(ifconfig | grep "netmask " | grep -v 0xff0 | sed -e 's/.*0x(.*)broadcast.*/1/')"
        consub="$((16#${subnet}))"
        echo "$ip $subnet $consub"
exit 0
fi

怎么样:

echo "ffffff00" | perl -pe '$_ = join(".", map(hex, /.{2}/g))'
=> 255.255.255.0
echo "ffffff00" | perl -pe '$_ = unpack("B32", pack("H*", $_)); s/0+$//g; $_ = length'
=> 24

没有一种可靠的方法来预测运行bash的系统中您将拥有的计算器(您可能有BC或DC或其他内容),但是您不知道真的需要那些。考虑以下功能:

binary () {
    local n bit=""
    printf -v n '%d' "$1"
    for (( ; n>0 ; n >>= 1 )); do  bit="$(( n&1 ))$bit"; done
    printf '%sn' "$bit"
}

这使用 >>=将位置转移到输入号码,然后使用n&1在数字中评估位置并在该位置上,并将结果插入$bit中以进行最终输出。

您可以将任何数字放入其中:

$ binary 123
1111011
$ binary 0xffffff00
11111111111111111111111100000000

从那里,您应该能够简单地计算自己的内容:

$ netmask="0xffffff00"
$ bitmask=$( s=$(binary "$netmask"); s="${s%%0*}"; printf '%d' "${#s}" )
$ echo "$bitmask"
24

您可以使用现代iproute2工具获取CIDR而不是解析ifconfig。例如:

ip -f inet -o a s scope global |
    grep -Po 'inet S+' |
    sed 's#.*/(.*)#1#'

最新更新