6

示例:我有这个网络掩码:255.255.255.0

在 bash 中,是否有命令或简单的脚本将我的网络掩码转换为符号 /24?

4

4 回答 4

6
  1. 功能使用subnetcalc

    IPprefix_by_netmask() {
        subnetcalc 1.1.1.1 "$1" -n  | sed -n '/^Netw/{s#.*/ #/#p;q}'
    }
    
  2. 在 purebash中,将 IP 转换为长八进制字符串并将其位相加:

    IPprefix_by_netmask () { 
       c=0 x=0$( printf '%o' ${1//./ } )
       while [ $x -gt 0 ]; do
           let c+=$((x%2)) 'x>>=1'
       done
       echo /$c ; }
    

IPprefix_by_netmask 255.255.255.0(任一函数)的输出:

/24
于 2018-05-18T22:19:34.207 回答
5

基于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
于 2021-03-02T12:08:17.917 回答
4

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}"
}
于 2018-05-18T15:21:41.247 回答
1

根据 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}"
}
于 2019-12-18T00:00:54.780 回答