wpa_cli命令行工具:Linux无线网络调试与自动化管理实战指南
1. 无线网络调试的“瑞士军刀”wpa_cli 初探如果你经常和Linux系统、嵌入式设备或者路由器固件打交道调试无线网络连接绝对是一个绕不开的课题。当图形界面遥不可及或者你需要编写脚本自动化处理Wi-Fi连接时一个名为wpa_cli的命令行工具就会成为你手中最得力的“瑞士军刀”。它不是什么新奇酷炫的技术但却是网络工程师、运维开发者和极客玩家工具箱里不可或缺的实用工具。简单来说wpa_cli就是一个用来与wpa_supplicant这个Wi-Fi连接守护进程进行交互的命令行客户端。wpa_supplicant默默在后台负责着Wi-Fi的认证、加密和关联等核心流程而wpa_cli就是我们向它发号施令、查询状态的窗口。很多人第一次接触wpa_cli可能是在树莓派上配置Wi-Fi或者在某台无头服务器没有显示器的服务器上排查网络问题。它的价值在于其“直达底层”的能力。相比于在图形界面里点击“连接”使用wpa_cli你能更清晰地看到扫描到了哪些网络、认证进行到了哪一步、为何连接失败等详细信息。这对于开发基于Wi-Fi的物联网设备、定制路由器功能或者单纯想在命令行环境下更精细地控制网络行为都是至关重要的技能。本文将带你从零开始深入掌握wpa_cli的基本操作指令不仅告诉你“怎么用”更会解释“为什么这么用”并分享一些实战中积累的排查技巧和避坑指南。2. 核心架构与交互模式解析2.1 wpa_supplicant 与 wpa_cli 的关系剖析要玩转wpa_cli首先必须理解它和wpa_supplicant的共生关系。你可以把wpa_supplicant想象成一个全天候待命的“无线网络连接引擎”。这个引擎非常强大支持从最古老的WEP到最新的WPA3等各种加密方式能处理复杂的企业级802.1X认证。它通常以系统守护进程daemon的形式在后台运行监听着一个控制接口Control Interface。这个控制接口就是wpa_supplicant与外界通信的通道。而wpa_cli的角色就是一个专门用来访问这个控制接口的“遥控器”。它通过Unix域套接字通常是/var/run/wpa_supplicant/目录下的一个socket文件或者TCP套接字与wpa_supplicant建立连接。因此使用wpa_cli有一个绝对的前提wpa_supplicant进程必须在运行并且正确配置并打开了控制接口。很多新手遇到的第一个坑就是直接运行wpa_cli却得到“无法连接”的错误根源就在于此。2.2 两种操作模式交互式与非交互式wpa_cli提供了两种主要的使用模式适用于不同的场景。交互式模式这是最常用、最直观的模式。直接在终端输入wpa_cli命令通常需要sudo权限就会进入一个带提示符通常是的交互式环境。在这个环境里你可以逐条输入指令并立即看到反馈。它非常适合探索性操作、手动调试和一步步的教学演示。例如输入scan回车再输入scan_results回车查看结果。非交互式模式单次命令模式这种模式适合脚本编程和自动化任务。通过在wpa_cli命令后直接跟上子命令和参数来执行单条指令执行完毕后程序自动退出。例如sudo wpa_cli scan_results这条命令会直接执行扫描结果查询并打印到标准输出然后结束。这在编写Shell脚本定时检查网络状态或自动重连时非常有用。注意几乎所有wpa_cli命令都需要足够的权限通常是root或通过sudo来访问控制接口的socket文件。如果你在交互式模式中执行某些操作如reconfigure时遇到权限错误很可能需要以sudo wpa_cli启动。3. 基础环境准备与状态查询3.1 确保 wpa_supplicant 正常运行在开始使用wpa_cli前我们必须先确认“引擎”已经启动。通常现代Linux发行版会使用systemd来管理wpa_supplicant服务。# 检查 wpa_supplicant 服务状态 sudo systemctl status wpa_supplicant # 如果未运行则启动它并设置开机自启 sudo systemctl start wpa_supplicant sudo systemctl enable wpa_supplicant但更重要的是wpa_supplicant需要在正确的网络接口上运行。常见的启动命令是这样的# 在后台启动 wpa_supplicant并指定无线网卡接口名为 wlan0使用配置文件 sudo wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf这里的-B表示后台运行-i指定网络接口-c指定配置文件路径。配置文件/etc/wpa_supplicant/wpa_supplicant.conf是存储Wi-Fi网络配置SSID和密码的关键文件。如果没有这个文件你需要先创建它。3.2 进入交互式环境与基础信息获取确认服务运行后我们可以进入wpa_cli的交互式环境。通常需要指定网络接口sudo wpa_cli -i wlan0如果系统只有一个活跃的无线接口直接输入sudo wpa_cli也可能成功。进入后提示符会变成。我们可以先用几个基础命令探探路status这是你首先应该运行的命令。它会打印出当前连接状态的详细信息是排查所有问题的起点。 status bssidxx:xx:xx:xx:xx:xx freq2412 ssidMyHomeWiFi id0 modestation pairwise_cipherCCMP group_cipherCCMP key_mgmtWPA2-PSK wpa_stateCOMPLETED ip_address192.168.1.105 addressyy:yy:yy:yy:yy:yy输出里包含了连接的BSSIDAP的MAC地址、频率、SSID、关联的网络配置ID、安全类型以及最重要的wpa_state。wpa_stateCOMPLETED表示已成功完成认证和关联。ping这个命令不是向网络发送ICMP ping而是向wpa_supplicant守护进程发送一个“心跳”测试检查控制接口连接是否正常。如果返回PONG说明wpa_cli与wpa_supplicant的通信链路是畅通的。interface显示当前wpa_cli实例正在操作的网络接口名称用于确认你没有操作错网卡。4. 网络扫描、配置与连接全流程实操4.1 扫描周边无线网络在连接之前我们需要知道周围有哪些可用的网络。这个过程分为两步发起扫描输入命令scan。这个命令是异步的它会立即返回一个“OK”但扫描动作在后台进行。 scan OK实操心得扫描需要一定时间尤其是需要扫描多个频段2.4GHz和5GHz时。执行scan后最好等待2-5秒再执行下一步否则可能看不到完整的扫描结果。获取扫描结果输入命令scan_results。这会列出一个表格包含所有扫描到的网络信息。 scan_results bssid / frequency / signal level / flags / ssid aa:bb:cc:dd:ee:ff 2412 -45 [WPA2-PSK-CCMP][ESS] MyHomeWiFi 11:22:33:44:55:66 5180 -67 [WPA2-EAP-CCMP][ESS] Office-Net ...bssid接入点的MAC地址。frequency信道频率2412代表2.4GHz频段的信道15180代表5GHz频段。signal level信号强度单位是dBm。数值越大越接近0信号越好-45比-67的信号强得多。flags网络能力标志。这是最关键的一列[WPA2-PSK-CCMP]表示该网络使用WPA2个人版加密加密套件为CCMP即AES。[ESS]表示基础架构模式。如果看到[WEP]或加密标志为空则代表该网络不安全或使用已淘汰的加密。ssid网络的名称。4.2 添加与配置网络找到目标网络后我们需要将其配置添加到wpa_supplicant的内部列表中。注意wpa_cli的配置是运行时配置修改会直接影响当前运行的wpa_supplicant实例。为了让配置永久生效你通常还需要将其写入配置文件。添加一个新的网络配置块使用add_network命令。这个命令会返回一个数字ID例如0, 1, 2...这个ID就是后续配置和操作这个网络的句柄。 add_network 0这里返回了0意味着新创建的网络配置ID是0。设置网络参数使用set_network id 变量 值的格式进行配置。最关键的几个参数是SSID网络的名称。注意即使SSID是中文或包含特殊字符这里也需要正确设置。 set_network 0 ssid \MyHomeWiFi\如果SSID包含空格或特殊字符需要用双引号包裹并且外层再用反斜杠转义。对于纯英文数字的SSID直接写MyHomeWiFi也可以。PSK密码对于WPA-PSK/WPA2-PSK网络这是必选项。你可以直接输入明文密码但更安全的方式是输入经过PBKDF2哈希计算后的PSK。# 方式一直接设置明文密码不推荐密码会以明文形式暂存于内存 set_network 0 psk my_password_123 # 方式二设置经过wpa_passphrase计算出的PSK推荐 # 先在系统shell中计算PSK # wpa_passphrase MyHomeWiFi my_password_123 # 输出中会包含一行pskhash_value # 然后在wpa_cli中设置这个hash值 set_network 0 psk hash_value重要注意事项使用明文PSK时wpa_supplicant可能会在调试信息或状态转储中将其记录出来存在安全风险。在生产环境或共享设备上强烈建议使用预计算的PSK哈希值。key_mgmt密钥管理方式。对于大多数家庭网络就是WPA-PSK或WPA2-PSK。如果网络不加密则设置为NONE。 set_network 0 key_mgmt WPA-PSK启用网络配置使用enable_network id命令。这会让wpa_supplicant尝试使用该配置去连接网络。 enable_network 0 OK执行后可以立刻运行status命令观察wpa_state的变化它会经历SCANNING,ASSOCIATING,AUTHENTICATING,4WAY_HANDSHAKE等状态最终如果成功则会变为COMPLETED。4.3 配置文件管理运行时与持久化通过wpa_cli所做的网络配置修改默认只保存在当前运行的wpa_supplicant进程的内存中。一旦进程重启这些配置就会丢失。因此我们需要将其保存到磁盘配置文件中。保存配置使用save_config命令。这个命令会将当前内存中的所有网络配置通过add_network和set_network设置的写入到wpa_supplicant启动时指定的配置文件通常是/etc/wpa_supplicant/wpa_supplicant.conf中。 save_config OK执行成功后你可以用文本编辑器打开配置文件查看会发现里面多了一个格式规整的network{...}块。重新加载配置如果你手动修改了磁盘上的配置文件或者通过save_config保存后想确保生效可以使用reconfigure命令。这会通知wpa_supplicant重新读取配置文件。 reconfigure OK列出所有网络配置使用list_networks命令。它会显示所有已配置网络的ID、SSID和启用状态。 list_networks network id / ssid / bssid / flags 0 MyHomeWiFi any [CURRENT] 1 Office-Net any [DISABLED][CURRENT]表示当前正在使用的网络配置。5. 高级操作与连接管理5.1 连接控制与网络切换在实际使用中我们经常需要断开连接、切换网络或调整优先级。断开当前连接使用disconnect命令。这会命令wpa_supplicant主动断开与当前接入点的关联。但请注意这并不会禁用网络配置wpa_supplicant可能会根据策略自动重连。 disconnect OK重新连接使用reconnect命令。这会触发wpa_supplicant重新执行完整的连接流程扫描、选择、认证。在信号不稳定或认证临时失败时手动执行reconnect比等待超时更高效。选择并连接特定网络如果你配置了多个网络例如ID 0和1可以使用select_network id命令。这个命令会禁用当前网络并立即尝试连接指定的网络。 select_network 1 OK这比先disconnect再enable_network更直接。禁用/启用某个网络配置使用disable_network id和enable_network id。禁用后该配置将不会被自动或手动选择直到再次被启用。5.2 信号强度监控与日志调试wpa_cli也提供了实时监控和调试的能力。信号强度变化事件在交互式模式下wpa_supplicant可以主动向wpa_cli推送事件。你可以开启事件监听。但更简单的方式是scan_results中的signal level就是实时信号强度。你可以编写脚本定期执行wpa_cli signal_poll命令非交互模式来获取当前连接AP的详细信息其中包含RSSI接收信号强度指示器。sudo wpa_cli -i wlan0 signal_poll RSSI-48 LINKSPEED72 NOISE9999 FREQUENCY2412调试日志级别当连接出现疑难杂症时查看详细日志是必须的。wpa_cli本身不直接控制日志级别但你可以通过它触发wpa_supplicant记录更多信息。通常需要在启动wpa_supplicant时通过-d增加调试级别或-dd更高级别参数或者在其配置文件中设置logger_syslog_level和logger_stdout_level。然后在系统日志如journalctl -u wpa_supplicant -f中就能看到从扫描到四次握手的每一个细节这对于分析复杂的认证失败尤其是企业级WPA-EAP至关重要。6. 实战问题排查与脚本化技巧6.1 常见连接失败问题速查以下是一些典型问题及通过wpa_cli的排查思路scan_results看不到目标SSID可能原因物理距离太远或障碍物过多无线网卡驱动不支持该频段如老网卡不支持5GHzAP隐藏了SSID不广播。排查确认网卡支持性。对于隐藏网络你需要手动set_network id scan_ssid1并且SSID必须完全正确。wpa_state卡在ASSOCIATING或AUTHENTICATING可能原因密码错误加密方式不匹配如AP是WPA2客户端配置为WPA驱动或固件问题。排查首先反复检查psk和key_mgmt设置。使用wpa_passphrase生成PSK哈希排除密码格式问题。查看系统日志寻找Authentication rejected或Association failed等具体错误码。wpa_state卡在4WAY_HANDSHAKE可能原因这是WPA四次握手阶段失败几乎可以确定是密码错误。但也可能是驱动兼容性问题或AP端设置异常如组密钥更新间隔太短。排查99%的情况是密码错误。请仔细核对。可以尝试在AP端临时将加密改为开放式无密码测试如果能过则确认是密码问题。已显示COMPLETED但无法获取IP地址可能原因L2链路层已通但L3网络层有问题。这通常是DHCP客户端如dhclient或dhcpcd的问题或者防火墙规则阻止了DHCP请求。排查wpa_cli的工作在L2已完成。此时需要检查DHCP客户端的日志。可以手动运行sudo dhclient wlan0并查看输出。6.2 使用 wpa_cli 编写自动化脚本wpa_cli的非交互模式是脚本化的核心。下面是一个简单的Bash脚本示例用于监控网络连接并在断开时尝试重连。#!/bin/bash # 保存为 wifi_watchdog.sh INTERFACEwlan0 TARGET_NETWORK_ID0 # 你目标网络的ID LOG_FILE/var/log/wifi_watchdog.log while true; do # 使用wpa_cli检查状态grep出wpa_state行 STATE$(sudo wpa_cli -i $INTERFACE status | grep ^wpa_state | cut -d -f2) if [ $STATE ! COMPLETED ]; then echo $(date): WiFi connection lost (state: $STATE). Attempting to reconnect... $LOG_FILE # 先断开 sudo wpa_cli -i $INTERFACE disconnect /dev/null 21 sleep 2 # 重新选择并启用目标网络 sudo wpa_cli -i $INTERFACE select_network $TARGET_NETWORK_ID /dev/null 21 sleep 5 # 等待连接过程 NEW_STATE$(sudo wpa_cli -i $INTERFACE status | grep ^wpa_state | cut -d -f2) echo $(date): Reconnect finished. New state: $NEW_STATE $LOG_FILE else # 连接正常可以获取IP等信息 IP_ADDR$(sudo wpa_cli -i $INTERFACE status | grep ^ip_address | cut -d -f2) echo $(date): Connection healthy. IP: $IP_ADDR $LOG_FILE fi sleep 30 # 每30秒检查一次 done这个脚本展示了如何解析wpa_cli status的输出并根据状态采取行动。你可以将其设置为systemd服务实现后台守护。6.3 安全与性能调优要点控制接口权限默认的Unix socket文件可能权限较宽松。在生产环境中建议在wpa_supplicant.conf中通过ctrl_interface和ctrl_interface_group选项严格控制访问权限避免非特权用户控制网络连接。ctrl_interfaceDIR/var/run/wpa_supplicant GROUPnetdev避免频繁扫描在脚本中循环执行scan命令会消耗较多电量对移动设备并可能干扰正常通信。应根据实际需要设置合理的扫描间隔。多配置优先级在配置文件中wpa_supplicant会按照network块的顺序和priority参数来决定连接优先级。你可以通过wpa_cli的list_networks查看优先级并通过编辑配置文件调整priority值数值越大优先级越高以实现自动切换到更优网络的功能。掌握wpa_cli就像掌握了一把打开无线网络底层世界的钥匙。它没有图形界面那么友好但却提供了无与伦比的清晰度和控制力。从一次简单的手动连接到编写复杂的网络管理脚本其核心都离不开对这些基础指令的熟练运用。当你再遇到无法通过点击解决的Wi-Fi问题时不妨打开终端用wpa_cli看一看很可能问题就一目了然了。

相关新闻

Krea-2 AI绘图模型实战指南:为什么别人用同样的显卡出图更快

Krea-2 AI绘图模型实战指南:为什么别人用同样的显卡出图更快

Krea-2 AI绘图模型实战指南:为什么别人用同样的显卡出图更快 【免费下载链接】Krea-2 项目地址: https://ai.gitcode.com/hf_mirrors/Comfy-Org/Krea-2 “你的显卡不差,差的是模型格式选错了。”这句话是我折腾 Krea-2 AI绘图模型一个多月后最深…

2026/10/11 4:17:34 阅读更多 →
USB 2.0令牌包深度解析:通信的指挥棒与协议核心

USB 2.0令牌包深度解析:通信的指挥棒与协议核心

1. 项目概述:从“线缆”到“对话”的协议世界刚接触USB开发那会儿,我总觉得它就是个“插上就能用”的简单玩意儿。直到第一次调试USB设备枚举失败,看着逻辑分析仪上那一串串高低电平,才意识到USB协议背后是一套极其严谨的“语言”…

2026/10/14 13:32:06 阅读更多 →
告别笨重模拟器:APK Installer让Windows安装安卓应用只需一个双击

告别笨重模拟器:APK Installer让Windows安装安卓应用只需一个双击

告别笨重模拟器:APK Installer让Windows安装安卓应用只需一个双击 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是不是也有过这样的经历:想…

2026/10/11 9:04:57 阅读更多 →

最新新闻

Multi-Agent系统Tracing实战:从线上事故到执行链记录体系

Multi-Agent系统Tracing实战:从线上事故到执行链记录体系

1. 从一次线上事故说起:为什么Multi-Agent系统必须做Tracing去年冬天,我们团队上线了一套基于多智能体协作的自动化内容处理系统,四个Agent分别负责信息抽取、逻辑校验、格式转换和最终输出。上线第三天,运营同学反馈说有一批文档…

2026/10/15 5:38:22 阅读更多 →
Java批量生成资产标签PDF:itextpdf配ZXing二维码实战指南

Java批量生成资产标签PDF:itextpdf配ZXing二维码实战指南

上周有位朋友微信找我,说单位三百多台仪器,每年盘点都要两个人蹲在地上逐个抄标签,标签还是买设备时经销商送的,掉了三年没人补。他问我:网上说的“用itextpdf 配合 google.zxing 批量生成资产标签PDF”,到…

2026/10/15 5:38:22 阅读更多 →
Java面试八股文核心真题:并发、JVM、MySQL与Redis深度解析

Java面试八股文核心真题:并发、JVM、MySQL与Redis深度解析

每次面试前,总有人问我Java“八股文”到底要不要背。我的态度很明确:不仅要背,还得背出深度。你光知道synchronized是锁,面试官下一句就是“锁升级过程讲一下”;你光知道HashMap底层是数组加链表,紧接着就是…

2026/10/15 5:38:22 阅读更多 →
Agent Harness工程实战:从循环、上下文到沙箱与验证的稳定运行设计

Agent Harness工程实战:从循环、上下文到沙箱与验证的稳定运行设计

1. 从"能跑"到"跑得住":Harness 工程到底在解决什么很多人第一次接触 Agent 开发,注意力几乎全放在模型本身——提示词怎么写、工具怎么调、输出怎么解析。等真正把 Agent 丢进一个需要连续跑几十分钟甚至几小时的任务里&#xff0c…

2026/10/15 5:38:22 阅读更多 →
用华为云码道 CodeArts 代码智能体,三天从零做出一个全栈 AI 求职平台(附源码)

用华为云码道 CodeArts 代码智能体,三天从零做出一个全栈 AI 求职平台(附源码)

一键开通华为云码道 CodeArts 代码智能体 项目仓库:https://atomgit.com/gcw_93rlw6ed/careerpilot (公开,MIT 协议) 演示账号:打开登录页自动进入(演示账号 candidatedemo.com 自动登录) 一、…

2026/10/15 5:38:22 阅读更多 →
Vue项目实现Office文档在线预览:DOCX、XLSX、PPT一次搞定

Vue项目实现Office文档在线预览:DOCX、XLSX、PPT一次搞定

做前端这几年,被文档预览折磨的次数真不算少。之前接一个合同管理需求,用户提了个特别朴素的要求:附件里的Word合同不要下载到本地再打开,在网页里直接能看就行。我一开始也心想,这有什么难的?不就是嵌一个…

2026/10/15 5:37:22 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →