由于涉及到IP,网络号,子网号计算获取,网上搜罗了一些计算方法,整理下来分享!
在 Ubuntu 16.04 测试成功!
IP地址与长整数互转 (dash和bash均可)
代码: 全选
#!/bin/sh
ip2dec()
{
a=`echo ${1} | awk -F"." '{print $1}'`
b=`echo ${1} | awk -F"." '{print $2}'`
c=`echo ${1} | awk -F"." '{print $3}'`
d=`echo ${1} | awk -F"." '{print $4}'`
aa=`echo "${a}*256^3" | bc`
bb=`echo "${b}*256^2" | bc`
cc=`echo "${c}*256^1" | bc`
dd=`echo "${d}*256^0" | bc`
echo "${aa}+${bb}+${cc}+${dd}" | bc
}
dec2ip()
{
H1=$((${1} & 0x000000ff))
H2=$(((${1} & 0x0000ff00) >> 8))
L1=$(((${1} & 0x00ff0000) >> 16))
L2=$(((${1} & 0xff000000) >> 24))
echo ${L2}.${L1}.${H2}.${H1}
}
echo $(ip2dec 192.168.1.1)
echo $(dec2ip 3232235777)
子网淹码和CIDR长度互转换(dash和bash均可)
代码: 全选
#!/bin/sh
mask2cdr ()
{
# Assumes there's no "255." after a non-255 byte in the mask
local x=${1##*255.}
set -- 0^^^128^192^224^240^248^252^254^ $(( (${#1} - ${#x})*2 )) ${x%%.*}
x=${1%%$3*}
echo $(( $2 + (${#x}/4) ))
}
cdr2mask ()
{
# Number of args to shift, 255..255, first non-255 byte, zeroes
set -- $(( 5 - ($1 / 8) )) 255 255 255 255 $(( (255 << (8 - ($1 % 8))) & 255 )) 0 0 0
[ $1 -gt 1 ] && shift $1 || shift
echo ${1-0}.${2-0}.${3-0}.${4-0}
}
echo $(mask2cdr 255.255.255.0)
echo $(cdr2mask 24)
子网淹码和CIDR长度互转换(只能bash)
代码: 全选
#!/bin/bash
# Function calculates number of bit in a netmask
#
mask2cidr() {
nbits=0
IFS=.
for dec in $1 ; do
case $dec in
255) let nbits+=8;;
254) let nbits+=7;;
252) let nbits+=6;;
248) let nbits+=5;;
240) let nbits+=4;;
224) let nbits+=3;;
192) let nbits+=2;;
128) let nbits+=1;;
0);;
*) echo "Error: $dec is not recognised"; exit 1
esac
done
echo "$nbits"
}
## main ##
MASK=255.255.255.0
numbits=$(mask2cidr $MASK)
echo "/$numbits"
根据IP地址和子网淹码计算网络号和广播地址 (只能bash)
代码: 全选
#!/bin/bash
netcalc(){
local IFS='.' ip i
local -a oct msk
read -ra oct <<<"$1"
read -ra msk <<<"$2"
for i in ${!oct[@]}; do
ip+=( "$(( oct[i] & msk[i] ))" )
done
echo "${ip[*]}"
}
bcastcalc(){
local IFS='.' ip i
local -a oct msk
read -ra oct <<<"$1"
read -ra msk <<<"$2"
for i in ${!oct[@]}; do
ip+=( "$(( oct[i] + ( 255 - ( oct[i] | msk[i] ) ) ))" )
done
echo "${ip[*]}"
}
echo $(netcalc 192.168.1.1 255.255.255.0)
echo $(bcastcalc 192.168.1.1 255.255.255.0)