# Claude Code 权限与模式

> Claude Code 权限规则、allow/ask/deny 顺序、权限模式、Bash/Read/Edit/WebFetch/MCP 规则写法和安全边界。

URL: https://docs.passion8.cc/docs/claude-code/permissions
Language: zh-CN
Publisher: Passion8

Claude Code 的权限系统决定它能不能执行命令、改文件、访问路径和调用工具。`CLAUDE.md` 是建议,权限规则才是边界。

## 默认安全模型

| 工具类型 | 示例 | 默认是否需要确认 |
| --- | --- | --- |
| 只读工具 | Read、Grep、Glob、只读 shell | 通常不需要 |
| Bash 命令 | `npm test`、`git push`、脚本 | 需要 |
| 文件修改 | Edit、Write、NotebookEdit | 需要 |

点击“Yes, don't ask again”后,Claude Code 会把规则保存到当前项目上下文或设置文件。Bash 命令通常按项目和命令保存,文件编辑自动批准通常只到当前会话结束。

## 规则顺序

规则有三类:

- `allow`:不用再问
- `ask`:必须询问
- `deny`:直接禁止

评估顺序固定:

1. deny
2. ask
3. allow

所以 `deny` 永远不能被更具体的 `allow` 例外绕过。想做“默认禁止,只允许少数命令”,不要用一个大 `deny` 再加 allow,而是用 `dontAsk` 模式配合 allow。

```json title=".claude/settings.json"
{
  "permissions": {
    "allow": [
      "Bash(npm run lint)",
      "Bash(npm run test *)",
      "Read(./docs/**)"
    ],
    "ask": [
      "Bash(git push *)"
    ],
    "deny": [
      "Read(./.env)",
      "Read(./.env.*)",
      "Read(./secrets/**)"
    ]
  }
}
```

## 权限模式

| 模式 | 说明 | 适合场景 |
| --- | --- | --- |
| `default` | 标准模式,需要时询问 | 日常默认 |
| `acceptEdits` | 自动接受文件编辑和常见文件系统操作 | 个人项目、有 git 兜底 |
| `plan` | 只读计划,不改源文件 | 大改动前研究 |
| `auto` | 自动模式,带后台安全分类器 | 研究预览,谨慎使用 |
| `dontAsk` | 未预批准的工具自动拒绝 | 锁死 CI 或脚本 |
| `bypassPermissions` | 跳过大多数权限提示 | 仅容器或 VM |

命令行启动:

```bash
claude --permission-mode plan
claude --permission-mode acceptEdits
```

会话内可用 `Shift + Tab` 或 `/permissions` 调整。




`bypassPermissions` 会跳过很多敏感目录的提示,例如 `.git`、`.claude`、`.vscode`、`.husky` 等。只在隔离容器、一次性 VM、可恢复环境里使用。




权限模式只决定工具能不能运行。命令运行后的文件系统、网络和凭据边界,需要配合 [沙箱与隔离环境](https://docs.passion8.cc/docs/claude-code/sandboxing)。企业统一下发规则见 [企业网络与集中管控](https://docs.passion8.cc/docs/claude-code/enterprise-admin)。

## 规则语法

权限规则写成:

```text
Tool
Tool(specifier)
```

| 规则 | 作用 |
| --- | --- |
| `Bash` | 匹配所有 Bash |
| `Bash(npm run build)` | 精确匹配命令 |
| `Bash(npm run *)` | 匹配前缀 |
| `Read(./.env)` | 阻止或允许读当前目录 `.env` |
| `Edit(/src/**)` | 匹配 settings 来源目录下的 `src` |
| `WebFetch(domain:example.com)` | 匹配指定域名 |
| `mcp__github__get_*` | 匹配 GitHub MCP server 的 get 工具 |

## Bash 规则

Bash 支持 `*` 通配。Claude Code 会识别复合命令,每个子命令都要独立通过规则。

```json title=".claude/settings.json"
{
  "permissions": {
    "allow": [
      "Bash(npm run *)",
      "Bash(git status)",
      "Bash(git diff *)",
      "Bash(* --version)"
    ],
    "deny": [
      "Bash(git push *)",
      "Bash(rm -rf *)"
    ]
  }
}
```

`Bash(ls *)` 和 `Bash(ls*)` 不一样:前者需要 `ls` 后有空格或结束,后者也可能匹配 `lsof`。

Claude Code 会把部分只读命令视为安全,例如 `ls`、`cat`、`pwd`、`grep`、`find`、`wc`、只读 `git`。如果你也想让这些命令询问,添加 `ask` 或 `deny`。

## Read/Edit 路径模式

| 模式 | 锚点 | 示例 |
| --- | --- | --- |
| `//path` | 文件系统绝对路径 | `Read(//home/alex/secrets/**)` |
| `~/path` | 用户 home | `Read(~/.zshrc)` |
| `/path` | settings 来源目录 | `Edit(/src/**)` |
| `path` 或 `./path` | 当前工作目录 | `Read(./.env)` |

在用户级 `~/.claude/settings.json` 写 `Read(/secrets/**)` 时,它指向 `~/.claude/secrets/**`,不是每个项目的 `secrets`。要跨项目阻止,用 `//` 或 `~/`。

## WebFetch 与网络

```json title=".claude/settings.json"
{
  "permissions": {
    "allow": [
      "WebFetch(domain:docs.example.com)",
      "WebFetch(domain:*.example.com)"
    ],
    "deny": [
      "Bash(curl *)",
      "Bash(wget *)"
    ]
  }
}
```

只限制 WebFetch 不等于限制网络。如果 Bash 允许,Claude 仍可以用 `curl` 或脚本访问网络。需要严格网络边界时,配合 Bash deny、Hook 或系统 sandbox。

## MCP 规则

```json title=".claude/settings.json"
{
  "permissions": {
    "allow": [
      "mcp__github__get_*"
    ],
    "ask": [
      "mcp__database__write_*"
    ],
    "deny": [
      "mcp__*"
    ]
  }
}
```

注意:裸的 `mcp__*` deny 会移除所有 MCP 工具。这样安全,但也会让 Claude 根本看不到这些工具。

## 建议配置

### 个人开发

```json title="~/.claude/settings.json"
{
  "permissions": {
    "allow": [
      "Bash(npm run lint)",
      "Bash(npm run typecheck)",
      "Bash(git status)",
      "Bash(git diff *)"
    ],
    "deny": [
      "Read(//**/.env)",
      "Read(//**/.env.*)"
    ]
  }
}
```

### 团队仓库

```json title=".claude/settings.json"
{
  "permissions": {
    "ask": [
      "Bash(git push *)",
      "Bash(npm publish *)"
    ],
    "deny": [
      "Read(./production/**)",
      "Edit(./production/**)"
    ]
  }
}
```

## 官方参考

- [Configure permissions](https://code.claude.com/docs/en/permissions.md)
- [Choose a permission mode](https://code.claude.com/docs/en/permission-modes.md)
- [Hooks reference](https://code.claude.com/docs/en/hooks.md)
