命令字典
Slash 命令、CLI 子命令、Hook 事件、启动参数的字典与演进史。
Slash 命令、CLI 子命令、Hook 事件、启动参数的字典与演进史。
管理工具权限的允许、询问和拒绝规则
/permissions(别名 /allowed-tools)是 Claude Code 的会话内交互式权限管理面板。
打开后它列出当前生效的全部权限规则及每条规则所在的 settings.json 文件路径,让你无需手动编辑 JSON 即可新增或删除 allow / ask / deny 规则。
官方文档对该命令的定位:
"You can view and manage Claude Code's tool permissions with
/permissions. This UI lists all permission rules and the settings.json file they are sourced from."
重要前提:权限规则由 Claude Code harness 强制执行,不受 prompt 或 CLAUDE.md 指令影响。在 prompt 里写"不要问我"不等同于在这里设置 allow 规则。
在会话输入框里输入:
/permissions
或等价别名:
/allowed-tools
面板随即展开,列出所有已加载规则及其来源文件。
规则格式为 Tool 或 Tool(specifier),可以放在 allow / ask / deny 三个列表中。
匹配某工具的所有调用:
Bash
WebFetch
Read
Edit
裸工具名作为 deny 规则时,会把该工具从 Claude 的上下文中完全移除——Claude 看不到这个工具的存在。
带 specifier 的精确 / 通配匹配:
| 规则 | 作用 |
|---|---|
Bash(npm run build) | 精确匹配该命令 |
Bash(npm run *) | 匹配所有以 npm run 开头的命令 |
Bash(git * main) | 匹配中间含任意内容、以 main 结尾的 git 命令 |
Read(./.env) | 匹配读取当前目录下 .env |
Read(/src/**) | 匹配项目根目录下 src/ 内所有文件(跨目录) |
WebFetch(domain:example.com) | 匹配对 example.com 的 fetch 请求 |
WebFetch(domain:*.example.com) | 匹配任意子域名,不含顶域本身 |
mcp__puppeteer__puppeteer_navigate | 匹配 puppeteer MCP server 的特定工具 |
Agent(Explore) | 匹配 Explore subagent |
带 specifier 的 deny 规则与裸工具名行为不同:工具仍留在上下文里,但 Claude 触发匹配调用时会被直接拦截。
deny → ask → allow
第一个匹配的规则决定结果,规则粒度不影响优先级。若同时有 ask 规则和更精确的 allow 规则命中同一次调用,ask 先匹配则仍会弹出确认框。
/permissions 面板读写的底层结构是各层 settings.json 里的 permissions 对象:
{
"permissions": {
"allow": [
"Bash(npm run *)",
"Bash(git commit *)"
],
"deny": [
"Bash(git push *)",
"mcp__*"
],
"ask": [
"Bash(rm *)"
]
}
}
| 层级 | 文件 | 可被覆盖 |
|---|---|---|
| Managed(组织管控) | 通过 MDM/OS 策略分发 | 否,任何层级均无法覆盖 |
| CLI 参数 | --allowedTools / --disallowedTools | 可被 managed 覆盖 |
| 项目本地 | .claude/settings.local.json | 可被上层覆盖 |
| 项目共享 | .claude/settings.json | 可被上层覆盖 |
| 用户全局 | ~/.claude/settings.json | 可被上层覆盖 |
任一层级的 deny 规则均不能被更低层级的 allow 覆盖。
在 settings.json 中通过 defaultMode 字段设置整体审批模式:
| Mode | 行为 |
|---|---|
default | 首次使用每个工具时弹出确认 |
acceptEdits | 自动接受文件编辑及常见文件系统命令 |
plan | 只允许读文件和只读 shell 命令,不允许写操作 |
auto | 后台安全检查后自动批准(研究预览功能) |
dontAsk | 自动拒绝所有工具,除非已通过 /permissions 或 permissions.allow 预批准 |
bypassPermissions | 跳过所有权限提示(仅限容器/VM 等隔离环境使用) |
| 约束 | 说明 |
|---|---|
| ask 规则优先于同粒度 allow | 评估顺序固定为 deny→ask→allow,规则粒度不改变顺序 |
| deny 与 ask 支持工具名通配符,allow 不支持宽泛通配 | allow 规则中 mcp__<server>__* 可用,但 *、B*、mcp__* 等非 server 锚定通配符被跳过并产生警告 |
| 裸工具名 deny 会移除工具上下文 | Bash 作为 deny 规则后 Claude 完全不知道 Bash 存在 |
| Read/Edit deny 不覆盖子进程 | Python/Node 脚本自身打开文件不受规则约束,需要 sandbox 做 OS 级隔离 |
| 复合命令逐段匹配 | 一条规则必须匹配复合命令的每个子命令才能放行;审批时按子命令逐条写入规则(最多 5 条) |
| Process wrapper 自动剥离 | timeout、time、nice、nohup、stdbuf 等被剥除后再匹配;docker exec、npx 等不在剥除列表 |
| Hooks 与规则相互独立 | PreToolUse hook 返回 allow 不绕过 deny 规则;hook 以 exit 2 阻断则绕过 allow 规则 |
bypassPermissions 仍有硬性防护 | 显式 ask 规则及针对 /、~ 的 rm 操作仍会弹出确认 |
| 方式 | 持久性 | 粒度 | 适用场景 |
|---|---|---|---|
/permissions 面板 | 写入对应 settings.json | 规则级 | 会话中快速查看/调整 |
| 直接编辑 settings.json | 永久 | 规则级 | 批量配置、版本控制 |
--allowedTools CLI 标志 | 仅当次会话 | 工具列表 | 脚本/CI 临时授权 |
| PreToolUse Hook | 永久(配置文件) | 运行时逻辑 | 需要正则/外部校验的复杂策略 |
Permission Mode(defaultMode) | 永久(settings) | 全局行为模式 | 切换整体审批策略 |
/init 和 /mcp 之后运行,为这个 repo 建立审批基线——决定哪些 Bash 命令无需每次确认。defaultMode 设为 dontAsk,再通过 /permissions 预批准明确安全的工具集,既防止 Claude 意外调用危险命令,又无需人工逐次确认。mcp__* 禁止所有 MCP 工具,再用 mcp__<server>__<tool> 逐一放行需要的工具。Bash(rm -rf *) 或 Bash(git push --force *),让这些命令始终被拦截而非弹框询问。allowManagedPermissionRulesOnly: true,阻止用户层与项目层 settings 再定义 allow / ask / deny 规则(官方原文 "prevents user and project settings from defining allow, ask, or deny permission rules"),使权限规则只能由 managed settings 下发。/permissions 对话框可查看最近的 auto mode 拒绝及其原因(官方原文 "review recent auto mode denials",链 auto-mode-config#review-denials)。v2.1.193 起,auto-mode 的拒绝原因(denial reasons)会同时写入 transcript、拒绝提示(denial toast)以及 /permissions 的 recent denials 列表,便于排查"为什么这条命令被 auto mode 挡下"——据此调整 allow 规则或 auto-mode 配置,而非盲目放宽权限。ask 会"盖过"更精确的 allow:规则评估按 deny→ask→allow 顺序,与 specifier 粒度无关。如果你有 ask: ["Bash"] 和 allow: ["Bash(npm test)"],npm test 仍然会弹框,因为 ask 先命中。要解决这个问题,需将 ask 规则也设为带 specifier 的形式。
用 Bash 规则限制 curl URL 极不可靠:官方文档明确警告,Bash(curl http://github.com/ *) 无法防御选项顺序不同、变量展开、协议变化等情况。应改用 WebFetch(domain:github.com) 配合 Bash 中的 curl/wget deny 规则。
Read/Edit 路径语法陷阱:/path 是相对于项目根目录的路径,不是文件系统绝对路径。绝对路径必须使用 //path(双斜杠)。
bypassPermissions 的安全边界:该模式会跳过 .git、.config/git、.claude 等敏感目录的写入提示,只有显式 ask 规则和针对根目录/家目录的 rm 仍会弹框。非隔离环境不应启用。
process wrapper 列表不可配置:内置剥除列表(timeout/time/nice 等)固定无法修改;npx、direnv exec、devbox run 等执行器不在其中——Bash(devbox run *) 实际上会匹配 devbox run rm -rf .,需要写具体子命令规则。
修复 Recently-denied 标签页关闭时更改未保存的问题
修复布局和间距问题
被拒绝的命令现在在 /permissions 最近标签页显示并可通过 r 重试
改进了Tab和arrow键在列表中的导航
修复了左右方向键的tab导航
修复了 `/permissions` Workspace tab 中的重复条目问题。
添加搜索功能,支持通过 `/` 快捷键过滤工具名称规则
新增斜杠命令用于控制 Claude Code 使用特定工具前是否总是请求权限确认。
从 /allowed-tools 重命名而来