Bash - 以CIDR表示法转换网络掩码?

时间:2018-05-18 14:27:50

标签: bash cidr netmask

实施例: 我有这个网络掩码:255.255.255.0

在bash中,是否有一个命令或一个简单的脚本来转换我的网络掩码 / 24?

4 个答案:

答案 0 :(得分:2)

RHEL6 / RHEL7的示例函数:

IPprefix_by_netmask() {
#function returns prefix for given netmask in arg1
 ipcalc -p 1.1.1.1 $1 | sed -n 's/^PREFIX=\(.*\)/\/\1/p'
}

结果:

$ IPprefix_by_netmask 255.255.255.0
/24

在其他Linux发行版中,ipcalc选项可能不同。

没有ipcalc的相同功能,在Solaris和Linux中测试过:

IPprefix_by_netmask() {
    #function returns prefix for given netmask in arg1
    bits=0
    for octet in $(echo $1| sed 's/\./ /g'); do 
         binbits=$(echo "obase=2; ibase=10; ${octet}"| bc | sed 's/0//g') 
         let bits+=${#binbits}
    done
    echo "/${bits}"
}

答案 1 :(得分:2)

基于awk的解决方案

虽然 GNU awk 不是 Bash,但它默认安装在足够多的发行版中,这在问题的意义上可能会有所帮助:

awk -F. '{
    split($0, octets)
    for (i in octets) {
        mask += 8 - log(2**8 - octets[i])/log(2);
    }
    print "/" mask
}' <<< 255.255.255.240

打印:

/28

答案 2 :(得分:1)

  1. 使用subnetcalc的功能:

    bash
  2. 在纯IPprefix_by_netmask () { c=0 x=0$( printf '%o' ${1//./ } ) while [ $x -gt 0 ]; do let c+=$((x%2)) 'x>>=1' done echo /$c ; } 中,将IP转换为长八进制字符串并对其位求和:

    IPprefix_by_netmask 255.255.255.0
  3. /24 (任一函数)的输出:

    {{1}}

答案 3 :(得分:0)

根据Sasha的回答,此脚本可与dash(经过Ubuntu 18.04测试)一起使用:

IPprefix_by_netmask() {
    #function returns prefix for given netmask in arg1
    bits=0
    for octet in $(echo $1| sed 's/\./ /g'); do 
         binbits=$(echo "obase=2; ibase=10; ${octet}"| bc | sed 's/0//g') 
         bits=$(expr $bits + ${#binbits})
    done
    echo "/${bits}"
}