aton und ntoa in bash

Written by cobalt on März 1st, 2012

Für IPv4 Vergleiche braucht man öfter die Darstellung der IPv4 Adresse als Integer, das geht mit den folgenden BASH Funktionen:

# aton and ntoa
function ntoa() {
  local IFS=. num quad ip e
  num=$1
  for e in 3 2 1; do
    quad=$((256**$e))
    ip[$((3-$e))]=$(($num/$quad))
    num=$((num%quad))
  done
  ip[3]=${num}
  echo "${ip[*]}"
}

function aton() {
  local IFS=. ip num e
  ip=($1)
  for e in 3 2 1; do
    num=$(($num+${ip[$((3-$e))]}*256**$e))
  done
  num=$(($num+${ip[3]}))
  echo $(($num&0xFFFFFFFF))
}

Ausnutzen kann man das mit dem folgenden Beispiel:

CNW[0]=10.0.2.192  CNM[0]=255.255.255.192 CGW[0]=10.0.2.193
CNW[1]=10.0.16.0   CNM[1]=255.255.255.0   CGW[1]=10.0.16.1
CNW[2]=10.0.40.128 CNM[2]=255.255.255.128 CGW[2]=10.0.40.3

nwparams() { # fetch $2-params to ipaddr in $1
  rt=1
  i=0
  while [ $i -lt ${#CNW[*]} ]; do
    if [ "$(( $(aton $1) & $(aton ${CNM[$i]}) ))" == "$(aton {CNW[$i]})" ]; then
      rt=0
      break
    fi
    i=$((i+1))
  done
  if [ "$rt" == "1" ]; then
    return 1
  else  
    case $2 in
      nw) echo ${CNW[$i]};;
      nm) echo ${CNM[$i]};;
      gw) echo ${CGW[$i]};;
    esac
    return 0
  fi
}

if [ -z ${GW} ]; then
  if GW=$(nwparams $IP gw); then
    echo "using gw:$GW for ip:$IP."
  else
    echo "gw not found, aborting."; exit 1
  fi
fi
 

Comments are closed.