Last active
December 30, 2022 02:07
-
-
Save olomor/09b4f081fc8f603e776eaadc53ad8b0b to your computer and use it in GitHub Desktop.
This file contains 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
function bin2dec() | |
{ | |
echo -n $((2#${1})) | |
} | |
function dec2bin() | |
{ | |
D2B=({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}) | |
echo -n ${D2B[${1}]} | |
} | |
function ip2bin() | |
{ | |
local X=${1} | |
local OLDIFS="${IFS}" | |
IFS="." | |
set -- $X | |
echo -n "$(dec2bin $1)$(dec2bin $2)$(dec2bin $3)$(dec2bin $4)" | |
IFS="$OLDIFS" | |
} | |
function dec2ip() { | |
printf "%d.%d.%d.%d\n" \ | |
$(( ($1 >> 24) & 255 )) \ | |
$(( ($1 >> 16) & 255 )) \ | |
$(( ($1 >> 8 ) & 255 )) \ | |
$(( ($1) & 255 )) | |
} | |
function cidrSubnetMask() | |
{ | |
local ONES="11111111111111111111111111111111" | |
local ZEROES="00000000000000000000000000000000" | |
local BITS=$((32-${1})) | |
echo ${ONES:0:$((${#ONES}-${BITS}))}${ZEROES:0:${BITS}} | |
} | |
function cidrNetworkAddress() | |
{ | |
local CIDR=${1} | |
local CIDR_IPADDRESS=${CIDR%%/*} | |
local CIDR_MASKBITS=${CIDR##*/} | |
local BIN_IPADDRESS="$(ip2bin ${CIDR_IPADDRESS})" | |
local BIN_SUBNETMASK="$(cidrSubnetMask ${CIDR_MASKBITS})" | |
local R="" | |
for I in {0..31} | |
do | |
R="${R}$(( 2#${BIN_IPADDRESS:$I:1} & 2#${BIN_SUBNETMASK:$I:1} ))" | |
done | |
echo -n "$(bin2dec ${R:0:8}).$(bin2dec ${R:8:8}).$(bin2dec ${R:16:8}).$(bin2dec ${R:24:8})" | |
} | |
function cidrSubnetMaxAddresses() | |
{ | |
echo -n $(( 1 << ( 32 - ${1/*\//} ))) | |
} | |
function cidrSubnetMaxHosts() | |
{ | |
echo -n $(( $(cidrSubnetMaxAddresses ${1})-2 )) | |
} | |
function cidrBroadcastAddress() | |
{ | |
local CIDR=${1} | |
local CIDR_IPADDRESS=${CIDR%%/*} | |
local CIDR_MASKBITS=${CIDR##*/} | |
local CIDR_NETWORK_ADDRESS=$(cidrNetworkAddress ${CIDR}) | |
local CIDR_NETWORK_ADDRESS_BIN=$(ip2bin ${CIDR_NETWORK_ADDRESS}) | |
local CIDR_NETWORK_ADDRESS_DEC=$(bin2dec ${CIDR_NETWORK_ADDRESS_BIN}) | |
local CIDR_MAX_ADDRESSES=$(cidrSubnetMaxAddresses ${CIDR}) | |
local CIDR_BROADCAST_ADDRESS_DEC=$(( ${CIDR_NETWORK_ADDRESS_DEC} + ${CIDR_MAX_ADDRESSES} - 1 )) | |
echo -n $(dec2ip ${CIDR_BROADCAST_ADDRESS_DEC}) | |
} | |
function cidrListIPAddresses() | |
{ | |
local OLDIFS="$IFS" | |
local CIDR="${1}" | |
local CIDR_NETWORK_ADDRESS=$(cidrNetworkAddress ${CIDR}) | |
local CIDR_NETWORK_MASKBTIS=${CIDR##*/} | |
local CIDR_NETWORK_MAXHOSTS=$(cidrSubnetMaxHosts ${CIDR}) | |
IFS="." | |
set -- ${CIDR_NETWORK_ADDRESS} | |
local IPS=$((0x$(printf "%02x%02x%02x%02x" $1 $2 $3 $4))) | |
local VAL="" | |
IFS="$OLDIFS" | |
for ((N=0; N<CIDR_NETWORK_MAXHOSTS; N++)) | |
{ | |
VAL=$((IPS|N)) | |
printf "%d.%d.%d.%d\n" \ | |
$(( (VAL >> 24) & 255 )) \ | |
$(( (VAL >> 16) & 255 )) \ | |
$(( (VAL >> 8 ) & 255 )) \ | |
$(( (VAL) & 255 )) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Bash SubNet Calculator Code Library