shell脚本之IP计算器


aihuafeng66t
克里斯蒂亚诺诺 2024-01-09 16:28:27 50928 赞同 0 反对 0
分类: 资源
shell脚本之IP计算器

一、需求说明
  在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"
————————————————

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
克里斯蒂亚诺诺L1
粉丝 0 资源 831 + 关注 私信
最近热门资源
银河麒麟桌面操作系统备份用户数据  123
统信桌面专业版【全盘安装UOS系统】介绍  116
银河麒麟桌面操作系统安装佳能打印机驱动方法  108
银河麒麟桌面操作系统 V10-SP1用户密码修改  102
最近下载排行榜
银河麒麟桌面操作系统备份用户数据 0
统信桌面专业版【全盘安装UOS系统】介绍 0
银河麒麟桌面操作系统安装佳能打印机驱动方法 0
银河麒麟桌面操作系统 V10-SP1用户密码修改 0
作者收入月榜
1

prtyaa 收益393.62元

2

zlj141319 收益217.85元

3

1843880570 收益214.2元

4

IT-feng 收益208.98元

5

风晓 收益208.24元

6

777 收益172.71元

7

Fhawking 收益106.6元

8

信创来了 收益105.84元

9

克里斯蒂亚诺诺 收益91.08元

10

技术-小陈 收益79.5元

请使用微信扫码

加入交流群

请使用微信扫一扫!