LINUX.ORG.RU

простенькая ip арифметика на bash


0

0

Нужна простенькая функция или отдельный скрипт, написанный на bash, который из записи типа 192.168.0.3/30 будет извлекать адрес сети, brodcast и тд. Может уже есть готовые решения? Или просто заюзать как-то ipcalc?

anonymous

Дык это не арифметика, а text processing. Посмотри man expr.

hbee ★★★★
()

Вот, извратился, скрипт только dc (и test) использует.

Никаких проверок, только голая идея!

#!/bin/sh

num2dot()
{
IPN=$1
IP4=`echo "$IPN 256 % p"|dc`
IPN=`echo "$IPN 256 / p"|dc`
IP3=`echo "$IPN 256 % p"|dc`
IPN=`echo "$IPN 256 / p"|dc`
IP2=`echo "$IPN 256 % p"|dc`
IP1=`echo "$IPN 256 / p"|dc`
echo $IP1.$IP2.$IP3.$IP4
unset IP1 IP2 IP3 IP4
}

if [ "$1" == "" ]; then
echo " Usage: $0 ip/mask, e.g. 192.168.14.5/24"
exit 0
fi

# Split input parameter:
IP=${1/\/*/}
MSK=${1/*\//}

# IP in dot notation -> number:
NIP=`echo "$IP + p q"|sed s'/\./ 256 3 \^ \* /'|sed s'/\./ 256 2 \^ \* \+ /'|sed s'/\./ 256 \* \+ /'|dc`

# Evaluate the netwoork address:
NET=$NIP
ITR=$MSK
NET=`( echo -n $NET
while [ $ITR != 32 ] ; do
let ++ITR
echo -n " 2 /"
done
ITR=$MSK
while [ $ITR != 32 ] ; do
let ++ITR
echo -n " 2 *"
done
echo " p q"
)|dc`

#Output the network address:
num2dot $NET

#Evaluate the broadcast address:
BCAST=0
ITR=$MSK
while [ $ITR != 32 ] ; do
let ++ITR BCAST*=2 BCAST++
done
let BCAST+=NET

#Output the broadcast address:
num2dot $BCAST


Die-Hard ★★★★★
()

А вот гораздо короче и только средствами bash:

#!/bin/sh

# Converts number into IP "dot" notation:
num2dot()
{
IPN=$1
let IP4=IPN%256 IPN/=256 IP3=IPN%256 IPN/=256 IP2=IPN%256 IP1=IPN/256
echo $IP1.$IP2.$IP3.$IP4
}

# Split input parameter:
IP=${1/\/*/}
B_MSK=${1/*\//}

# IP in dot notation -> number:
MIP=(${IP//./ })
let NIP=MIP[0]*16777216+MIP[1]*65536+MIP[2]*256+MIP[3]


# Evaluate  and output the network address
# DMSK is the NOT netmask:
let "DMSK=4294967295>>B_MSK"
let "MSK=4294967295^DMSK"
# Network address is IP AND netmask:
let "NET=NIP&MSK "
num2dot $NET

# Broadcast is IP OR NOT netmask:
let "BCAST=NIP|DMSK"
num2dot $BCAST

Die-Hard ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.