2016年9月2日 星期五

SUBNET 與 IP 的計算 (bash script)

function subnetonetmask(){
SUBNET=$1
NUM=128
SUM=0
NETMASK=''

if [ $(( SUBNET % 8 )) -eq 0 ]; then
  M=$(( SUBNET / 8 ))
  N=0
  NETMASK=$(echo $(printf '255.%.0s' $(eval "echo {1.."$((M))"}"))$(printf "$SUM.%.0s" $(eval "echo {1.."$((4-M))"}"))|cut -d'.' -f1,2,3,4)

else
  N=$(( SUBNET % 8 ))
  M=$(( (SUBNET - N)/8 ))
  while true
  do
#   echo "$SUM, $NUM"
    SUM=$(( SUM + NUM ))
    NUM=$(( NUM / 2 ))
    N=$(( N - 1))
    if [ $N -eq 0 ]; then
      break
    fi
  done
  NETMASK=$(echo $(printf '255.%.0s' $(eval "echo {1.."$((M))"}"))$SUM.$(printf "0.%.0s" $(eval "echo {1.."$((4-M-1))"}"))|cut -d'.' -f1,2,3,4)
fi

#echo "M=$M, N=$N"
echo $NETMASK
}

function subip(){
IP=${1}
MASK=${2}
SUBIP=''
for n in 1 2 3 4
do
  if [ $n -eq 4 ]; then
    dot=''
  else
    dot='.'
  fi
  SUBIP=${SUBIP}$(( $(echo $IP|cut -d'.' -f$n) & $(echo $MASK|cut -d'.' -f$n) ))${dot}
done

echo ${SUBIP}
}

=============================================
使用範例:

echo $(subnetonetmask 21)
Result >> 255.255.248.0

echo $(subip 192.168.1.253 255.255.255.128)
Result >> 192.168.1.128