一、需求说明
在CSDN问答区经常有学生提问关于IP地址计算的问题,这种题型无非就是根据IP地址和掩码计算网络地址、广播地址、地址掩码、可用地址范围、可用主机数量。其实关于这些我在博文TCP/IP之IP协议及IP地址详解中诊断IP地址的规划和计算做了详细的说明。只要你读懂了这篇博文我相信计算IP地址对广大学生来说应该不是什么难事。如果嫌自己计算麻烦,此脚本可以帮你一次计算出所有结果。为了完成IP计算器脚本主要需要解决IP验证、进制转换、位数补齐等的问题。
此博文是在前两篇博文Shell脚本之IP验证、Shell脚本之进制转换器的基础上完成的,如果有觉得不清楚的地方很可能是你需要先读一下如上两篇博文。
二、脚本内容
#!/bin/bash
#script name: ipcalculate.sh
#author: wuhs
#version: v1
#date: 2022-05-20
#description: 此脚本用于根据IP地址和掩码位数计算网络地址、掩码、广播地址、可用地址范围、可用主机数量
#参数定义
net="192.168.0.0"
mask="255.255.255.0"
broadcast="192.168.0.255"
hostcount="254"
#获取IP地址
IP=$1
#获取掩码位数
maskm=$2
#获取主机位数
let n=32-$maskm
#定义一个函数,主要是为了解决二进制IP到点分十进制的转换,输入32的二进制字符串,打印点分十进制IP
function toip(){
ipc=$1
local p1=$(echo $ipc|cut -c -8)
p1=`echo "obase=10;ibase=2;$p1" |bc`
local p2=$(echo $ipc|cut -c 9-16)
p2=`echo "obase=10;ibase=2;$p2" |bc`
local p3=$(echo $ipc|cut -c 17-24)
p3=`echo "obase=10;ibase=2;$p3" |bc`
local p4=$(echo $ipc|cut -c 25-32)
p4=`echo "obase=10;ibase=2;$p4" |bc`
ipc="$p1.$p2.$p3.$p4"
echo $ipc
}
#先调用IP验证器验证输入的IP地址是否合规
. ./ipcheck.sh $IP
#IP输入合规则继续执行,输入错误则退出
if [ $? -eq 0 ];then
p1=$(echo $IP|cut -d. -f1)
p2=$(echo $IP|cut -d. -f2)
p3=$(echo $IP|cut -d. -f3)
p4=$(echo $IP|cut -d. -f4)
#echo $p1 $p2 $p3 $p4
elif [ $? -eq 1 ];then
echo "IP地址格式输入错误"
exit
elif [ $? -eq 2 ];then
echo "IP地址为特殊类型IP,此脚本仅用于计算公网或者内网IP地址。"
exit
fi
#获取IP地址各段二进制值
p12=`echo "obase=2;ibase=10;$p1" |bc`
p12=`printf "%08d\n" $p12`
p22=`echo "obase=2;ibase=10;$p2" |bc`
p22=`printf "%08d\n" $p22`
p32=`echo "obase=2;ibase=10;$p3" |bc`
p32=`printf "%08d\n" $p32`
p42=`echo "obase=2;ibase=10;$p4" |bc`
p42=`printf "%08d\n" $p42`
IP2="$p12$p22$p32$p42"
#验证输入掩码位数参数是否合规
if [ $maskm -ge 1 -a $maskm -le 32 ];then
echo -e "\e[32m掩码位数:$maskm 输入合规 \e[0m "
else
echo -e "\e[31m掩码位数:$maskm 输入不合规,要求输入1-32之间数值 \e[0m "
exit
fi
#获取网络地址
netw=`echo $IP2|cut -c -$maskm`
#获取主机位
let nn=$maskm+1
host=`echo $IP2|cut -c $nn-`
#将主机位全部转换为0,得到地址段网络地址
host=`echo $host| sed 's/1/0/g'`
#将主机位全部转换为1,得到地址段广播地址
brod=`echo $host| sed 's/0/1/g'`
#拼接二进制网络地址
net="$netw$host"
#拼接二进制广播地址
broadcast="$netw$brod"
#echo $broadcast
#获取网段第1个可用地址
fhost=`echo $host|sed 's/0$/1/g'`
fhost="$netw$fhost"
#获取网段最后1个可用地址
lhost=`echo $brod|sed 's/1$/0/g'`
lhost="$netw$lhost"
#获取掩码
mask=`echo $netw|sed 's/0/1/g'`
mask="$mask$host"
echo "地址$IP 计算结果如下:"
echo -e "网络地址是:\e[32m `toip $net` \e[0m"
echo -e "地址掩码是:\e[32m `toip $mask` \e[0m"
echo -e "广播地址是:\e[32m `toip $broadcast` \e[0m"
echo -e "可用地址范围是:\e[32m `toip $fhost` - `toip $lhost` \e[0m"
let hostcount=(2**$n-2)
echo -e "可用主机数量是:\e[32m $hostcount \e[0m"
三、使用示例
1、常规A/B/C类地址计算
[root@s146 ipcheck]# ./ipcalculate.sh 192.168.100.100 24
192.168.100.100 满足IP格式数字要求
192.168.100.100 是一个私网IP地址
掩码位数:24 输入合规
地址192.168.100.100 计算结果如下:
网络地址是: 192.168.100.0
地址掩码是: 255.255.255.0
广播地址是: 192.168.100.255
可用地址范围是: 192.168.100.1 - 192.168.100.254
可用主机数量是: 254
2、输入IP地址不合规
#此脚本仅用于计算通用的私网和公网IP地址,对应环回口IP、专有IP、组播地址等不做计算,虽然公式是通用的,但是这些IP地址是有特殊用途的,通用计算没有实际意义。
[root@s146 ipcheck]# ./ipcalculate.sh 192.168.100.10a 24
格式错误,请重新输入!
IP地址格式输入错误
[root@s146 ipcheck]# ./ipcalculate.sh 127.0.0.1 24
127.0.0.1 满足IP格式数字要求
127.0.0.1 是一个环回口地址
IP地址格式输入错误
3、掩码输入不合规
[root@s146 ipcheck]# ./ipcalculate.sh 192.168.0.1 33
192.168.0.1 满足IP格式数字要求
192.168.0.1 是一个私网IP地址
掩码位数:33 输入不合规,要求输入1-32之间数值