#!/bin/bash # ============================================================================ # auto-wifi-connect.sh — 开机自动连接 WiFi # # 优先级:openwrt_5G > kskbl_2.4G # 扫描可用网络,优先连接 5G 热点,不可用时回退到 2.4G # # 退出码: # 0 — 成功连接 # 1 — NetworkManager 未就绪(超时) # 2 — 两个热点均不可用 # 3 — 连接失败 # ============================================================================ PRIMARY="openwrt_5G" FALLBACK="kskbl_2.4G" WIFI_PASSWORD="11112222" MAX_WAIT=30 # 最多等 NetworkManager 就绪的秒数 SCAN_WAIT=3 # WiFi 扫描后的等待秒数 log() { echo "[auto-wifi] $(date '+%H:%M:%S') $*" | tee /dev/kmsg 2>/dev/null } # ── 等待 NetworkManager 就绪 ── log "等待 NetworkManager 就绪..." for i in $(seq 1 $MAX_WAIT); do state=$(nmcli -t -f STATE general status 2>/dev/null) if [ -n "$state" ]; then log "NetworkManager 状态: $state" break fi sleep 2 done if [ -z "$state" ]; then log "错误: NetworkManager 在 ${MAX_WAIT}s 内未就绪" exit 1 fi # ── 获取 WiFi 网卡名 ── WIFI_IFACE=$(nmcli -t -f DEVICE,TYPE device status 2>/dev/null | grep ':wifi$' | cut -d: -f1 | head -1) if [ -z "$WIFI_IFACE" ]; then log "错误: 未找到 WiFi 网卡" exit 2 fi log "WiFi 网卡: $WIFI_IFACE" # ── 先检查是否已经连接到目标热点 ── current=$(nmcli -t -f GENERAL.CONNECTION device show "$WIFI_IFACE" 2>/dev/null | cut -d: -f2) if [ "$current" = "$PRIMARY" ] || [ "$current" = "$FALLBACK" ]; then log "已连接到 $current,无须切换" exit 0 fi # ── 扫描 WiFi ── log "正在扫描 WiFi..." nmcli device wifi rescan 2>/dev/null sleep $SCAN_WAIT # ── 检查 PRIMARY 是否可见 ── if nmcli -t -f SSID device wifi list 2>/dev/null | grep -qx "$PRIMARY"; then TARGET="$PRIMARY" log "检测到 $PRIMARY" else TARGET="$FALLBACK" log "$PRIMARY 不可用,回退到 $TARGET" fi # ── 连接 ── log "正在连接 $TARGET ..." if nmcli device wifi connect "$TARGET" password "$WIFI_PASSWORD" ifname "$WIFI_IFACE" 2>&1; then log "成功连接到 $TARGET" exit 0 else log "错误: 无法连接到 $TARGET" exit 3 fi