From 88aaf98191142812fb9d2140c814ad04ca0bbb86 Mon Sep 17 00:00:00 2001 From: maogeigei Date: Tue, 15 Sep 2026 21:21:32 +0800 Subject: [PATCH] =?UTF-8?q?fix(cost):=20=E7=94=A8=E4=BB=8A=E6=97=A5=204049?= =?UTF-8?q?=20=E6=9D=A1=E7=9C=9F=E5=AE=9E=E5=91=BD=E4=BB=A4=E5=9B=9E?= =?UTF-8?q?=E6=94=BE=EF=BC=8C=E6=8A=8A=E9=97=A8=E7=A6=81=E8=AF=AF=E6=8B=A6?= =?UTF-8?q?=E4=BB=8E=201.63%=20=E9=99=8D=E5=88=B0=200.07%?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 用户要求:「用今天其他会话的记录多测试几遍,确保不影响 AI 正常会话」。做法 = **回放机**: 从 `~/.workbuddy/projects/` 的 12 个会话转录里抽出 **4049 条真实 Bash 命令**,逐条灌进门禁比对。 **发现(数据,不是推测)** * 旧版 soft 档 DENY **66 / 4049 = 1.63%**,其中 **62 条是 `递归 grep`** —— 而抽样 **29/29 全是窄范围** (单文件 / 具体目录),**0 条从根**;连 `grep -c`(只输出计数、本来只有几行)也被误伤。 * 根因还有一个正则 bug:`\bgrep\b[^|;]*-[a-zA-Z]*[rR]` 里的 `[^|;]*` 会匹配到**路径里的 `-server`** (`-s`+`erve`+`r`)⇒ **凡路径含 `aliyun-dsh-server` 就必命中**(这正是误拦的主要来源)。 **修法** 1. `grep -r` 规则 **core → loose**(仅 `hard` 模式拦):实测"误伤 >> 收益"——`grep -r` 是日常主力工具、几乎总是窄范围 2. 正则收紧为「**选项必须紧跟命令**」(`\bgrep\s+-[a-zA-Z]*[rR]\b` / `\bls\s+-[a-zA-Z]*R\b`), 杜绝"路径里的 `-xxx`"被当成选项 **复测**:soft 档 DENY **3 / 4051 = 0.07%**(`ls -R` / `find <根>` / `journalctl` 无 `-n` 各 1 条), 逐条核对**全为真阳性**;hard 档 0.79%。 --- dsh-server-docs/scripts/bash-output-guard.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/dsh-server-docs/scripts/bash-output-guard.py b/dsh-server-docs/scripts/bash-output-guard.py index d0daa63..aadd486 100644 --- a/dsh-server-docs/scripts/bash-output-guard.py +++ b/dsh-server-docs/scripts/bash-output-guard.py @@ -45,10 +45,15 @@ RULES = [ # cat:**按目标文件大小判定**(小文件不拦)—— 这是防日常误伤的关键,见 cat_bigfile() (True, '__CAT_BIGFILE__', '`cat` 大文件', '改用 `head -30 文件` / `sed -n \'1,30p\' 文件` / `wc -l 文件`'), - (True, r'\bgrep\b[^|;]*-[a-zA-Z]*[rR]', + # ⚠️ 2026-09-15 **回放今日 12 个会话的 4049 条真实命令**:本规则命中 62 次,抽样 **29/29 全是窄范围** + # (单文件 / 具体目录),**0 条从根**;连 `grep -c` 这种本来只有几行的也被误伤。 + # 旧正则 `\bgrep\b[^|;]*-[a-zA-Z]*[rR]` 还有 bug:`[^|;]*` 会匹配到**路径里的 `-server`** + # (`-s`+`erve`+`r`)⇒ 凡路径含 `aliyun-dsh-server` 就必命中。 + # ⇒ **误伤 >> 收益** ⇒ 降为 loose(仅 `hard` 模式拦),并把正则收紧到「选项紧跟 grep」。 + (False, r'\bgrep\s+-[a-zA-Z]*[rR]\b', '递归 grep', '改用 `grep -rn … | head -30`,或 `grep -rc …`(只要计数)'), - # ⚠️ 只拦 -R(递归全树);**不拦 `ls -la`**(含 l 会误伤日常操作 —— 2026-09-15 自查发现) - (True, r'\bls\b[^|;]*-[a-zA-Z]*R', + # ⚠️ 只拦 `-R`(递归全树);**不拦 `ls -la`**(含 l 会误伤日常);选项必须紧跟 ls(同样防路径误匹配) + (True, r'\bls\s+-[a-zA-Z]*R\b', '`ls -R` 递归全树', '改用 `ls -la 目录 | head -20`,或 `ls 目录 | wc -l`'), (True, r'\bfind\s+(/[A-Za-z]|[A-Za-z]:)', '`find` 从盘符/根起全树扫', '改用 `find 具体目录 -maxdepth 3 … | head -20`'),