wpa_supplicant核心操作总结

参考:

Linux WPA/WPA2/WPA3/IEEE 802.1X Supplicant-CSDN博客

Linux WIFI 驱动实验-CSDN博客

Linux下的wifi开发_linux wifi-CSDN博客

基础状态查询

如下

复制代码
# 查看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.8

2. 非交互模式(一键执行,适合脚本)

如果不想进入交互模式,可直接用单行命令批量执行:

复制代码
# 替换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 wlan0

3. 常见问题与解决

  • 提示 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

总结

  1. 核心流程:进入wpa_cli交互模式 → 添加网络 → 设置SSID/密码 → 启用网络 → 保存配置 → 获取DHCP IP
  2. 交互模式适合手动操作,非交互模式适合脚本批量执行;
  3. 连接后通过 wpa_cli status 验证状态,ping 测试网络连通性。



wpa_cli指令里的0是啥意思?

wpa_cli 指令中,你看到的数字 0WiFi 网络配置的唯一标识 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」。

四、关键注意事项

  1. ID 是临时 + 永久的 :添加配置时分配的 ID,只要不删除配置,重启 wpa_supplicant 后仍保持不变;
  2. 不一定必须是 0:0 只是「第一个添加的 WiFi」的默认 ID,如果你添加第二个 WiFi,ID 会是 1,操作时需用 1 替代 0;
  3. 无 ID 操作会报错 :比如直接执行 set_network ssid "MyWiFi" (少了 ID),会提示「ERROR: invalid command arguments」,因为系统不知道要操作哪个 WiFi。

总结

  1. wpa_cli 中的「0」是WiFi 配置项的 ID,是操作特定 WiFi 的 "唯一标识";
  2. ID 由 add_network 自动分配(从 0 开始递增),可通过 list_networks 查看所有 ID 和对应 WiFi;
  3. 所有针对具体 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

总结

  1. 无需手动指定编号add_network 会自动分配唯一 ID,用变量捕获即可(如NET_ID=$(wpa_cli add_network));
  2. 不建议强行用 0:复用 0 会覆盖旧配置,导致多 WiFi 配置丢失,仅适合 "单 WiFi 替换" 场景;
  3. 最佳实践 :添加多个 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_interface wpa_cli 与 wpa_supplicant 通信的目录,默认 /var/run/wpa_supplicant
update_config 设为 1 时,wpa_cli save_config 会自动修改此配置文件
ssid WiFi 名称,必须用双引号包裹
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

总结

  1. 核心操作wpa_cli 负责交互配置 / 连接,wpa_passphrase 生成加密 PSK,wpa_supplicant 负责后台运行;
  2. 配置文件 :核心是 /etc/wpa_supplicant.conf,包含全局配置 + 多个 network 块,update_config=1 是允许自动修改的关键;
  3. 最佳实践 :生产环境用加密 PSK(避免明文密码),配置priority避免自动连错 WiFi,修改后执行save_config永久生效。
相关推荐
jiang_changsheng2 小时前
VMware 虚拟机无法上网排查解决教程
开发语言·网络·php
历程里程碑2 小时前
Linux 46 HTTPS(协议原理)安全通信全流程解析
linux·网络·c++·网络协议·http·https·排序算法
FreeBuf_2 小时前
利用eBPF与io_uring高级技术的Linux Rootkit演进
linux·运维·服务器
hy____1232 小时前
Linux_多线程
linux·服务器
fygfh.2 小时前
Linux开发中进程与线程的创建与生命周期
java·linux·服务器
00后程序员张2 小时前
iOS 应用的 HTTPS 连接端口在网络抓包调试中有什么作用
android·网络·ios·小程序·https·uni-app·iphone
m0_738120722 小时前
网络安全编程——PHP基础Session详细讲解
android·网络·windows·安全·web安全·php
IT从业者张某某2 小时前
给Ubuntu用户添加Docker权限(永久生效,无需sudo)
linux·ubuntu·docker
Yupureki2 小时前
《C++实战项目-高并发内存池》2.ObjectPool构造
linux·服务器·c语言·开发语言·jvm·c++