前言:遇到了一个需求——抓出ipv6地址所对应的网卡名。
分析:ip a与ifconfig显示的结果中没有网卡和ipv6地址的对应关系,所以想到去内存中匹配,但是内存中的ipv6地址与ip a看到的地址格式不同,因此需要做转化。即将2003:a:12:bcd:a3b4::200转化成2003000a00120bcda3b4000000000200,然后根据转化的结果在/proc/net/if_inet6中匹配出对应的网卡名。
#!/bin/bash
num=`(echo $addr6 | grep -o ":" | wc -l)`
echo $addr6 > /root/ipv6.tem
while [ $num -lt 6 ]
do
sed -i "s/::/:0000::/g" /root/ipv6.tem
let num++
done
if [ $num -eq 6 ]
then
sed -i "s/::/:0000:0000:/g" /root/ipv6.tem
fi
ip6str=`cat /root/ipv6.tem`
b=${ip6str//:/ }
rm -rf /root/ipv6.tem
arr=($b)
i=0
while [[ i -lt ${#arr[@]} ]]; do
arr[i]=`(echo ${arr[i]}|awk '{print strtonum("0x"$0)}'|awk '{printf("%04x\n",$0)}')`
let i++
done
ipv6=$(echo ${arr[@]}|sed 's/ //g')
interface=`(grep $ipv6 /proc/net/if_inet6 | awk '{print $NF}')`
后记:最近发现这段代码能否正常运行和shell版本有关,不同的shell还需进一步调整!