Suricata 命令行选项完全指南:从基础抓包到单元测试的实战手册
网络安全【免费下载链接】suricataSuricata is a network Intrusion Detection System, Intrusion Prevention System and Network Security Monitoring engine developed by the OISF and the Suricata community.项目地址https://gitcode.com/gh_mirrors/su/suricata点击查看免费下载Suricata 作为一款由 OISF 与社区共同维护的网络入侵检测/入侵防御IDS/IPS与网络安全监控引擎其全部运行行为几乎都可以通过命令行选项进行控制。本文以仓库内 doc/userguide/command-line-options.rst 及其分部文件 options.rst、options-unittests.rst 为骨架逐条讲解每个命令行选项的语义、参数取值与典型用法并结合 src/suricata.c、src/source-pcap-file.c 等源码揭示底层实现细节。读完本文你将能够熟练用-r回放 pcap 文件、用--pcap-file-*系列选项构建自动化离线分析流水线、用--runmode切换检测运行模式、用--set免改配置临时覆盖参数以及编译并运行内置单元测试。一、命令行解析的源码入口在深入选项之前先明确这些选项在代码中的落点。所有选项的解析都在 src/suricata.c 中完成该文件通过getopt_long维护了一张长选项表见 src/suricata.c其中包含pcap-file-continuous、pcap-file-delete、pcap-file-recursive、pcap-file-buffer-size、unittest-filter等选项选项命中后的分支处理逻辑集中在 src/suricata.c 附近。运行时用suricata --build-info或suricata -h可查看当前二进制实际支持的全部选项。以下按“基本选项 → 输入与抓包 → 规则与运行 → 信息查询 → 高级选项 → 单元测试”分组讲解。二、基本选项启动与配置装载选项作用-h显示简明的用法总览Usage-V显示 Suricata 的版本号-c path指定配置文件的路径--include path追加加载额外的配置文件-T仅测试配置不启动引擎-v提高应用日志的详细程度可重复叠加-c与--include的配合--include可以多次指定多个附加配置文件会按命令行中给出的顺序被加载效果等同于“它们被追加在主配置文件的末尾”。例如# 只追加一个附加配置 suricata --include /etc/suricata/other.yaml # 按顺序追加多个附加配置 suricata --include /etc/suricata/other.yaml --include /etc/suricata/extra.yaml-T是部署前必备的“体检”手段它会完整解析配置与规则而不真正抓包适合在 CI 或变更发布前验证配置文件合法性与规则可加载性。-v的日志级别递进关系-v→ INFO-vv→ PERF-vvv→ CONFIG-vvvv→ DEBUG需要注意的是-v只能提高日志详细度不会降低配置文件里已经设置的、比命令行请求级别更详细的日志级别——即配置文件优先级更高。三、输入与抓包模式选项3.1 离线回放模式-r path-r让 Suricata 以 pcap 离线模式回放模式运行读取 pcap 文件。当path指向一个目录时会按文件修改时间排序处理目录内所有文件并且在文件之间保持流flow状态保证跨文件的会话识别连续一致。3.2 pcap 文件批处理三剑客continuous / recursive / delete这三个选项都依赖-r使用--pcap-file-continuous与-r搭配让回放模式持续存活直到被中断。非常适合监控目录场景——不断向目录投入新 pcap 文件Suricata 持续消费且不重置文件间的流状态。--pcap-file-recursive当-r的路径是目录时递归遍历子目录最大深度 255。不能与--pcap-file-continuous同时使用且会忽略符号链接。这一互斥约束在源码中有明确校验见 src/source-pcap-file.c当两者同时被启用时会直接报错Error, --pcap-file-continuous and --pcap-file-recursive cannot be used together。--pcap-file-delete处理完 pcap 文件后强制删除。适合配合--pcap-file-continuous打造“投递目录 自动清理”的流水线。命令行 vs 配置文件--pcap-file-delete会覆盖suricata.yaml中的pcap-file.delete-when-done配置项并强制进入“总是删除”模式等价于delete-when-done: true。若需要更精细的控制应直接使用配置文件选项pcap-file.delete-when-done它支持三个取值false默认不删除任何文件true处理完成后删除所有文件non-alerts仅删除未产生任何告警的文件若既不设置--pcap-file-delete也不设置delete-when-donepcap 文件处理后不会被删除。这一“三态删除模式”在 src/source-pcap-file-helper.c 中有完整实现源码先读取pcap-file.delete-when-done字符串若为non-alerts则置为PCAP_FILE_DELETE_NON_ALERTS模式否则解析布尔值决定PCAP_FILE_DELETE_ALWAYS或PCAP_FILE_DELETE_NONE处理线程在文件收尾时会按模式决定是否删除src/source-pcap-file-helper.cnon-alerts模式还会借助alerts.cnt计数判断该文件是否产生过告警src/source-pcap-file-helper.c 附近。3.3 读取缓冲--pcap-file-buffer-size value通过setvbuf设置读取缓冲区大小以加速 pcap 读取合法取值0禁用setvbuf缓冲或 4 KiB 至 64 MiB默认值128 KiB平台限制仅 Linux 支持源码解析逻辑在 src/source-pcap-file.c默认值由PCAP_FILE_BUFFER_SIZE_DEFAULT定义随后尝试读取配置项pcap-file.buffer-size解析失败时告警并保留默认值越界值超出 0 或 4 KiB~64 MiB 范围同样会被拒绝并回退默认。批量回放大文件时调大该值通常能明显降低磁盘 I/O 开销。3.4 在线抓包接口与底层捕获方法-i interface指定嗅探网卡Suricata 会自动选择当前可用的最佳捕获方法。可以多次使用以同时监听多个网卡。--pcap[device]显式切换到 PCAP 模式不带设备名时使用配置文件中pcap小节列出的接口。--af-packet[device]在 Linux 上启用 AF_PACKET 捕获不带设备名时使用 yaml 中af-packet小节的设备列表。AF_PACKET 是 Linux 上高性能抓包的首选。--af-xdp[device]在 Linux 上启用 AF_XDP 捕获不带设备名时使用af-xdp小节的设备列表。AF_XDP 基于 XDP 内核快速路径适合追求极致性能的环境。-q queue id以内联inline模式运行在指定 NFQUEUE 队列 ID 上可多次指定以绑定多个队列用于 IPS 场景。3.5 其他高级输入方式--pcap-buffer-sizesize设置 PCAP 缓冲区大小取值范围0 - 2147483647字节。--netmap[device]在 FreeBSD 或 Linux 上启用 NETMAP 捕获不带设备名时使用 yaml 中netmap小节的设备。--pfring[device]启用 PF_RING 捕获不带设备名时使用配置中的设备。--pfring-cluster-id id设置 PF_RING 集群 ID。--pfring-cluster-type type设置 PF_RING 集群类型可取cluster_round_robin或cluster_flow。-d divert-port使用 IPFW divert 模式内联运行。--dag device从 DAG 采集卡抓包可通过形如dag0:4的设备名选择特定流可多次提供以读取多设备/多流。--napatech使用 Napatech Streams API 抓包。--erf-infile离线模式读取指定的 ERF 文件Endace 可扩展记录格式。--simulate-ips在非 IPS 模式下模拟 IPS 运行用于评估内联模式的检测行为而不真正干预流量。四、规则装载与运行控制选项4.1 规则文件-s与-S-s filename.rules加载指定签名文件与yaml 中配置的规则合并加载。-S filename.rules加载指定签名文件独占加载——完全忽略 yaml 中配置的规则。两者都支持 shell 通配符globbing例如suricata -s /path/to/rules/*.rules suricata -S /path/to/rules/*.rules-S常用于临时只跑一组自定义规则集做验证-s常用于在既有规则集上叠加应急规则。4.2 日志目录与守护进程-l directory设置默认日志目录。若同时配置了 yaml 中的default-log-dir命令行-l优先生效未指定-l时才回退到 yaml 配置。-D以守护进程方式后台运行。默认前台运行会占用终端关闭窗口即停止引擎-D让引擎转入后台持续运行终端可继续执行其他任务。4.3 运行模式--runmode runmode--runmode可覆盖 yaml 中的 runmode 配置可选值有workers每个抓包线程绑定一个检测线程各线程拥有独立流表扩展性最好autofp自动流负载均衡auto flow pinned load balancing多个检测线程按流分配到 CPU 核single单线程模式便于调试。更多 runmode 细节可参考用户指南中的 Runmodes 章节需确认该路径是否存在于仓库中。--list-runmodes可直接列出当前二进制支持的全部运行模式。4.4 过滤与校验-F、-k-F bpf filter file从文件读取 BPF 过滤器用于在抓包层就过滤流量例如仅保留特定 IP 或端口。-k [all|none]all强制开启全部校验和检查none禁用全部校验和检查。默认行为按各协议配置此选项用于强制统一。4.5 进程身份与 PID--useruser初始化完成后切换进程用户覆盖配置文件run-as小节中的 user。--groupgroup初始化完成后切换进程组覆盖run-as小节中的 group。--pidfile file将进程 ID 写入指定文件。覆盖配置文件中的pid-file选项并且在非守护模式下也强制写出 PID 文件守护模式下 PID 文件是必备的用于suricatactl等管理工具定位进程。4.6 规则严格性与功能开关--init-errors-fatal加载签名时若遇到错误直接以失败退出。适合 CI 中强制规则质量门槛。--strict-rule-keywords[all|keyword|keywords(csv)]应用于classtype、reference和app-layer-event三类关键字。默认情况下缺失 reference/classtype 值、或加载过期的 app-layer-event 事件只产生警告启用本选项后这些警告一律视为错误。不传值或传all表示对上述全部关键字生效也可以传逗号分隔的关键字名列表如--strict-rule-keywordsclasstype,reference按需收紧。--disable-detection关闭检测引擎。此时 Suricata 仅做抓包与日志记录不做规则匹配。--disable-hashing禁用 md5、sha1、sha256 等哈希算法支持。默认哈希功能开启禁用后连带关闭依赖哈希的特性包括 filestore文件存储、ja3 指纹以及所有使用哈希算法的规则关键字。五、信息查询选项不启动引擎的“体检工具”选项作用--dump-config将配置文件加载后的完整配置打印到终端并退出--dump-features打印 Suricata 各模块提供的特性列表并退出--build-info显示当前二进制的构建信息编译选项、依赖版本等--list-app-layer-protos列出所有支持的应用层协议--list-keywords[all\|csv\|kword]列出所有支持的规则关键字--list-runmodes列出所有支持的运行模式--dump-config与--set是黄金搭档--dump-config输出中带有索引值如outputs.1.eve-log.enabled这些索引正是--set修改配置时引用的键路径。--list-keywordscsv便于把关键字清单导入表格工具做规则开发审计--dump-features输出的特性子集可用于比对规则所需的特性与引擎实际提供的特性是否匹配。六、高级选项插件、动态配置与内联控制--plugin path从指定路径加载插件叠加在配置文件列出的插件之上可多次指定。若path是目录Suricata 会尝试加载目录下每个.so文件。仓库内plugins/目录下就有 napatech、ndpi、pfring 等插件示例见 plugins/Makefile.am。--set keyvalue直接设置一个配置值用于覆盖基础配置参数无需改动配置文件。例如# 修改默认日志目录 suricata --set default-log-dir/var/tmp # 关闭默认配置中的 eve-log 输出注意索引值 suricata --set outputs.1.eve-log.enabledno限制--set不能向配置文件中的列表新增条目例如新增一个 output只能修改已存在的列表项。另外suricata.yaml更新后列表索引可能变化修改前建议先执行--dump-config确认当前索引。--engine-analysis打印引擎各部分的解析报告后退出。具体可打印哪些报告取决于配置参数engine-analysis对应 yaml 中的相关开关用于诊断签名解析与引擎初始化问题。--unix-socketfile使用指定文件作为 Suricata 的 Unix 控制套接字覆盖配置文件unix-command小节的filename。启用后即可通过suricatactl源码位于 rust/suricatactl执行 shutdown、conf-get、dump-counters、ruleset-reload-rules 等运行时管理命令。--reject-devdevice指定用于发送 RST / ICMP 错误报文的设备配合规则中的reject关键字实现主动阻断IPS 语义。七、单元测试相关选项-u与测试过滤内置单元测试仅在编译时启用--enable-unittests配置项后才可用。运行单元测试不需要配置文件用-l指定输出目录即可sudo suricata -u选项作用-u运行单元测试后退出需--enable-unittests编译-U, --unittest-filterREGEX用正则筛选要运行的单元测试--list-unittests列出所有可用的单元测试--fatal-unittests单元测试出错即致命退出而不是继续跑剩余测试--unittests-coverage显示单元测试覆盖率报告典型用法# 只运行名称匹配 http 的单元测试 sudo suricata -u -U http # 先列出全部测试名再精确筛选 sudo suricata --list-unittests sudo suricata -u -U decode-tcp|decode-udp # 覆盖率报告 出错即停 sudo suricata -u --unittests-coverage --fatal-unittests这些选项在 src/suricata.c 的 Usage 输出中均有体现--list-unittests、--fatal-unittests、--unittests-coverage-U对应的长选项unittest-filter也在 src/suricata.c 的选项表中注册。仓库中还有大量单元测试源码可供参考例如 src/tests 目录下的 60 余个测试文件以及各模块源文件内的SCSetupTest风格测试用例。八、实战组合示例场景一离线 pcap 回放 自动清理的持续分析流水线suricata -r /data/pcaps --pcap-file-continuous --pcap-file-delete \ -l /var/log/suricata/replay -S /etc/suricata/rules/custom.rules配合pcap-file.delete-when-done: non-alerts在suricata.yaml中配置可做到目录持续接收 pcap → 引擎顺序处理并保持流状态 → 仅删除无告警的文件、保留有告警的样本供人工研判。场景二上线前配置与规则体检suricata -T -c /etc/suricata/suricata.yaml -S /etc/suricata/rules/*.rules \ --init-errors-fatal --strict-rule-keywordsall场景三临时覆盖配置并快速验证suricata -i eth0 --set default-log-dir/var/tmp --set outputs.1.eve-log.enabledno \ --runmode workers --dump-config | head -50九、小结Suricata 的命令行是理解与驾驭整个引擎的最短路径从-h的总览、-T的配置体检到-r与--pcap-file-*的离线分析体系再到--runmode的性能调优、--set的免改配置覆盖、-u系列的开发者自检工具每个选项都对应 src/suricata.c 中具体的解析分支并联动 src/source-pcap-file.c、src/source-pcap-file-helper.c 等模块的运行时逻辑。掌握这份选项地图无论是日常运维、规则调试、性能调优还是二次开发都能做到有的放矢。赞分享网络安全【免费下载链接】suricataSuricata is a network Intrusion Detection System, Intrusion Prevention System and Network Security Monitoring engine developed by the OISF and the Suricata community.项目地址https://gitcode.com/gh_mirrors/su/suricata点击查看免费下载相关推荐免费PhotoGIMP四步把GIMP变成熟悉的Photoshop界面免费PhotoGIMP四步把GIMP变成熟悉的Photoshop界面 PhotoGIMP是一款面向GIMP 3.0以上版本的免费界面补丁把GIMP的快捷键、clip命令行参数详解从基础使用到高级选项的完全手册clip命令行参数详解从基础使用到高级选项的完全手册 clip作为一款强大的 命令行图表生成工具 能够通过简单的命令快速创建专业的SVG和PNG图表。无论你deVoid UI Framework 架构设计解析一条铁律如何拯救你混乱的 UI 代码deVoid UI Framework 架构设计解析一条铁律如何拯救你混乱的 UI 代码 做 Unity 游戏的人都懂那种痛HUD 挡在弹窗上、弹窗又挡住了上一篇终极指南Picocli注解处理器如何自动生成GraalVM原生镜像配置下一篇OpenBLAS在Kaldi语音识别工具中的安装问题解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

NVIDIA Olympus:服务器CPU单线程性能优化核心技术解析

NVIDIA Olympus:服务器CPU单线程性能优化核心技术解析

1. Olympus不是显卡,是NVIDIA为服务器CPU性能天花板埋下的伏笔很多人看到“NVIDIA Olympus”第一反应是:又出新显卡了?点开搜索结果才发现,满屏都是“Olympus驱动安装失败”“Olympus控制面板打不开”“Olympus和GeForce冲突”——…

2026/10/12 15:10:31 阅读更多 →
Hyperf 3.0 升级实战指南:迁移至 PHP 8.0 与原生 Attribute 的完整步骤

Hyperf 3.0 升级实战指南:迁移至 PHP 8.0 与原生 Attribute 的完整步骤

后端Web框架微服务RPC框架异步编程 【免费下载链接】hyperf 🚀 A coroutine framework that focuses on hyperspeed and flexibility. Building microservice or middleware with ease. 项目地址: https://gitcode.com/hyperf/hyperf 点击查看 免费下载 …

2026/10/12 15:10:51 阅读更多 →
k0s 部署 Traefik Ingress Controller 与 MetalLB 完整实战指南

k0s 部署 Traefik Ingress Controller 与 MetalLB 完整实战指南

云原生容器编排边缘计算 【免费下载链接】k0s k0s - The Zero Friction Kubernetes 项目地址: https://gitcode.com/gh_mirrors/k0/k0s 点击查看 免费下载 本文是一份基于 k0s 的端到端实战指南:通过 k0s 配置文件的 extensions.helm 扩展机制&#xff…

2026/10/12 13:03:21 阅读更多 →

最新新闻

git 源代码里,出现一大堆红色文件的一次思考

git 源代码里,出现一大堆红色文件的一次思考

git 源代码里,出现一大堆红色文件 是因为切换分支的时候,底座导致的。 1.首先要理解rebase是什么意思? rebase是录制本地代码,把最新的代码作为背景,然后把最新修改加在最新代码后面。 2.如何解决呢? git c…

2026/10/15 4:02:46 阅读更多 →
18.从 IP 到 MQTT:STM32 用 AT 指令驱动 ESP-12F 上云的完整链路(含全套实战代码 + 踩坑清单)

18.从 IP 到 MQTT:STM32 用 AT 指令驱动 ESP-12F 上云的完整链路(含全套实战代码 + 踩坑清单)

这是我做 STM32F411 ESP-12F 跑通 MQTT 上云之后的一次系统复盘。上一篇讲了「网络地基 → MQTT 模型 → AT 指令遥控」三层逻辑,有同学说想要能直接抄走跑的代码。这篇我把全套实战代码补上:mqtt.h 头文件、mqtt.c 逐函数实现(每步为什么这…

2026/10/15 4:02:46 阅读更多 →
git 里的 rebase到底是什么?

git 里的 rebase到底是什么?

一句话:rebase-把本地代码录制下来,把背景换成别人的最新代码,然后把本地代码在最新代码基础上播放出来。那么 git pull --rebase origin master 是什么意思呢?意思是什么 取服务器的最新代码作为底座,origin 代码仓库…

2026/10/15 4:02:46 阅读更多 →
从背了就忘到主动复习 江苏一个初中英语班的变化

从背了就忘到主动复习 江苏一个初中英语班的变化

苏南一位初三孩子的妈妈跟我聊起上学期的事。孩子英语卷子拿回来,阅读错一半,完形填空连蒙带猜,最让她头疼的是词汇——今天默写全对,三天后再测,能记住的不到三成。她试过打印单词表、买过卡片、也盯着孩子抄过几遍&a…

2026/10/15 4:02:46 阅读更多 →
GitHub Copilot Chat:用对话方式让 AI 帮你重构代码

GitHub Copilot Chat:用对话方式让 AI 帮你重构代码

GitHub Copilot Chat:用对话方式让 AI 帮你重构代码一、重构——AI 编程的"杀手级场景" 在所有的编程任务中,代码重构是从 AI 辅助中获益最大的场景之一。重构有个特点:它需要理解现有代码的逻辑,然后进行"安全的变…

2026/10/15 4:02:46 阅读更多 →
一种可快速恢复的Zabbix高可用架构设计

一种可快速恢复的Zabbix高可用架构设计

做运维的朋友们可能都有过这样的深夜惊魂:好容器完成了监控的Server、Proxy的部署、告警的收敛,监控的覆盖率也达标了,结果承载Zabbix Server和PostgreSQL的机器突然宕机。那一刻,不是“少看几张图”的问题,而是整个团…

2026/10/15 4:01:45 阅读更多 →

日新闻

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 阅读更多 →