计算可用IP地址范围的shell脚本

输入: 输入IP网段,格式: xx.xx.xx.xx/[0-32]
输出:可用地址范围
思路

  1. ip与掩码拆分,健壮性判断
  2. 按位与,或者主机位置0,求出网络号
  3. 计算该网段可用地址范围。

效果

[root@centos8 commonshells]# ./calIpRange.sh 114.12.3.3/30
114.12.3.3/30该网段网络号为114.12.3.0
114.12.3.3/30该网段最小可用地址为114.12.3.1
114.12.3.3/30该网段最大可用地址为114.12.3.2
114.12.3.3/30该网段广播地址为114.12.3.3

脚本:

#!/bin/bash
#########################################################
#Filename:   calIpRange.sh
#  Author:   LiangDong
#   Email:   395539184@qq.com
#    Date:   2021-04-04
#     URL:   https://github.com/ledrsnet
#    Desc:    输入IP网段,输出可用地址范围
#	          1.ip与掩码拆分,健壮性判断
#             2.按位与,求出网络号
#             3.计算该网段可用地址范围。
#     
#########################################################

set -eu

# 1.ip掩码拆分并进行健壮性判断
E_NOARGS=65
if [ -z "$1" ];then
    echo "Usage:`basename $0` ip/mask"
    exit $E_NOARGS
fi
IP_MASK=$1
IP=`echo $IP_MASK |sed -En 's/^(.*)\/([0-9]{1,2})/\1/p'`
NET_MASK=`echo $IP_MASK |sed -En 's/^(.*)\/([0-9]{1,2})/\2/p'`
#echo IP_MASK=$IP_MASK
#echo IP=$IP
#echo NET_MASK=$NET_MASK
if [[ ! $IP =~ ^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]];then
   echo  "Ip address $IP is invalid . Useage: ip/mask" 
   exit 2
elif [ $NET_MASK -gt 32 -o $NET_MASK -lt 0 ];then
   echo "netmask should be in 0-32,your input netmask is $NET_MASK; Useage: ip/mask"
   exit 3
elif [ $NET_MASK -eq 32 ];then
	echo "主机位是32位,可用地址为$IP"
	exit 4
fi


# 2.求出ip第几段前几位作运算
IP_SUB1=`echo $IP |cut -d. -f1`
IP_SUB2=`echo $IP |cut -d. -f2`
IP_SUB3=`echo $IP |cut -d. -f3`

#IP_SUB4=`echo $IP |cut -d. -f4`
#IP_INDEX=`[ $[$NET_MASK/8+1] -ge 5 ] && echo 4 || echo $[$NET_MASK/8+1]`
#echo IP_INDEX=$IP_INDEX
#eval echo \$IP_SUB$IP_INDEX

IP_INDEX=`echo $[$NET_MASK/8+1]`
IP_SUB=`echo $IP |cut -d. -f$IP_INDEX`
IP_SUB_BINARY=`echo "obase=2;$IP_SUB" |bc |xargs printf "%08d"`
#echo IP_INDEX=$IP_INDEX
#echo IP_SUB=$IP_SUB
#echo IP_SUB_BINARY=$IP_SUB_BINARY
IP_SUB_NET_BIT=$[$NET_MASK%8]
IP_SUB_HOST_BIT=$[8-$NET_MASK%8]

#echo IP_SUB_NET_BIT=$IP_SUB_NET_BIT
#echo IP_SUB_HOST_BIT=$IP_SUB_HOST_BIT

# 3.网络位不变,主机位全为0
AVAILABLE_MIN_IP=$(echo $IP_SUB_BINARY|head -c${IP_SUB_NET_BIT} |xargs printf "ibase=2;%s`echo 00000000 |head -c${IP_SUB_HOST_BIT}`\n"|bc)
#echo AVAILABLE_MIN_IP=$AVAILABLE_MIN_IP

# 与操作 生成连续重复的字符串有什么好办法没?
#R_NET_MASK=
#R_HOST_MASK=
#R_MASK=
#for i in `seq ${IP_SUB_NET_BIT}`;do
#	R_NET_MASK+=1
#done
#for i in `seq ${IP_SUB_HOST_BIT}`;do
#	R_HOST_MASK+=0
#done
#R_MASK=`echo "ibase=2;$R_NET_MASK$R_HOST_MASK"|bc`
#echo R_MASK=$R_MASK
#A_MIN_IP=$[$IP_SUB&$R_MASK]
#echo A_MIN_IP=$A_MIN_IP


# 网络位不变,主机位全为1
AVAILABLE_MAX_IP=$(echo $IP_SUB_BINARY|head -c${IP_SUB_NET_BIT} |xargs printf "ibase=2;%s`echo 11111111 |head -c${IP_SUB_HOST_BIT}`\n"|bc)
#echo AVAILABLE_MAX_IP=$AVAILABLE_MAX_IP

# 4.输出可用地址范围
case $IP_INDEX in
1)
	echo "$IP_MASK该网段网络号为${AVAILABLE_MIN_IP}.0.0.0"
	echo "$IP_MASK该网段最小可用地址为${AVAILABLE_MIN_IP}.0.0.1"
	echo "$IP_MASK该网段最大可用地址为${AVAILABLE_MAX_IP}.255.255.254"
	echo "$IP_MASK该网段广播地址为${AVAILABLE_MAX_IP}.255.255.255"
	;;
2)
	echo "$IP_MASK该网段网络号为${IP_SUB1}.${AVAILABLE_MIN_IP}.0.0"
	echo "$IP_MASK该网段最小可用地址为${IP_SUB1}.${AVAILABLE_MIN_IP}.0.1"
	echo "$IP_MASK该网段最大可用地址为${IP_SUB1}.${AVAILABLE_MAX_IP}.255.254"
	echo "$IP_MASK该网段广播地址为${IP_SUB1}.${AVAILABLE_MAX_IP}.255.255"
	;;
3)
	echo "$IP_MASK该网段网络号为${IP_SUB1}.${IP_SUB2}.${AVAILABLE_MIN_IP}.0"
	echo "$IP_MASK该网段最小可用地址为${IP_SUB1}.${IP_SUB2}.${AVAILABLE_MIN_IP}.1"
	echo "$IP_MASK该网段最大可用地址为${IP_SUB1}.${IP_SUB2}.${AVAILABLE_MAX_IP}.254"
	echo "$IP_MASK该网段广播地址为${IP_SUB1}.${IP_SUB2}.${AVAILABLE_MAX_IP}.255"
	;;
4)
	echo "$IP_MASK该网段网络号为${IP_SUB1}.${IP_SUB2}.${IP_SUB3}.${AVAILABLE_MIN_IP}"
	echo "$IP_MASK该网段最小可用地址为${IP_SUB1}.${IP_SUB2}.${IP_SUB3}.$[${AVAILABLE_MIN_IP}+1]"
	echo "$IP_MASK该网段最大可用地址为${IP_SUB1}.${IP_SUB2}.${IP_SUB3}.$[${AVAILABLE_MAX_IP}-1]"
	echo "$IP_MASK该网段广播地址为${IP_SUB1}.${IP_SUB2}.${IP_SUB3}.${AVAILABLE_MAX_IP}"
	;;
*)
	echo "Calculator Error Exception!"
esac

如果有什么bug,欢迎评论指导呀!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清枫cc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值