Linux上需要自动探测通信的网卡名称,有时会有多网卡
方案一
通过ip命令提取默认路由,来找到默认通信的网卡
获取IP命令:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
if [[ "$useIPV6" == "true" ]]; then ip_r=$(ip -6 r g 2000::1) LOCAL_IP=$(grep -oP "src \S+ " < <(echo $ip6_r) | sed 's/src //' | awk '{gsub(/^\s+|\s+$/, "");print}') if [ "X$LOCAL_IP" == "X" ]; then LOCAL_IP=$(ip add | grep -w inet6 | grep -v ::1 | awk NR==1'{print $2}' | cut -d "/" -f 1) fi else ip_r=$(ip r g 1.0.0.0) LOCAL_IP=$(grep -oP "src \S+ " < <(echo $ip_r) | sed 's/src //' | awk '{gsub(/^\s+|\s+$/, "");print}') if [ "X$LOCAL_IP" == "X" ] || (! echo $LOCAL_IP | grep -Eq '^([0-9]{1,3}\.){3}[0-9]{1,3}$'); then LOCAL_IP=$(ip add | grep -w inet | grep -v 127.0.0.1 | awk NR==1'{print $2}' | cut -d "/" -f 1) fi fi fi |
获取网卡名称
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
function get_cfgname(){ ipa_info=$(ip a) line=$(echo "${ipa_info}" | sed -n -e "/\<${LOCAL_IP}\>/=") detect_cfgname=$(echo "${ipa_info}" | sed -n "1,${line}p" | grep '^[0-9]' | sed -n '$p' | awk -F ':| ' '{print $3}') echo $detect_cfgname } function interface_check() { cfgname=$(get_cfgname) # 判断网卡名称,此变量由环境变量传过来,如没有传时,则根据ip来反推网卡名称 if [ "X$ifCfgName" == "X" ]; then ifCfgName=$cfgname if [ "X$ifCfgName" != "X" ]; then echo_color info "经自动探测,服务器网卡名称为:${ifCfgName}" else echo_color error "服务器网卡名称:${ifCfgName} 不存在, 请再次确认!" exit 1 fi elif [ "$ifCfgName" != "$cfgname" ]; then detect_ipaddr=$(ip addr | awk '/inet/ && ! /\/32/ {ip[$NF] = $2; sub(/\/.*$/,"",ip[$NF])} END {for(i in ip){if(i ~ "'$ifCfgName'") print ip[i]}}') if [ "$LOCAL_IP" != "$detect_ipaddr" ]; then echo_color warning "填的网卡名称是$ifCfgName,跟探测的网卡名称$cfgname 不一致,请再次确认!" exit 1 fi else echo_color info "填写的服务器网卡名称为:${ifCfgName}" fi write_restore_end } |
方案二
通过ansible_default_ipv4变量
获取IP:
1 2 3 4 5 6 7 8 9 |
if [[ "$useIPV6" == "true" ]]; then filter=ansible_default_ipv6 else filter=ansible_default_ipv4 fi # define parameters of address and interface eval $(ansible localhost -m setup -a 'gather_subset=!all,network filter='$filter''|egrep "\"interface\"|\"address\""|awk -F': ' '{gsub(/"|,| /,"",$0);gsub(/:/,"=",$0);print $0}') LOCAL_IP=$address |
获取网卡名称:
1 2 3 4 5 6 7 8 9 10 |
# 判断网卡名称,此变量由环境变量传过来,如没有传时,则提取ansible_default_ipv4变量 if [ "X$ifCfgName" == "X" ]; then ifCfgName=$interface echo_color info "经自动探测,服务器网卡名称为:${ifCfgName}" elif [ "$ifCfgName" != "$interface" ]; then echo_color warning "填的网卡名称是$ifCfgName,跟探测的网卡名称$interface 不一致,请再次确认!" exit 1 else echo_color info "填写的服务器网卡名称为:${ifCfgName}" fi |
0 Comments