-
-
Save borg1622/aa1488aa789490cdd1e5b4db04fd35a4 to your computer and use it in GitHub Desktop.
Bash script for calculating network and broadcast addresses from ip and netmask or CIDR Notation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Calculates network and broadcast based on supplied ip address and netmask | |
# Usage: broadcast_calc.sh 192.168.0.1 255.255.255.0 | |
# Usage: broadcast_calc.sh 192.168.0.1/24 | |
tonum() { | |
if [[ $1 =~ ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+) ]]; then | |
addr=$(( (${BASH_REMATCH[1]} << 24) + (${BASH_REMATCH[2]} << 16) + (${BASH_REMATCH[3]} << 8) + ${BASH_REMATCH[4]} )) | |
eval "$2=\$addr" | |
fi | |
} | |
toaddr() { | |
b1=$(( ($1 & 0xFF000000) >> 24)) | |
b2=$(( ($1 & 0xFF0000) >> 16)) | |
b3=$(( ($1 & 0xFF00) >> 8)) | |
b4=$(( $1 & 0xFF )) | |
eval "$2=\$b1.\$b2.\$b3.\$b4" | |
} | |
if [[ $1 =~ ^([0-9\.]+)/([0-9]+)$ ]]; then | |
# CIDR notation | |
IPADDR=${BASH_REMATCH[1]} | |
NETMASKLEN=${BASH_REMATCH[2]} | |
zeros=$((32-NETMASKLEN)) | |
NETMASKNUM=0 | |
for (( i=0; i<$zeros; i++ )); do | |
NETMASKNUM=$(( (NETMASKNUM << 1) ^ 1 )) | |
done | |
NETMASKNUM=$((NETMASKNUM ^ 0xFFFFFFFF)) | |
toaddr $NETMASKNUM NETMASK | |
else | |
IPADDR=${1:-192.168.1.1} | |
NETMASK=${2:-255.255.255.0} | |
fi | |
tonum $IPADDR IPADDRNUM | |
tonum $NETMASK NETMASKNUM | |
#printf "IPADDRNUM: %x\n" $IPADDRNUM | |
#printf "NETMASKNUM: %x\n" $NETMASKNUM | |
# The logic to calculate network and broadcast | |
INVNETMASKNUM=$(( 0xFFFFFFFF ^ NETMASKNUM )) | |
NETWORKNUM=$(( IPADDRNUM & NETMASKNUM )) | |
BROADCASTNUM=$(( INVNETMASKNUM | NETWORKNUM )) | |
IPADDRBIN=$( python -c "print(bin(${IPADDRNUM} )[2:].zfill(32))") | |
NETMASKBIN=$( python -c "print(bin(${NETMASKNUM} )[2:].zfill(32))") | |
NETWORKBIN=$( python -c "print(bin(${NETWORKNUM} )[2:].zfill(32))") | |
BROADCASTBIN=$(python -c "print(bin(${BROADCASTNUM})[2:].zfill(32))") | |
toaddr $NETWORKNUM NETWORK | |
toaddr $BROADCASTNUM BROADCAST | |
printf "%-25s %s\n" "IPADDR=$IPADDR" $IPADDRBIN | |
printf "%-25s %s\n" "NETMASK=$NETMASK" $NETMASKBIN | |
printf "%-25s %s\n" "NETWORK=$NETWORK" $NETWORKBIN | |
printf "%-25s %s\n" "BROADCAST=$BROADCAST" $BROADCASTBIN |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment