Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1669100
  • 博文数量: 636
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 3950
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-06 21:58
个人简介

博客是我工作的好帮手,遇到困难就来博客找资料

文章分类

全部博文(636)

文章存档

2024年(5)

2022年(2)

2021年(4)

2020年(40)

2019年(4)

2018年(78)

2017年(213)

2016年(41)

2015年(183)

2014年(66)

我的朋友

分类: 服务器与存储

2014-11-27 15:31:12

1. IP转换为整数
 vi ip2num.sh
#!/bin/bash
# 所有用到的命令全是bash内建命令

IP_ADDR=$1
[[ "$IP_ADDR" =~ "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" ]] || { echo "ip format error."; exit 1; }

IP_LIST=${IP_ADDR//./ };
read -a IP_ARRAY <<<${IP_LIST};      

# 把点分十进制地址拆成数组(read的-a选项表示把输入读入到数组, 下标从0开始)

echo $(( ${IP_ARRAY[0]}<<24 | ${IP_ARRAY[1]}<<16 | ${IP_ARRAY[2]}<<8 | ${IP_ARRAY[3]} ));       # bash的$(()) 支持位运算

HEX_STRING=$(printf "0X%02X%02X%02X%02X\n" ${IP_ARRAY[0]} ${IP_ARRAY[1]} ${IP_ARRAY[2]} ${IP_ARRAY[3]});     

# 这里演示另外一种不使用位运算的方法
printf "%d\n" ${HEX_STRING};

# 参考自:http://hi.baidu.com/test/blog/item/8af8513da98b72eb3d6d9740.html
# 可以使用mysql的select inet_aton('${IP_ADDR}'); 来验证结果是否正确。


2. 整数转换为IP


> vi num2ip.sh
#!/bin/bash

N=$1

H1=$(($N & 0x000000ff))
H2=$((($N & 0x0000ff00) >> 8))
L1=$((($N & 0x00ff0000) >> 16))
L2=$((($N & 0xff000000) >> 24))

echo $L2.$L1.$H2.$H1

或者
#!/bin/bash

N=$1
declare -i H1="$N & 0x000000ff"
declare -i H2="($N & 0x0000ff00) >> 8"
declare -i L1="($N & 0x00ff0000) >> 16"
declare -i L2="($N & 0xff000000) >> 24"

echo "$L2.$L1.$H2.$H1"

# The variable is treated as an integer; arithmetic evaluation (see ARITHMETIC EVALUATION ) is performed when the variable is assigned a value.
# 参考自:


3. 把掩码长度转换成掩码
# 可以根据2修改下, 255.255.255.255的整型值是4294967295
#!/bin/bash

declare -i FULL_MASK_INT=4294967295
declare -i MASK_LEN=$1
declare -i LEFT_MOVE="32 - ${MASK_LEN}"

declare -i N="${FULL_MASK_INT} << ${LEFT_MOVE}"

declare -i H1="$N & 0x000000ff"
declare -i H2="($N & 0x0000ff00) >> 8"
declare -i L1="($N & 0x00ff0000) >> 16"
declare -i L2="($N & 0xff000000) >> 24"

echo "$L2.$L1.$H2.$H1"


4. 计算网络地址和广播地址


#!/bin/bash

all=( }) #

[ "${#all[@]}" != "8" ] && { 
        echo "Usage: " 
        echo "${0##*/} ip.ip.ip.ip/mask.mask.mask.mask" 
        exit 1 

# 定義一個 get_add 的 function 
get_addr () { 
        if [ "$1" = "-b" ]; then  # 要是讀進的第一個 function 參數為 -b ,則設定 op, op1, 與 arg 的變量,以供後面的 $(( $1 $op ($5 $op1 $arg) )) 計算用。
                op='|'; op1='^'; arg='255'   # 其結則為 $(( $1 | ($5 ^ 255) )),也就是逐個算出 broadcast address 。
                shift   # 然後用 shift 拿掉這個 -b 。
        else # 若沒有 -b 參數,則只定義 op 變量。然則,$(( $1 $op ($5 $op1 $arg) )) 的實際算式就變成 $(( $1 & $5)),這會逐個算出 network address 。
                op='&' 
        fi 
        unset address                               # 取消變量 address ,以免影嚮其後於 while loop 的運算。
        while [ "$5" ]; do                          # 假如能讀到第 5 個參數,才進入 while loop,否則離開。
                num=$(( $1 $op ($5 $op1 $arg) ))    # 跟據前面的 -b 參數,來決定要算出 broadcast 還是 network 。因為前 4 個參數是 ip 後 4 個是 mask ,因此第一個參數跟第五個參數來算就能得出第一組 ip/mask 的計算結果。
                shift                               # 再拿掉第一個參數,這可讓下一次 looping 計算下一組 ip/mask 。當 shift 4 次之後,while loop 就可結束。
                address="$address.$num"             # 將每次的計算結果擴充在 address 變量中。(注意:如此的話,最後結果前面會有一個小數點,我們後面再處理)
        done 
}

get_addr ${all[@]}                  # 跑 function 來計算 network address :
echo -e "network:\t${address#.}"    # echo -e 可以用 \t 送出一個 鍵。${address#.} 則是拿掉最前面的小點。 
get_addr -b ${all[@]}               # 跑 function 來計算 broadcast address :

echo -e "broadcast:\t${address#.}"


阅读(1406) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~