在 shell 脚本获取 ip、数字转换等网络操作
-
ip 和数字的相互转换
ip转换为数字 ::
function ip2num() {
local ip=$1
local a=$(echo $ip | awk -F '.' '{print $1}')
local b=$(echo $ip | awk -F '.' '{print $2}')
local c=$(echo $ip | awk -F '.' '{print $3}')
local d=$(echo $ip | awk -F '.' '{print $4}')
echo "$(( (a<<24)+(b<<16)+(c<<8)+d ))"
}数字转换为 ip ::
function num2ip() {
local num=$1
local a=$((num>>24))
local b=$((num>>16&0xff))
local c=$((num>>8&0xff))
local d=$((num&0xff))
echo "$a.$b.$c.$d"
}CIDR 前缀转换为子网掩码数字 ::
function prefix2masknum() {
local prefix=$1
local i=31
local k=0
local mask=0
while [ $k -lt $prefix ]; do
bit=$(( 1 << (i-k) ))
mask=$(( mask+bit ))
k=$(( k+1 ))
done
echo $mask
}然后可用
num2ip
将子网掩码数字转换为 ip 形式num2ip $(prefix2masknum <CIDR 前缀长度,如24>)
-
从网卡获取第一个 ipv4 地址和 CIDR 前缀
获取第一个 ipv4 地址,CIDR 前缀
function get_ip() {
local dev=$1
local ip_cidr=$(ip addr show dev $dev | grep "inet[[:blank:]]") |\
head -n 1 | awk '{print $2}'
echo ${ip_cidr%/*}
} function get_prefix() {
local dev=$1
local ip_cidr=$(ip addr show dev $dev | grep "inet[[:blank:]]") |\
head -n 1 | awk '{print $2}'
echo ${ip_cidr#*/}
}