You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

请求编写WiFi自动连接脚本:通过命令行传入参数实现连接

没问题,我来给你梳理下怎么写这个WiFi自动连接脚本,分Linux和macOS两种常见场景给你示例,毕竟不同系统的网络配置逻辑不太一样,咱们一步步来~

一、脚本核心思路

先明确几个关键要点,避免踩坑:

  • 参数校验不能少:得先检查用户传的参数够不够,至少得有SSID和密码,IP、子网掩码这些是可选的(默认用DHCP)
  • 区分操作系统:Linux和macOS的WiFi配置命令完全不同,得针对性处理
  • 兼容DHCP/静态IP:用户传了IP等参数就配置静态模式,没传就自动用DHCP获取
二、Linux环境示例脚本(基于NetworkManager)

现在大部分Linux发行版都用NetworkManager管理网络,用nmcli命令操作最省心,不用手动搞wpa_supplicant配置文件。下面是完整脚本:

#!/bin/bash

# 检查参数数量,至少需要SSID和密码
if [ $# -lt 2 ]; then
    echo "用法错误!请按以下格式执行:"
    echo "DHCP模式: ./script.sh <SSID> <密码>"
    echo "静态IP模式: ./script.sh <SSID> <密码> <IP地址> <子网掩码> <DHCP开关(yes/no)> <DNS服务器(多个用逗号分隔)>"
    exit 1
fi

# 定义变量
SSID="$1"
PASSWORD="$2"
IP_ADDR="$3"
NETMASK="$4"
DHCP_MODE="${5:-yes}"  # 默认开启DHCP
DNS_SERVERS="$6"

# 获取WiFi接口名称(一般是wlan0或wlp2s0,自动检测)
WIFI_INTERFACE=$(nmcli device status | grep wifi | awk '{print $1}')
if [ -z "$WIFI_INTERFACE" ]; then
    echo "未找到可用的WiFi接口!"
    exit 1
fi

echo "正在连接WiFi: $SSID..."
# 先断开当前可能的WiFi连接
nmcli device disconnect "$WIFI_INTERFACE"
# 连接目标WiFi
nmcli device wifi connect "$SSID" password "$PASSWORD"

if [ "$DHCP_MODE" = "no" ]; then
    if [ -z "$IP_ADDR" ] || [ -z "$NETMASK" ]; then
        echo "静态IP模式下必须提供IP地址和子网掩码!"
        exit 1
    fi
    echo "配置静态IP: $IP_ADDR/$NETMASK..."
    # 配置静态IP
    nmcli connection modify "$SSID" ipv4.method manual ipv4.addresses "$IP_ADDR/$NETMASK"
    # 配置DNS(如果用户提供了)
    if [ -n "$DNS_SERVERS" ]; then
        nmcli connection modify "$SSID" ipv4.dns "$DNS_SERVERS"
    fi
    # 重启连接生效
    nmcli connection down "$SSID" && nmcli connection up "$SSID"
else
    echo "使用DHCP自动获取IP地址..."
    nmcli connection modify "$SSID" ipv4.method auto
    nmcli connection up "$SSID"
fi

echo "WiFi连接配置完成!"
三、macOS环境示例脚本

macOS用networksetup命令管理网络,脚本逻辑类似:

#!/bin/bash

# 参数检查
if [ $# -lt 2 ]; then
    echo "用法错误!请按以下格式执行:"
    echo "DHCP模式: ./script.sh <SSID> <密码>"
    echo "静态IP模式: ./script.sh <SSID> <密码> <IP地址> <子网掩码> <DHCP开关(yes/no)> <DNS服务器(多个用空格分隔)>"
    exit 1
fi

# 定义变量
SSID="$1"
PASSWORD="$2"
IP_ADDR="$3"
NETMASK="$4"
DHCP_MODE="${5:-yes}"
DNS_SERVERS="$6"

# WiFi接口名称,一般是en0(可以用networksetup -listallhardwareports确认)
WIFI_INTERFACE="en0"

echo "正在连接WiFi: $SSID..."
# 断开当前WiFi
networksetup -setairportpower "$WIFI_INTERFACE" off
sleep 2
networksetup -setairportpower "$WIFI_INTERFACE" on
# 连接目标WiFi
networksetup -setairportnetwork "$WIFI_INTERFACE" "$SSID" "$PASSWORD"

if [ "$DHCP_MODE" = "no" ]; then
    if [ -z "$IP_ADDR" ] || [ -z "$NETMASK" ]; then
        echo "静态IP模式下必须提供IP地址和子网掩码!"
        exit 1
    fi
    echo "配置静态IP: $IP_ADDR 子网掩码: $NETMASK..."
    # 配置静态IP
    networksetup -setmanual "$WIFI_INTERFACE" "$IP_ADDR" "$NETMASK" ""
    # 配置DNS
    if [ -n "$DNS_SERVERS" ]; then
        networksetup -setdnsservers "$WIFI_INTERFACE" $DNS_SERVERS
    fi
else
    echo "使用DHCP自动获取IP地址..."
    networksetup -setdhcp "$WIFI_INTERFACE"
    networksetup -setdnsservers "$WIFI_INTERFACE" Empty  # 清空自定义DNS,用DHCP分配的
fi

echo "WiFi连接配置完成!"
四、使用步骤
  1. 把上面的脚本保存为wifi_connect.sh
  2. 给脚本加执行权限:
    chmod +x wifi_connect.sh
    
  3. 执行脚本(需要root权限,加sudo):
    • DHCP模式(只传SSID和密码):
      sudo ./wifi_connect.sh "MyHomeWiFi" "MySecurePass123"
      
    • 静态IP模式:
      sudo ./wifi_connect.sh "OfficeWiFi" "OfficePass456" "192.168.2.30" "255.255.255.0" "no" "192.168.2.1 8.8.8.8"
      
五、注意事项
  • 必须用sudo执行,因为修改网络配置需要管理员权限
  • Linux下如果你的系统没装NetworkManager(比如服务器版的Debian/Ubuntu),可以改用wpa_supplicant,不过步骤会复杂些,需要生成配置文件再启动服务
  • macOS下如果WiFi接口不是en0,可以用networksetup -listallhardwareports命令查看正确的接口名称
  • 脚本里的参数如果包含空格,一定要用双引号括起来,比如带空格的SSID:"My Home WiFi"

内容的提问来源于stack exchange,提问作者SegmentationFault

火山引擎 最新活动