篇章三 · 3.2
BashTool 剖析
最复杂的工具:1143 行、全系统最复杂的权限逻辑、还要自己决定进不进沙箱。核心问题只有一个——这条命令,放不放行?
每条命令,过 8 道关卡
BashTool 的权限函数 bashToolHasPermission() 是一条决策链:从最快的模式检查,到 tree-sitter 把命令拆成语法树逐个比对。你在下面当裁判——看看你和系统的判断差几条。
权限裁判台 · 你来放行还是拦
1 / 5
npm install 先凭直觉判——再看系统怎么想。
系统的 8 道关卡
1checkPermissionMode按当前权限模式快速分诊
2checkReadOnlyConstraints只读命令白名单(ls / cat / git status…)
3checkPathConstraints命令里出现的路径是否在允许范围
4checkSedConstraintssed 特殊处理——文本替换的路径约束单独一套
5tree-sitter 解析把命令拆成语法树,不是正则瞎猜
6逐子命令匹配管道/链式命令拆开,每个子命令过规则
7前缀/通配符npm:* 匹配所有 npm 子命令;git * --no-edit 通配
8AI 分类器兜底规则全没命中 → 分类器判断(4.2 站拆它)
子命令上限 50 个:超过 50 个子命令的命令直接拒绝——防的是「CPU 饥饿攻击」:一条塞了几千个分号的命令,光是逐个检查就能把工具卡死。MAX_SUBCOMMANDS_FOR_SECURITY_CHECK = 50。
进不进沙箱 · 三问
🌐isSandboxingEnabled全局开关开着吗?
→
⚠️dangerouslyDisable用户显式关了吗?
→
📋排除清单命令在沙箱排除列表里吗?(docker/tmux 等需要真环境)
本站要点:BashTool 的权限判断不是正则匹配,是语法树级的——tree-sitter 把命令拆成 AST 再逐节点比对,管道后面的每个子命令都逃不掉。下一站是它的邻居 FileEditTool:12 道验证 + mtime 乐观并发。