最近由于一个项目需要,写了一个获取centos7 ip的bash脚本,花了一两天的时间研究,记录下。
目录
-
查ip的方式:
在最小化装完centos系统后,系统能查询到ip的方式也就是 ip a
根据网卡名称,可以判断出 ens32就是网卡名称,那么下面的 inet 192.168.18.122 也就是ip地址了,至于其他两个都是虚拟的网卡。
所以可以根据网卡名称使用 ip a 命令来找到对应的 ip,下面说如何获取网卡名称。 -
查网卡名称
正常来说,配置网卡信息是在 /etc/sysconfig/network-scripts 目录下配置,上面截图中对应的网卡名称为:ifcfg-ens32,查看该文件:
在这个文件里可以看到网卡名称是在文件里配置好的。
在这个目录下 /sys/class/net 存储了所有网卡的名称,包括物理网卡和虚拟网卡:
每个文件都是一个符号链接文件,根据最终指向的文件可以看出来,所有的虚拟网卡都在 /sys/devices/virtual/net/ 目录下。
那么首先获取出所有的物理网卡名称:
ls /sys/class/net | grep -v "`ls /sys/devices/virtual/net/`"
-
根据网卡名称获取 ip 地址
对于单网卡,上述命令获取到的网卡名称为一个名称,如果是多网卡,例如双网卡:
获取到的是两个物理网卡名,所以应该循环去找到每一个网卡对应的ip,脚本如下:
#!/bin/bash
# 获取ip地址
function getIP() {
# /sys/class/net 目录下存储了所有网卡信息,子目录均为网卡名,
# /sys/devices/virtual/net/ 目录下存储了所有的虚拟网卡名
NETWORK_CARD_NAME=`ls /sys/class/net | grep -v "\`ls /sys/devices/virtual/net/\`"`
for net_name in $NETWORK_CARD_NAME
do
possible_ip=`ip a | sed "/$net_name$/p" -n | awk '{print $2}'| awk -F/ '{print$1}'`
if [ $possible_ip ]; then
echo "ip为$possible_ip,网卡名称为$net_name"
fi
done
}
# 打印
for ip in `getIP`
do
echo "$ip"
done
-
测试验证
对于单网卡:
对于多网卡:
测试成功,可以获取到物理网卡的ip。