从ifconfig输出中提取网络掩码并以CIDR格式打印

时间:2012-12-17 04:42:11

标签: bash tcl cidr ifconfig netmask

我需要提取两组IP的网络掩码,然后以CIDR格式打印到屏幕上。考虑使用shell或tcl来做到这一点。猜测这里的主要粘性点是将十六进制网络掩码转换为CIDR格式。

尝试了一些不同的事情,但似乎没有按预期工作。

2 个答案:

答案 0 :(得分:2)

我们可以编写一个迭代掩码数字的函数,将每个数字中设置的位数相加。在符合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
}

答案 1 :(得分:2)

刚刚发现有一个tcl包实用程序允许我们这样做。

package require ip
::ip::maskToLength <hex_netmask> 

这将输出网络掩码的CIDR格式。