linux网卡掩码位数和10进制点分位的补充

在linux系统中,网卡文件中表示ip地址掩码有两种格式,分别为10进制点分格式和掩码位数,如255.255.255.0和24

1、在Debian系列中期版本采用的配置文件有/etc/network/interfaces

如ens32的部分配置

iface ens32 inet static
    address 192.168.88.12/24
    gateway 192.168.88.2

其中address 192.168.88.12/24可替换为如下,当二者同时出现时,优先生效的为netmask 所指定的参数

address 192.168.88.12

netmask 255.255.255.0

注:之前遇到的就是二者同时配置导致掩码对不上,Redhat一样的问题

2、在Redhat系列中一直保持着同样的配置/etc/sysconfig/network-scripts/ifcfg-xxx

如/etc/sysconfig/network-scripts/ifcfg-ens33中的配置

IPADDR=192.168.88.11
PREFIX=24
GATEWAY=192.168.88.2

其中PREFIX=24可替换为NETMASK=255.255.255.0,当二者同时出现在配置文件中,优先生效的为PREIFX指定的参数,

IPADDR=192.168.88.11
NETMASK=255.255.0.0
PREFIX=24
GATEWAY=192.168.88.2

如生效的掩码为24,而非16

3、存在需求,在不清楚网卡配置中掩码采用哪种格式时,需要获取其掩码,重置掩码格式为统一格式。

脚本需要实现,获取当前掩码,转换为统一格式。主要在于如何将获取的掩码转化为需要的格式。如下从ai获取到的脚本可以学习

将子网掩码位数转换为点分十进制

#!/bin/bash

# 定义函数:将子网掩码位数转换为点分十进制
cidr_to_netmask() {
    local cidr=$1
    local netmask=""
    local full_bytes=$((cidr / 8))   # 完整的 255 字节数
    local partial_bits=$((cidr % 8)) # 剩余的位数
    local partial_byte=0

    # 校验输入是否合法(0-32 之间的整数)
    if ! [[ "$cidr" =~ ^[0-9]+$ ]] || [ "$cidr" -lt 0 ] || [ "$cidr" -gt 32 ]; then
        echo "错误:子网掩码位数必须是 0-32 之间的整数!"
        return 1
    fi

    # 处理完整的 255 字节
    for ((i=0; i<full_bytes; i++)); do
        netmask+="255."
    done

    # 处理部分字节(如 24 位时无此部分,27 位时是 224)
    if [ "$partial_bits" -gt 0 ]; then
        partial_byte=$((256 - (1 << (8 - partial_bits))))
        netmask+="$partial_byte."
    fi

    # 补全剩余的 0 字节
    local empty_bytes=$((4 - full_bytes - (partial_bits > 0 ? 1 : 0)))
    for ((i=0; i<empty_bytes; i++)); do
        netmask+="0."
    done

    # 去掉末尾的点,输出最终结果
    echo "${netmask%.*}"
}

# 示例用法
if [ $# -ne 1 ]; then
    echo "用法:$0 <子网掩码位数>"
    echo "示例:$0 24 → 255.255.255.0"
    exit 1
fi

cidr_to_netmask "$1"

将点分十进制转换为子网掩码位数

#!/bin/bash

# 检查是否提供了参数
if [ $# -ne 1 ]; then
    echo "用法: $0 <前缀长度>"
    echo "示例: $0 24  将输出 255.255.255.0"
    exit 1
fi

prefix=$1

# 检查输入是否为0-32之间的整数
if ! [[ $prefix =~ ^[0-9]+$ ]] || [ $prefix -lt 0 ] || [ $prefix -gt 32 ]; then
    echo "错误: 请输入0到32之间的整数"
    exit 1
fi

# 计算子网掩码
mask=""
for i in {0..3}; do
    # 计算每个字节的位数
    bits=$(( prefix > 8 ? 8 : prefix ))
    prefix=$(( prefix - bits ))
    
    # 计算字节值 (2^8 - 2^(8-bits))
    byte=$(( (256 - (1 << (8 - bits))) & 255 ))
    
    # 拼接结果
    if [ -z "$mask" ]; then
        mask="$byte"
    else
        mask="$mask.$byte"
    fi
done

echo "$mask"

 

posted on 2026-03-11 10:48  赛博狗尾草  阅读(29)  评论(0)    收藏  举报

导航