参考:
基础状态查询
如下
# 查看WiFi网卡状态(wlan0为网卡名,按需替换) wpa_cli -i wlan0 status # 扫描周边WiFi wpa_cli -i wlan0 scan # 查看扫描结果(SSID、信号强度、加密方式) wpa_cli -i wlan0 scan_results # 查看已配置的网络列表(显示网络ID、SSID、是否启用) wpa_cli -i wlan0 list_networks更多待补充
连接网络
使用wpa_cli指令来连接某个网络,要怎么做
1. 使用
wpa_cli连接 WiFi 网络的完整步骤
wpa_cli是用于控制wpa_supplicant(WiFi 认证服务)的命令行工具,适用于 Linux 系统(嵌入式 / 桌面端),以下是通用且可直接执行的连接流程:前置条件
- 确保
wpa_supplicant已运行(后台服务),且 WiFi 网卡已启用(如wlan0);- 知道 WiFi 的SSID (网络名称)和密码(WPA/WPA2 加密);
- 以
root权限执行(嵌入式系统默认 root,桌面端需加sudo)。步骤 1:进入 wpa_cli 交互模式(推荐)
# 进入交互模式(指定WiFi网卡,通常是wlan0) wpa_cli -i wlan0进入后会看到提示符
>,后续命令在交互模式内执行。步骤 2:添加 WiFi 网络配置
# 添加新的网络配置(会返回网络ID,如0) > add_network # 设置WiFi名称(SSID),替换为你的网络名(注意引号) > set_network 0 ssid "你的WiFi名称" # 设置WiFi密码,替换为你的密码(注意引号) > set_network 0 psk "你的WiFi密码" # 可选:强制使用WPA2加密(兼容多数网络) > set_network 0 proto WPA2 > set_network 0 key_mgmt WPA-PSK # 启用该网络配置 > enable_network 0 # 保存配置到wpa_supplicant.conf(避免重启后失效) > save_config # 退出交互模式 > quit步骤 3:获取 IP 地址(DHCP)
# 释放旧IP(可选) dhclient -r wlan0 # 获取新IP(核心步骤) dhclient wlan0 # 或嵌入式系统常用:udhcpc -i wlan0步骤 4:验证连接状态
# 查看WiFi连接状态 wpa_cli -i wlan0 status # 测试网络连通性 ping 8.8.8.82. 非交互模式(一键执行,适合脚本)
如果不想进入交互模式,可直接用单行命令批量执行:
# 替换SSID和密码,一键配置并连接 wpa_cli -i wlan0 add_network > /tmp/network_id && \ wpa_cli -i wlan0 set_network $(cat /tmp/network_id) ssid "\"你的WiFi名称\"" && \ wpa_cli -i wlan0 set_network $(cat /tmp/network_id) psk "\"你的WiFi密码\"" && \ wpa_cli -i wlan0 enable_network $(cat /tmp/network_id) && \ wpa_cli -i wlan0 save_config && \ dhclient wlan03. 常见问题与解决
提示
Failed to connect to wpa_supplicant:
- 原因:
wpa_supplicant未运行,或网卡名错误;- 解决:启动服务
wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf。连接后无 IP 地址:
- 原因:DHCP 未获取到 IP;
- 解决:重启 DHCP 客户端
systemctl restart dhcpcd(桌面端)或udhcpc -i wlan0(嵌入式)。密码正确但认证失败:
原因:加密方式不匹配(如网络是 WPA,配置了 WPA2);
解决:删除加密强制配置,让系统自动适配:
wpa_cli -i wlan0 set_network 0 proto WPA WPA2 wpa_cli -i wlan0 enable_network 0总结
- 核心流程:
进入wpa_cli交互模式 → 添加网络 → 设置SSID/密码 → 启用网络 → 保存配置 → 获取DHCP IP;- 交互模式适合手动操作,非交互模式适合脚本批量执行;
- 连接后通过
wpa_cli status验证状态,ping测试网络连通性。
wpa_cli指令里的0是啥意思?
在
wpa_cli指令中,你看到的数字0是 WiFi 网络配置的唯一标识 ID(Network ID) ,可以把它理解为「WiFi 配置项的编号」,核心作用是让wpa_supplicant知道你要操作哪一个 WiFi 配置(因为系统中可以配置多个 WiFi)。一、为什么会出现「0」?
当你用
wpa_cli add_network添加新 WiFi 配置时,wpa_supplicant会自动为这个新配置分配一个从 0 开始递增的数字 ID(第一个配置是 0,第二个是 1,第三个是 2,以此类推)。后续所有针对这个 WiFi 的操作(设置 SSID / 密码、启用 / 禁用、删除),都需要通过这个 ID 指定操作对象。二、「0」的具体使用场景(核心示例)
指令 「0」的含义 完整说明 set_network 0 ssid "MyWiFi"操作 ID 为 0 的 WiFi 配置 给编号 0 的 WiFi 配置项设置 SSID(WiFi 名称) set_network 0 psk "123456"操作 ID 为 0 的 WiFi 配置 给编号 0 的 WiFi 配置项设置密码 enable_network 0启用 ID 为 0 的 WiFi 配置 让系统尝试连接编号 0 的 WiFi disable_network 0禁用 ID 为 0 的 WiFi 配置 断开编号 0 的 WiFi 连接,且不再自动连接 remove_network 0删除 ID 为 0 的 WiFi 配置 彻底删除编号 0 的 WiFi 配置项(需 save_config 生效) 三、如何确认「0」对应的是哪个 WiFi?
如果不确定 ID 对应的 WiFi(比如配置了多个),可以用以下指令查看所有配置的 ID 和对应 SSID:
# 列出所有已配置的WiFi(重点看第一列的ID、第二列的SSID) wpa_cli -i wlan0 list_networks输出示例:
network id / ssid / bssid / flags 0 MyHomeWiFi any [ENABLED] 1 OfficeWiFi any [DISABLED] 2 PublicWiFi any [DISABLED]从输出能清晰看到:
- ID=0 对应「MyHomeWiFi」(已启用);
- ID=1 对应「OfficeWiFi」(已禁用);
- 此时操作
enable_network 1就会切换到「OfficeWiFi」。四、关键注意事项
- ID 是临时 + 永久的 :添加配置时分配的 ID,只要不删除配置,重启
wpa_supplicant后仍保持不变;- 不一定必须是 0:0 只是「第一个添加的 WiFi」的默认 ID,如果你添加第二个 WiFi,ID 会是 1,操作时需用 1 替代 0;
- 无 ID 操作会报错 :比如直接执行
set_network ssid "MyWiFi"(少了 ID),会提示「ERROR: invalid command arguments」,因为系统不知道要操作哪个 WiFi。总结
wpa_cli中的「0」是WiFi 配置项的 ID,是操作特定 WiFi 的 "唯一标识";- ID 由
add_network自动分配(从 0 开始递增),可通过list_networks查看所有 ID 和对应 WiFi;- 所有针对具体 WiFi 的操作(设密码、启用 / 禁用、删除),都必须指定这个 ID,否则系统无法定位操作对象。
每次添加一个wifi,都要手动指定编号吗,可以每次都用0吗?核心结论
不需要手动指定编号,也不建议每次都强行用 0 ------ 编号(Network ID)是
wpa_supplicant自动分配的,强行复用 0 会导致旧配置被覆盖 / 冲突,正确做法是用add_network获取自动分配的 ID,再基于该 ID 操作。一、为什么不用手动指定编号?
add_network指令的核心作用就是自动生成唯一的 Network ID,流程如下:
# 1. 执行add_network,系统返回一个未被使用的ID(首次是0,第二次是1,依此类推) wpa_cli -i wlan0 add_network # 输出示例:0 (首次添加)/ 1(第二次添加)/ 2(第三次)... # 2. 直接用返回的ID配置WiFi(无需手动想编号) wpa_cli -i wlan0 set_network 0 ssid "WiFi1" # 首次自动分配0 wpa_cli -i wlan0 set_network 1 ssid "WiFi2" # 第二次自动分配1手动指定编号完全没必要,系统会保证 ID 的唯一性,避免冲突。
二、可以每次都用 0 吗?(不推荐!)
1. 强行用 0 的两种场景及问题
场景 1:未删除旧的 0 号配置时,复用 0 若 0 号已配置过 WiFi1,直接执行
set_network 0 ssid "WiFi2",会覆盖 0 号的原有配置(WiFi1 的配置被清空,替换为 WiFi2),相当于 "修改旧配置" 而非 "添加新配置",最终系统里只有 WiFi2,WiFi1 的配置会丢失。场景 2:先删除 0 号,再复用 0 虽然可以通过
remove_network 0删除旧配置,再重新add_network(此时会重新分配 0),但属于 "多此一举",且容易误操作(比如忘记删除就复用,导致配置覆盖)。2. 强行用 0 的实操示例(反面教材)
# 1. 首次添加WiFi1,自动分配0 wpa_cli -i wlan0 add_network # 输出0 wpa_cli -i wlan0 set_network 0 ssid "WiFi1" wpa_cli -i wlan0 enable_network 0 # 2. 想添加WiFi2,强行用0(未删除旧配置) wpa_cli -i wlan0 set_network 0 ssid "WiFi2" # 覆盖WiFi1的配置 wpa_cli -i wlan0 enable_network 0 # 3. 查看配置列表,只有WiFi2,WiFi1已被覆盖 wpa_cli -i wlan0 list_networks # 输出:0 WiFi2 any [ENABLED]三、正确的 "添加多个 WiFi" 姿势(推荐)
无需关注 ID 数字,让系统自动分配,通过
list_networks确认 ID 即可:
# 步骤1:添加第一个WiFi(自动分配ID=0) NET_ID1=$(wpa_cli -i wlan0 add_network) # 捕获自动分配的ID wpa_cli -i wlan0 set_network $NET_ID1 ssid "WiFi1" wpa_cli -i wlan0 set_network $NET_ID1 psk "Pass123" wpa_cli -i wlan0 enable_network $NET_ID1 # 步骤2:添加第二个WiFi(自动分配ID=1) NET_ID2=$(wpa_cli -i wlan0 add_network) wpa_cli -i wlan0 set_network $NET_ID2 ssid "WiFi2" wpa_cli -i wlan0 set_network $NET_ID2 psk "Pass456" wpa_cli -i wlan0 enable_network $NET_ID2 # 步骤3:查看所有配置(确认ID和SSID对应关系) wpa_cli -i wlan0 list_networks # 输出: # 0 WiFi1 any [ENABLED] # 1 WiFi2 any [ENABLED] # 步骤4:保存配置(永久生效) wpa_cli -i wlan0 save_config这种方式完全无需手动指定 ID,既避免冲突,又能保留多个 WiFi 配置(系统会按
priority优先级自动连接)。四、特殊场景:只想保留一个 WiFi(复用 0)
如果你的需求是 "始终只保留一个 WiFi 配置,新配置替换旧的",可以这样操作(仅推荐单 WiFi 场景):
# 1. 先删除旧的0号配置(若存在) wpa_cli -i wlan0 remove_network 0 2>/dev/null # 忽略"无0号"的错误 # 2. 添加新配置(自动分配0) NET_ID=$(wpa_cli -i wlan0 add_network) wpa_cli -i wlan0 set_network $NET_ID ssid "NewWiFi" wpa_cli -i wlan0 set_network $NET_ID psk "NewPass" wpa_cli -i wlan0 enable_network $NET_ID wpa_cli -i wlan0 save_config总结
- 无需手动指定编号 :
add_network会自动分配唯一 ID,用变量捕获即可(如NET_ID=$(wpa_cli add_network));- 不建议强行用 0:复用 0 会覆盖旧配置,导致多 WiFi 配置丢失,仅适合 "单 WiFi 替换" 场景;
- 最佳实践 :添加多个 WiFi 时,让系统自动分配 ID,通过
list_networks查看 ID,按 ID 管理不同 WiFi。
网络管理(修改 / 删除 / 切换)
如下
# 禁用指定网络(ID为0,从list_networks获取) wpa_cli -i wlan0 disable_network 0 # 启用指定网络(切换WiFi) wpa_cli -i wlan0 enable_network 0 # 修改已有网络的密码 wpa_cli -i wlan0 set_network 0 psk "\"NewPass456\"" wpa_cli -i wlan0 enable_network 0 # 重新启用生效 wpa_cli -i wlan0 save_config # 删除指定网络 wpa_cli -i wlan0 remove_network 0 wpa_cli -i wlan0 save_config # 断开当前WiFi连接 wpa_cli -i wlan0 disconnect # 重新连接已配置的网络 wpa_cli -i wlan0 reconnect更多待补充
wpa_supplicant配置文件
wpa_supplicant 配置文件详解(核心:/etc/wpa_supplicant.conf)
配置文件是
wpa_supplicant的核心,所有 WiFi 配置永久存储于此,格式为纯文本,键值对 + 块结构,以下是完整示例和关键说明:1. 配置文件基础结构(/etc/wpa_supplicant.conf)
# 全局配置(通用设置) ctrl_interface=/var/run/wpa_supplicant # wpa_cli通信的套接字目录 update_config=1 # 允许wpa_cli save_config修改文件 country=CN # 国家码(合规使用WiFi频段) ap_scan=1 # 主动扫描WiFi # 网络配置块(可配置多个,对应不同WiFi) network={ ssid="MyWiFi" # WiFi名称(必须双引号) psk="89abcdef1234567890abcdef12345678" # 加密后的PSK(推荐) # 或明文密码(测试用,不推荐):psk="MyWiFiPass123" key_mgmt=WPA-PSK # 加密方式(WPA/WPA2) proto=WPA2 # 协议版本(WPA/WPA2/WPA3) pairwise=CCMP # 加密算法(CCMP/AES) group=CCMP # 组加密算法 priority=10 # 连接优先级(数值越高越优先) } # 开放网络配置示例(无密码) network={ ssid="PublicWiFi" key_mgmt=NONE priority=5 } # 隐藏SSID的WiFi配置 network={ ssid="HiddenWiFi" psk="HiddenPass123" scan_ssid=1 # 强制扫描隐藏SSID priority=8 }2. 配置文件关键参数说明
参数 作用 ctrl_interfacewpa_cli 与 wpa_supplicant 通信的目录,默认 /var/run/wpa_supplicant update_config设为 1 时,wpa_cli save_config 会自动修改此配置文件 ssidWiFi 名称,必须用双引号包裹 psk密码:可填明文(测试)或加密 PSK(生产,由 wpa_passphrase 生成) key_mgmt认证方式:WPA-PSK(普通 WiFi)、NONE(开放网络)、WPA-EAP(企业 WiFi) proto协议版本:WPA(旧版)、WPA2(主流)、WPA3(新版)、WPA WPA2(兼容) scan_ssid设为 1 时,扫描隐藏 SSID 的 WiFi(默认 0,不扫描) priority连接优先级(数值越大越优先,避免自动连低优先级 WiFi) 3. 配置文件的生成与修改
手动编写 :直接编辑
/etc/wpa_supplicant.conf,按上述格式添加 network 块;自动生成 :通过
wpa_cli save_config自动写入(推荐,避免格式错误);加密 PSK 生成 :
wpa_passphrase "MyWiFi" "MyPass123"输出的内容可直接复制到 network 块中,示例:
wpa_passphrase "MyWiFi" "MyPass123" # 输出: network={ ssid="MyWiFi" #psk="MyPass123" psk=89abcdef1234567890abcdef12345678 # 加密后的密码 }三、常见配置文件路径(不同系统差异)
系统 / 场景 配置文件路径 说明 通用 Linux(Debian/Ubuntu) /etc/wpa_supplicant.conf 默认路径 嵌入式 Linux(Buildroot/OpenWrt) /etc/wpa_supplicant/wpa_supplicant.conf 分目录存放 systemd 系统 /etc/wpa_supplicant/wpa_supplicant-wlan0.conf 按网卡区分配置文件 自定义启动 任意路径(启动时通过 - c 参数指定) 如:-c /tmp/my_wpa.conf 总结
- 核心操作 :
wpa_cli负责交互配置 / 连接,wpa_passphrase生成加密 PSK,wpa_supplicant负责后台运行;- 配置文件 :核心是
/etc/wpa_supplicant.conf,包含全局配置 + 多个 network 块,update_config=1是允许自动修改的关键;- 最佳实践 :生产环境用加密 PSK(避免明文密码),配置
priority避免自动连错 WiFi,修改后执行save_config永久生效。