#!/bin/bash
pwd_dir=$(pwd)
aa=$0
if [[ $aa == .* ]];then
bb=${pwd_dir}${aa#.*}
elif [[ $aa == /* ]];then
bb=$aa
fi
path=${bb%/*}
netmask=''
PREFIX='11111111'
SUFFIX='00000000'
binary_netmask=''
decimal_netmask=''
num_netmask=''
#len=`echo ${#netmask}`
# 用长度匹配
binary_num_compute(){
num_netmask=`echo ${binary_netmask}|awk '{print gsub(/1/,"x")}'`
}
binary_decimal_compute(){
for num in `echo $binary_netmask|tr '.' ' '`;do
mask=$[2#${num}]
if [ -z "$decimal_netmask" ];then
decimal_netmask="${mask}"
else
decimal_netmask="${decimal_netmask}.${mask}"
fi
done
}
decimal_binary_compute(){
for mask in `echo $netmask|tr '.' ' '`;do
num=$mask
result=''
while [ $num -gt 0 ]; do
remainder=$[num%2]
result="${remainder}${result}"
num=$[$num/2]
done
if [ -z "${binary_netmask}" ]; then
binary_netmask="${result}"
elif [ -z "${result}" ]; then
binary_netmask="${binary_netmask}.${SUFFIX}"
else
binary_netmask="${binary_netmask}.${result}"
fi
done
}
num_binary_compute(){
for idx in {1..32};do
if [ $idx -le $netmask ];then
binary_netmask+='1'
else
binary_netmask+='0'
fi
flag=$[idx%8]
[ $flag -eq 0 -a $idx -ne 32 ] && binary_netmask+='.'
done
}
compute(){
if [[ -z "${netmask}" || "${netmask}" == "0" ]];then
echo "netmask format error!"
exit 1
fi
# 网络位
if [ ${len} -le 2 ]; then
num_netmask=${netmask}
num_binary_compute
binary_decimal_compute
# 十进制
elif [ ${len} -le 15 ]; then
B0=`echo ${netmask} | awk -F. '{print $4}'`
B1=`echo ${netmask} | awk -F. '{print $3}'`
B2=`echo ${netmask} | awk -F. '{print $2}'`
B3=`echo ${netmask} | awk -F. '{print $1}'`
nn=`echo ${netmask} | awk -F. '{print(NF)}'`
if [ $nn -ne 4 ];then
echo "[x] netmask format error!"
exit 1
fi
if [ $B0 -gt 255 ] || [ $B1 -gt 255 ]|| [ $B2 -gt 255 ]|| [ $B3 -gt 255 ];then
echo "[x] netmask format error!"
exit 1
fi
decimal_netmask=${netmask}
decimal_binary_compute
binary_num_compute
# 二进制
elif [ ${len} -eq 35 ]; then
binary_netmask=${netmask}
binary_decimal_compute
binary_num_compute
else
echo "[x] netmask format error!"
exit 1
fi
}
parse_file()
{
#input="/root/.wasion/container/list.conf"
input=$1
port=""
ip_str=""
netmask=""
dhcp=""
netmask=''
PREFIX='11111111'
SUFFIX='00000000'
binary_netmask=''
decimal_netmask=''
num_netmask=''
while IFS= read -r line
do
[[ $line =~ ^#.* ]] && continue
[ -z "$line" ] && continue
tmp=`echo $line | grep iface | awk '{print $2}'`
[ ! -z $tmp ] && port=$tmp
tmp=`echo $line | grep iface | awk '{print $4}'`
[ ! -z $tmp ] && dhcp=$tmp
tmp=`echo $line | grep address | awk '{print $2}'`
[ ! -z $tmp ] && ip_str=$tmp
tmp=`echo $line | grep netmask | awk '{print $2}'`
[ ! -z $tmp ] && netmask=$tmp
done < "$input"
if [ -z "$port" ] ;then
return 0
fi
if [ x$dhcp == "xdhcp" ];then
/usr/sbin/dhclient $port
return 0
fi
if [ -z "$ip_str" ] || [ -z "$netmask" ] ;then
return 0
fi
len=`echo ${#netmask}`
compute
ip_str+="/$num_netmask"
echo "ip link set $port down"
echo "ip addr flush dev $port"
echo "ip addr add $ip_str dev $port"
echo "ip link set $port up"
ip link set $port down
ip addr flush dev $port
ip addr add $ip_str dev $port
ip link set $port up
}
for file in `ls $path/*_interfaces`
do
if [ -f $file ];then
parse_file $file
fi
done
ipv4格式解析 shell
最新推荐文章于 2024-06-25 19:05:21 发布