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"
本文来自博客园,作者:赛博狗尾草,转载请注明原文链接:https://www.cnblogs.com/gpysir/p/19700759
浙公网安备 33010602011771号