[分享]分享几个用于IP地址转换,子网淹码计算的sh

系统安装、升级讨论
版面规则
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
回复
zhangjint5
帖子: 304
注册时间: 2011-01-02 12:31

[分享]分享几个用于IP地址转换,子网淹码计算的sh

#1

帖子 zhangjint5 » 2018-03-07 21:16

最近写sh涉及到ISC DHCP 配置文件生成

由于涉及到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)

回复