Files
claude-code/docs/tools/shell-execution.mdx
claude-code-best 5849b8b7f4 docs: 重写 Shell 执行,从源码解剖改为安全设计分析
移除 TypeScript 代码和源码路径,
聚焦只读判定的复合命令处理、AST 解析的 fail-safe 策略、
自动后台化的阻塞预算设计和专用工具 vs shell 的权衡。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-20 10:50:12 +08:00

85 lines
4.2 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: "Shell 执行"
description: "AI 执行命令是最危险的能力。BashTool 如何通过只读判定、AST 解析、自动后台化和输出截断在安全与效率间取得平衡。"
keywords: ["Bash 工具", "命令执行", "Shell 执行", "安全命令", "AI 执行命令"]
---
## 核心挑战
AI 能执行任意 shell 命令是最强大也最危险的能力。一个 `rm -rf /` 就能造成不可逆的破坏。
BashTool 的设计核心是在**安全**和**效率**之间取得平衡——让 AI 能自由执行只读操作,但对有副作用的命令严格把关。
## 只读命令的判定
BashTool 的 `isReadOnly()` 决定一条命令是否需要用户确认:
| 命令类别 | 示例 | 是否只读 |
|---------|------|:--------:|
| 搜索类 | `find`、`grep`、`rg`、`which` | ✓ |
| 读取类 | `cat`、`head`、`wc`、`jq`、`sort` | ✓ |
| 列表类 | `ls`、`tree`、`du` | ✓ |
| 中性命令 | `echo`、`true`、`false` | 不影响判定 |
### 复合命令的处理
对于复合命令(`ls dir && echo "---" && ls dir2`),系统拆分后逐段检查——**所有非中性段都必须属于只读集合**,整条命令才被视为只读。
**设计考量**`echo` 等中性命令不影响判定,因为 `ls && echo "done"` 和单纯的 `ls` 在副作用上没有区别。但如果 `ls && git push``git push` 有副作用,整条命令就不能免审批。
## AST 安全解析
权限检查不是基于简单的字符串匹配——系统使用 tree-sitter bash 解析器分析命令的抽象语法树。
**为什么需要 AST 解析**?字符串匹配无法处理 `git push` 被嵌在管道、子 shell 或条件表达式中的情况。AST 解析可以准确提取每个子命令,确保 `git push` 不会因为被嵌在看似无害的上下文中而绕过检查。
**Fail-safe 策略**:解析失败时,系统假设命令不安全,触发所有安全检查。宁可多确认一次,也不要漏过一个危险命令。
## 超时与自动后台化
长时间运行的命令不应该阻塞 AI 的整个工作循环。
### 分级超时
| 场景 | 超时 |
|------|------|
| 默认 | 2 分钟 |
| 用户显式设置 | 最长 10 分钟 |
### 自动后台化
主线程 Agent 有 15 秒的"阻塞预算"——超过这个时间系统自动将命令转为后台任务AI 可以继续做其他事。后台任务完成后通过通知机制汇报结果。
**设计考量**:一个 `npm install` 可能需要几分钟,不应该让 AI 在此期间完全停滞。自动后台化让 AI 可以在等待安装的同时继续做其他工作——和人类开发者一样。
## 输出截断
命令输出过长时会触发截断,防止海量日志塞进 AI 的上下文窗口。
截断不是简单砍尾——系统通过 `isIncomplete` 标记告知 AI 输出不完整。AI 可以决定是否需要用更精确的命令(如 `grep` 管道、`head` 限制)重新获取。
**设计哲学**:让 AI 知道"信息不完整"比给它一堆截断的垃圾更有用。AI 会根据不完整的信息自行调整策略。
## 专用工具 vs Shell 命令
Claude Code 为文件读写、搜索等操作提供了专用工具Read、Grep、Glob而不是让 AI 用 `cat`、`grep` 等 shell 命令:
| 维度 | 专用工具 | Bash 命令 |
|------|---------|----------|
| **权限** | 只读操作自动放行 | 需要整条命令的权限检查 |
| **输出** | 结构化数据,支持 diff 高亮 | 纯文本,无渲染优化 |
| **性能** | 文件缓存、分页、token 预算 | 每次新进程,无缓存 |
| **并发** | 只读操作可并行执行 | 有副作用的命令必须串行 |
**设计洞察**:专用工具在安全性和效率上都优于等效的 shell 命令。`Read` 工具知道自己是只读的,所以可以自动放行;而 `cat` 走 BashTool 的权限路径,需要更多检查。
## 进度反馈
BashTool 的命令执行是流式的——输出逐行推送,用户可以实时看到 AI 正在执行什么。这比"命令执行中...请等待"的黑盒体验好得多。
## 接下来
- **任务管理** — TaskCreate/TaskUpdate 的追踪系统
- **权限模型** — 理解只读判定的完整安全体系
- **沙箱** — Bash 命令的隔离执行环境