请求编写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连接配置完成!"
四、使用步骤
- 把上面的脚本保存为
wifi_connect.sh - 给脚本加执行权限:
chmod +x wifi_connect.sh - 执行脚本(需要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"
- DHCP模式(只传SSID和密码):
五、注意事项
- 必须用sudo执行,因为修改网络配置需要管理员权限
- Linux下如果你的系统没装NetworkManager(比如服务器版的Debian/Ubuntu),可以改用
wpa_supplicant,不过步骤会复杂些,需要生成配置文件再启动服务 - macOS下如果WiFi接口不是
en0,可以用networksetup -listallhardwareports命令查看正确的接口名称 - 脚本里的参数如果包含空格,一定要用双引号括起来,比如带空格的SSID:
"My Home WiFi"
内容的提问来源于stack exchange,提问作者SegmentationFault




