#!/usr/bin/env bash set -euo pipefail # 获取默认路由接口 IFACE=$( ip -4 route show default \ | awk 'NR == 1 {print $5}' ) if [[ -z "${IFACE:-}" ]]; then echo "错误:未找到默认路由接口" >&2 exit 1 fi # 获取默认路由接口上的 IPv4 地址: # 先匹配 192.168.*,没有则匹配 172.29.* IP=$( ip -4 -o addr show dev "$IFACE" scope global \ | awk ' { split($4, addr, "/") ip = addr[1] if (ip ~ /^192\.168\./ && ip_192 == "") { ip_192 = ip } if (ip ~ /^172\.29\./ && ip_172 == "") { ip_172 = ip } } END { if (ip_192 != "") { print ip_192 } else if (ip_172 != "") { print ip_172 } } ' ) if [[ -z "${IP:-}" ]]; then echo "错误:接口 ${IFACE} 上未找到 192.168.* 或 172.29.* 地址" >&2 exit 1 fi # 拆分 IP IFS='.' read -r OCTET1 OCTET2 OCTET3 OCTET4 <<< "$IP" # 按 /20 网段判断区域 case "$OCTET3" in 16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31) REGION="idc" ;; 48|49|50|51|52|53|54|55|56|57|58|59|60|61|62|63) REGION="sz" ;; 64|65|66|67|68|69|70|71|72|73|74|75|76|77|78|79) REGION="bj" ;; 80|81|82|83|84|85|86|87|88|89|90|91|92|93|94|95) REGION="sh" ;; 96|97|98|99|100|101|102|103|104|105|106|107|108|109|110|111) REGION="cd" ;; *) echo "错误:IP ${IP} 不属于已配置的区域网段" >&2 exit 1 ;; esac SYSTEM_NAME="${REGION}-${IP//./-}" echo "hostnamectl set-hostname $SYSTEM_NAME" echo "$SYSTEM_NAME"