脚本shell: 子网计算

作者: 零一 2013-03-29 21:00:38
#!/bin/bash
if [ $UID -ne 0 ];then
echo "Your are not the root ....";exit 1
fi
if [ $# -ne 2 ];then
echo "Usage: $0 10.1.1.1 255.255.255.0";exit -1
fi
Judge()
{
num=`echo $1| grep -o '\.'|wc -l`
[ "$num" -ne 3 ]&&(echo " Error : It is not userful....")
}
Turn10to2()
{
OB=`echo "obase=2;ibase=10;$1"|bc`
echo $OB
}
Turn2to10()
{
OB=`echo "obase=10;ibase=2;$1"|bc`
echo $OB
}
rmfile()
{
rm -fr /mnt/ipaddress.log
rm -fr /mnt/netmask.log
rm -fr /mnt/_1.log
rm -fr /mnt/ip_mask.log
}
WANZHENG()
{
unset tmp;tmp=$1
_11=`echo $tmp |wc -c`
if [ $_11 -lt 9 ];then
_22=`expr 9 - $_11`
_00=`for ((t=1;t<=$_22;t++)); do y=${y}0; done;echo $y`
tmp=${_00}${tmp}
fi
echo $tmp
}
echo "Judging the ip address ....."
chmod 777 /mnt
chattr -i -a /mnt
rmfile
Judge $1
IFIP=`echo $1 |sed -n '/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/p'`
if [ -z $IFIP ];then
echo "The ip is not userful";exit 1
else
for ((i=1;i<5;i++))
do
n=`echo $1|cut -d. -f $i`
_1=`echo $n|cut -c 1`
[ $_1 -eq 0 ]&& n=0
if [ $i -eq 1 ];then
[ "$n" -eq 0 ]&&echo "Error : $n is equal 0 ..."&& exit 1
fi
if [ $i -eq 4 ];then
[ "$n" -eq 0 ]&&echo "Error : $n is equal 0 ..."&& exit 1
fi
[ "$n" -gt 255 ]&&echo "Error : $n is greater than 255 ..."&& exit 1
echo "${n}." >>/mnt/ipaddress.log
done
IP=`cat /mnt/ipaddress.log| tr -d '\n' |sed 's/\./\n/4g'`
fi
echo "Judging the netmask....."
Judge $2
unset netmask;netmask=$2
echo $netmask |awk 'split($0,array,"."){for (i=1;i<=4;i++){print array}}'|grep -A 1 255 >/mnt/_1.log
unset num;num=`cat /mnt/_1.log|wc -l`
unset ifz;ifz=`cat /mnt/_1.log |head -1`
if [ -z $ifz ];then
Cut_1=`echo $netmask |cut -d. -f1`
[ "$Cut_1" -gt 255 ]&&echo "Error : $Cut_1 is greater than 255 ..."&& exit 1
_10_2=`Turn10to2 $Cut_1`
_2_wanzheng=`WANZHENG $_10_2`
num_1=`echo $_2_wanzheng | grep -o 1 |wc -l`
num_0=`echo $_2_wanzheng | grep -o 0 |wc -l`
unset x;unset y
NUM_1=`for ((j=1;j<=$num_1;j++)); do x=${x}1; done;echo $x`;
NUM_0=` for ((v=1;v<=$num_0;v++)); do y=${y}0; done;echo $y`
NUM=${NUM_1}${NUM_0}
[ $NUM != $_2_wanzheng ]&&echo "Error : $n is not userful .______.."&&exit 1
MASK=$2
else
unset NUM; NUM=`expr 4 - $num`
if [ $NUM -ne 0 ];then
for ((i=$NUM;i>0;i--)); do echo 0 >>/mnt/_1.log; done
netmask=`cat /mnt/_1.log|tr '\n' .|sed 's/.*/&\n/g'|sed 's/\.$//'`
fi
IFMASK=`echo $netmask |sed -n '/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/p'`
if [ -z $IFMASK ];then
echo "Error: the NETMASK is not userfull..."
else
rmfile
for ((i=1;i<5;i++))
do
n=`echo $netmask|cut -d. -f $i`
_1=`echo $n|cut -c 1`
[ "$_1" -eq "0" ]&& n=0
if [ $i -eq 1 ];then
[ "$n" -eq 0 ]&&echo "Error : $n is equal 0 ..."&& exit 1
fi
[ "$n" -gt 255 ]&&echo "Error : $n is greater than 255 ..."&& exit 1
n_3=`echo "obase=2;ibase=10;$n"|bc`
n_2=`WANZHENG $n_3`
num_1=`echo $n_2| grep -o 1 |wc -l`
num_0=`echo $n_2| grep -o 0 |wc -l`
unset x;unset y
NUM_1=`for ((j=1;j<=$num_1;j++)); do x=${x}1; done;echo $x`;
NUM_0=` for ((v=1;v<=$num_0;v++)); do y=${y}0; done;echo $y`
NUM=${NUM_1}${NUM_0}
[ $NUM != $n_2 ]&&echo "Error : $n is not userful .______.."&&exit 1
echo "${n}.">>/mnt/netmask.log
done
MASK=`cat /mnt/netmask.log| tr -d '\n' |sed 's/\./\n/4g'`
fi
fi
echo "The ip address is :"
echo "++++++++++++++++++++++++++"
echo "+ $IP +"|grep $IP --color=yes
echo "++++++++++++++++++++++++++"
echo "The netmask is :"
echo "++++++++++++++++++++++++++"
echo "+ $MASK +"|grep $MASK --color=yes
echo "++++++++++++++++++++++++++"
echo "Turning ...";sleep 2
function TURN()
{
for ((i=1;i<5;i++))
do
TN=`echo $1| awk 'split($0,array,"."){for (j=1;j<=4;j++){print array[j]}}' |
\awk 'NR==nr {print $0}' nr=$i`
TO_DUMP=`Turn10to2 $TN`
TO=`WANZHENG $TO_DUMP`
echo "${TO}.">>/mnt/${1}.log
done
echo `cat /mnt/${1}.log| tr -d '\n' |sed 's/\./\n/4g'`
rm -fr /mnt/${1}.log
}
unset ip;ip=`TURN $IP`
unset mask;mask=`TURN $MASK`
echo;echo -e "The IP: $ip"|grep $ip --color=yes
echo;echo -e "The MASK : $mask"|grep $mask --color=yes
unset ip_mask
for ((i=0;i<36;i++))
do
ip_number=`echo ${var:i:1}`
mask_number=`echo ${mask:i:1}`
if [ $mask_number == 1 ];then
ip_mask=${ip_mask}${ip:i:1}
fi
if [ $mask_number == 0 ];then
ip_mask=${ip_mask}0
fi
if [ $mask_number == "." ];then
ip_mask=${ip_mask}.
fi
done>/dev/null 2>&1
echo;echo -e "The NETWORK_NUMBER: $ip_mask"|grep $ip_mask --color=yes
ip_mask_=`echo $ip_mask|sed 's/\./ /g'`
for var in $ip_mask_
do
Turn2to10 $var>>/mnt/ip_mask.log
done
NETWORK=`cat /mnt/ip_mask.log|tr '\n' . |sed 's/\.//4g'|sed 's/.*/&\n/g'`
echo;echo "The network is: $NETWORK "|grep $NETWORK --color=yes
the_num_of_zero=`echo $mask | grep -o 0 |wc -l`
unset D;for ((i=1;i<=the_num_of_zero;i++)); do D=${D}1;done
DIFF=`Turn2to10 $D`
DIFF_1=`expr $DIFF - 1`
echo;echo "The number of userful ip: $DIFF_1" |grep $DIFF_1 --color=yes
rmfile
#_____________________________________________________________________________________________(0)
echolimits()
{
echo;echo "The broadcast is : $BROADCAST" |grep $BROADCAST --color=yes
echo;echo "the limits of usrful ip : ${FIRST_IP} - ${LAST_IP}" \
|grep "${FIRST_IP} - ${LAST_IP}" --color=yes
}
exitlist()
{
echo exiting;sleep 1;exit 0
}
n_8=`echo "${the_num_of_zero}/8"|bc`;
m_8=`echo "${the_num_of_zero}%8"|bc`;
if [ $n_8 == 0 ];then
NETWORK_4=`echo $NETWORK|cut -d. -f4`
LEST=`echo $NETWORK| sed "s/\${NETWORK_4}$//g"`
unset D;for ((i=1;i<=$the_num_of_zero;i++)); do D=${D}1; done
DIFF_1=`Turn2to10 $D`
first=`expr $NETWORK_4 + 1`;FIRST_IP=${LEST}${first}
broad=$[ NETWORK_4 + DIFF ];BROADCAST=${LEST}${broad}
last=$(( broad - 1 ));LAST_IP=${LEST}${last}
echolimits
read -t 4 -p "List(y/n) ?" list
case $list in
y|Y|yes|YES)
echo "The list of userful ip address:";sleep 2
for ((i=1;i<=$DIFF-1;i++))
do
NL=`expr $NETWORK_4 + $i`
echo $LEST$NL |grep -o "$LEST$NL" --color=yes
done
exit 0 ;;
*)
exitlist ;;
esac
fi
#________________________________________________________________________________________(1)
if [ $n_8 == 1 ];then
if [ $m_8 == 0 ];then
IP_4=`echo $IP|cut -d. -f4`
LEST=`echo $IP| sed "s/\${IP_4}$//g"`
FIRST_IP=${LEST}1
LAST_IP=${LEST}254
BROADCAST=${LEST}255
echolimits
read -t 4 -p "List(y/n) ?" list
case $list in
y|Y|yes|YES)
echo "The list of userful ip address:";sleep 2
for ((i=1;i<=254;i++)); do echo ${LEST}$i \
| grep "${LEST}$i" --color=yes; done ;;
*)
exitlist ;;
esac
else
unset LEST_2;LEST_2=`echo $NETWORK | tr '.' '\n' | head -2 \
| tr '\n' '.' |sed 's/\.$/\n/g'`
unset LEST_1;LEST_1=`echo $NETWORK | cut -d. -f3`
unset D;for ((i=1;i<=$m_8;i++));do D=${D}1;done
unset DIFF;DIFF=`Turn2to10 $D`
broad=`expr $LEST_1 + $DIFF`
FIRST_IP=${LEST_2}.${LEST_1}.1
LAST_IP=${LEST_2}.${broad}.254
BROADCAST=${LEST_2}.${broad}.255
echolimits
read -t 4 -p "List ?" list
case $list in
y|Y|yes|YES)
echo "The list of userful ip address:";sleep 2
for ((i=1;i<=$DIFF;i++))
do
MON=`expr $LEST_1 + $i`
for ((j=1;j<=254;j++));do echo ${LEST_2}.${MON}.$j \
|grep "${LEST_2}.${MON}.$j" --color=yes;done
done ;;
*)
exitlist ;;
esac
fi
fi
#_________________________________________________________________________________2
if [ $n_8 == 2 ];then
if [ $m_8 == 0 ];then
unset LEST_2;LEST_2=`echo $NETWORK | tr '.' '\n' \
| head -2 | tr '\n' '.' |sed 's/\.$/\n/g'`
echo;echo "The broadcast is : ${LEST_2}.255.255" \
|grep "${LEST_2}.255.255" --color=yes
FIRST_IP=${LEST_2}.255.1
LAST_IP=${LEST_2}.255.254
BROADCAST=${LEST_2}.255.255
echolimits
read -t 4 -p "List ?" list
case $list in
y|Y|yes|YES)
echo "The list of userful ip address:";sleep 2
for ((i=1;i<=254;i++))
do
for((j=1;j<=254;j++));do echo ${LEST_2}.${i}.${j} \
|grep "${LEST_2}.${i}.${j}" --color=auto;done
done ;;
*)
exitlist ;;
esac
else
unset LEST;LEST=`echo $NETWORK | tr '.' '\n' | head -1 \
| tr '\n' '.' |sed 's/\.$/\n/g'`
unset LEST_1;LEST_1=`echo $NETWORK | cut -d. -f2`
unset D;for ((i=1;i<=$m_8;i++));do D=${D}1;done
unset DIFF;DIFF=`Turn2to10 $D`
broad=`expr $LEST_1 + $DIFF`
FIRST_IP=${LEST}.${LEST_1}.255.1
LAST_IP=${LEST}.${broad}.255.254
BROADCAST=${LEST}.${broad}.255.255
echolimits
read -t 4 -p "List ?" list
case $list in
y|Y|yes|YES)
echo "The list of userful ip address:";sleep 2
for ((i=1;i<=$DIFF;i++))
do
MON=`expr $LEST_1 + $i`
for ((j=1;j<=255;j++))
do
for((k=1;k<=254;k++));do echo ${LEST}.${MON}.${j}.${k} \
|grep "${LEST}.${MON}.${j}.${k}" --color=yes;done
done
done
;;
*)
exitlist ;;
esac
fi
fi
#_________________________________________________________________________________3
if [ $n_8 == 3 ];then
if [ $m_8 == 0 ];then
unset LEST_1;LEST_1=`echo $NETWORK | tr '.' '\n' | head -1 \
| tr '\n' '.' |sed 's/\.$/\n/g'`
echo;echo "The broadcast is : ${LEST_1}.255.255.255" \
|grep "${LEST_1}.255.255.255" --color=yes
FIRST_IP=${LEST_1}.255.255.1
LAST_IP=${LEST_1}.255.255.254
BROADCAST=${LEST_1}.255.255.255
echolimits
read -t 4 -p "List ?" list
case $list in
y|Y|yes|YES)
echo "The list of userful ip address:";sleep 2
for ((i=1;i<=255;i++))
do
for ((k=1;k<=255;i++))
do
for((j=1;j<=254;j++));do echo ${LEST_1}.${i}.${k}.${j} \
|grep "${LEST_1}.${i}.${k}${j}" --color=yes;done
done
done
;;
*)
exitlist ;;
esac
else
unset LEST_1;LEST_1=`echo $NETWORK | tr '.' '\n' | head -1 \
| tr '\n' '.' |sed 's/\.$/\n/g'`
unset D;for ((i=1;i<=$m_8;i++));do D=${D}1;done
unset DIFF;DIFF=`Turn2to10 $D`
broad=`expr $LEST_1 + $DIFF`
FIRST_IP=${LEST_1}.255.255.1
LAST_IP=${broad}.255.255.254
BROADCAST=${broad}.255.255.255
echolimits
read -t 4 -p "List ?" list
case $list in
y|Y|yes|YES)
echo "The list of userful ip address:";sleep 2
for ((i=1;i<=$DIFF;i++))
do
MON=`expr $LEST_1 + $i`
for ((j=1;j<=255;j++))
do
for((n=1;n<=255;n++))
do
for((k=1;k<=254;k++));do echo ${MON}.${j}.${n}.${k} \
| grep "${MON}.${i}.${j}.${k}" --color=yes;done
done
done
done ;;
*)
exitlist ;;
esac
fi
fi
rmfile

相关资讯