> ## Documentation Index
> Fetch the complete documentation index at: https://ccsafetynet.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# 被阻止的命令及其原因

> CC Safety Net 阻止的 Git、rm、find、设备、PowerShell 和敏感路径操作，以及每项规则需要的安全级别。

CC Safety Net 阻止这些命令，因为它们可能永久破坏数据，包括未提交的更改、stash、远程历史或整个磁盘。下表涵盖默认内置规则；你可以用[自定义规则](/docs/zh-Hans/configuration/custom-rules)扩展它们。

默认情况下，所有未标记的行在三个安全级别中都会阻止。标记为 **Strict** 或 **Paranoid** 的行需要对应级别或能力。策略可以禁用部分非灾难性规则。启用各级别的方法见[模式](/docs/zh-Hans/configuration/modes)。

本页是行为矩阵，说明*阻止什么*以及每项边界的位置。它不是架构页面：有序防护流程见[架构](/docs/zh-Hans/guides/architecture)，分类器如何得到判定见[分析引擎](/docs/zh-Hans/guides/analysis-engine)，可通过的安全变体见[被允许的命令](/docs/zh-Hans/reference/allowed-commands)。

## 每个级别增加的阻止

| 级别         | 增加的阻止                                                             |
| ---------- | ----------------------------------------------------------------- |
| `standard` | 阻止所有未标记项。无法解析但看似安全的文本可以通过；包含可识别破坏性模式的文本仍被阻止。动态 `rm -rf` 目标不一定被阻止。 |
| `strict`   | 加上无法解析的命令、无法验证的破坏性目标、不支持的 heredoc 和内置敏感路径的元数据发现。                  |
| `paranoid` | 加上当前工作目录内的非临时递归强制删除，以及所有解释器单行命令。                                  |

<Note>根目录和主目录递归删除、Git 元数据保护和规范 `policy.json` 保护不依赖安全级别，也不能通过规则覆盖关闭。</Note>

## Git 命令

| 命令模式                                | 阻止原因                            |
| ----------------------------------- | ------------------------------- |
| `git checkout -- <files>`           | 永久丢弃未提交的更改                      |
| `git checkout --force` / `-f`       | 强制丢弃未提交的更改                      |
| `git checkout <ref> -- <path>`      | 用 ref 中的版本覆盖工作区                 |
| `git checkout <ref> <path>`         | Git 区分 ref 和 pathspec 时可能覆盖工作区  |
| `git checkout --pathspec-from-file` | 可以从文件列表覆盖多个文件                   |
| `git restore <files>`               | 丢弃未提交的更改；仅取消暂存请使用 `--staged`    |
| `git restore --worktree` / `-W`     | 明确丢弃工作区更改                       |
| `git switch --discard-changes`      | 切换分支时丢弃未提交的更改                   |
| `git switch --force` / `-f`         | 强制切换并丢弃未提交的更改                   |
| `git reset --hard`                  | 删除所有未提交的更改                      |
| `git reset --merge`                 | 可能丢失未提交的更改                      |
| `git clean -f` / `--force`          | 永久删除未跟踪文件                       |
| `git push --force` / `-f`           | 改写远程历史；请使用 `--force-with-lease` |
| `git branch -D`                     | 不检查合并状态就强制删除分支                  |
| `git rebase --abort`                | 丢弃 rebase 冲突解决结果                |
| `git merge --abort`                 | 丢弃 merge 冲突解决结果                 |
| `git tag -d` / `--delete`           | 永久删除 tag                        |
| `git reflog delete`                 | 删除恢复历史                          |
| `git stash drop`                    | 永久删除已 stash 的更改                 |
| `git stash clear`                   | 删除所有已 stash 的更改                 |
| `git worktree remove --force`       | 不检查更改就强制删除 worktree             |

同时带强制标志和创建/重置标志的 Git 分支变更命令（例如 `git checkout -Bf`、`git switch -Cf --discard-changes`）会被视为强制分支重置并阻止。

### Git SSH 环境覆盖

Git 接受 `GIT_SSH_COMMAND`、`GIT_SSH` 和 `GIT_SSH_VARIANT`，以在网络操作期间运行任意程序。CC Safety Net 会阻止这些覆盖与网络子命令的组合：

| 被阻止的模式                                            | 阻止原因                         |
| ------------------------------------------------- | ---------------------------- |
| `GIT_SSH_COMMAND=... git clone`                   | SSH 覆盖可在网络操作期间执行任意命令         |
| `GIT_SSH=... git fetch` / `pull` / `push`         | 同上，适用于 fetch、pull 和 push     |
| `GIT_SSH_VARIANT=... git ls-remote` / `submodule` | 同上，适用于 ls-remote 和 submodule |

## 文件系统命令

| 命令模式                                        | 阻止原因                                 | 级别                                                                          |
| ------------------------------------------- | ------------------------------------ | --------------------------------------------------------------------------- |
| `rm -rf /`, `~`, `$HOME`                    | 删除根目录或主目录                            | 全部，灾难性                                                                      |
| `rm -rf .git` 和受保护 hooks                    | 破坏仓库历史和 hooks                        | 全部，灾难性                                                                      |
| `rm -rf .`                                  | 删除当前工作目录本身                           | 全部                                                                          |
| `rm -rf` 到 cwd 以外                           | 删除工作区以外的绝对、父级或非临时路径                  | 全部                                                                          |
| 主目录为 cwd 时运行 `rm -rf`                       | 以主目录为删除基准不安全                         | 全部                                                                          |
| `rm -rf "$target"`                          | 动态目标无法在执行前验证                         | **Strict**、paranoid                                                         |
| `rm -rf ./cache`                            | 即使在 cwd 内也限制非临时递归删除                  | **Paranoid**（[`CC_SAFETY_NET_PARANOID_RM=1`](/docs/zh-Hans/configuration/modes)） |
| `cleanup() { rm -rf ../outside; }; cleanup` | 在调用位置分析被调用的 shell 函数正文；仅定义函数不会执行任何操作 | 全部                                                                          |
| `find ... -delete`                          | 永久删除匹配文件；先用 `-print` 预览              | 全部                                                                          |
| `find .git -delete`                         | 选择受保护的 Git 元数据进行删除                   | 全部，灾难性                                                                      |
| `find -exec rm -rf ...`                     | 在 `find` 中执行递归强制删除                   | 全部                                                                          |
| `xargs rm -rf`                              | 动态输入使目标不可预测                          | 全部                                                                          |
| `xargs <shell> -c`                          | 可以执行任意命令                             | 全部                                                                          |
| `parallel rm -rf`                           | 动态输入使目标不可预测                          | 全部                                                                          |
| `parallel <shell> -c`                       | 可以执行任意命令                             | 全部                                                                          |

`rm -rf` 目标使用以下首个匹配分类顺序：不受支持的 Windows UNC 或设备目标、根目录或主目录、受保护的 Git 元数据、临时路径、动态目标、配置的 allow path、主目录作为工作目录、工作目录本身、工作目录内部、工作目录外部。临时路径在所有级别都允许。当前工作目录内的其他路径在 paranoid `rm` 未启用时允许。安全变体见[被允许的命令](/docs/zh-Hans/reference/allowed-commands)。

将破坏性命令隐藏在 POSIX 函数中不会改变这些规则：函数正文会在调用位置使用调用者的 cwd 进行分析；调用可经由引号（`'cleanup'`）、`time`/`!` 前缀和 `eval` 解析。未调用的定义不产生作用。有关调用解析和 scope，请参阅 [POSIX shell 函数](/docs/zh-Hans/guides/analysis-engine)。

<Warning>
  `standard` 不会一律阻止动态 `rm -rf` 目标。`rm -rf "$target"` 只有在启用 `fail_closed` 的 `strict` 或 `paranoid` 中才被阻止。不可信来源可能构造命令时，请使用更高级别。
</Warning>

Git 元数据和动态目标都会在配置的 allow path 前分类，因此 `destructive_command_protection.allow_paths` 中的项绝不会放宽 Git 元数据保护，也绝不会应用于无法验证的目标。

## 设备和磁盘破坏

CC Safety Net 在每个安全级别分析 `dd`、`mkfs` 和 `shred`。这些规则不是灾难性规则，因此主破坏性命令开关和单条规则的 `off` 覆盖仍可应用。

| 命令模式                            | 阻止原因                                                                                   |
| ------------------------------- | -------------------------------------------------------------------------------------- |
| `dd ... of=/dev/...`            | 直接写入设备路径可能破坏磁盘或分区。重新排序和带引号的操作数也涵盖在内（`dd of=/dev/nvme0n1 if=/dev/zero`、`of="/dev/sda"`） |
| `mkfs /dev/...` 和任何 `mkfs.*` 变体 | 格式化设备会清除其中的全部内容（`mkfs.ext4 /dev/sda1`、`mkfs -t ext4 /dev/sdb`）                         |
| `shred <target>`                | 永久破坏目标；包括 `shred --help` 和 `shred --version` 在内的所有目标都被阻止                               |

只有对设备的*写入*会触发 `dd` 规则。从设备读取到文件（`dd if=/dev/sda of=./backup.img`）可以通过，对文件镜像运行 `mkfs.ext4 disk.img` 也可以通过。三条规则也适用于包装器和载体：`bash -c "dd if=/dev/zero of=/dev/sda"`、`sudo mkfs.ext4 /dev/sda`、`env dd of=/dev/sda if=/dev/zero` 和 `eval "shred secret"` 都会被阻止。

## Git 元数据

CC Safety Net 解析执行目录最近的祖先 `.git` 入口，并保护该入口、解析出的 Git 目录及其 `hooks` 子树。即使你位于工作目录内，此保护也会生效。它在加载任何配置前求值，因此没有安全级别，策略也无法关闭它。

| 被阻止的形式                                           | 说明                                                                                   |
| ------------------------------------------------ | ------------------------------------------------------------------------------------ |
| `rm .git`, `rm -rf .git`, `rm .*`                | 直接删除 Git 控制入口                                                                        |
| `rm -rf <resolved gitDir>`, `rm -rf <commonDir>` | 对于 **linked worktree** 或 submodule，`.git` 是标记文件；它所指向的解析后 `gitDir` 和 `commonDir` 也受保护 |
| `rm -rf <root>/.git/modules/<submodule>`         | 保护 submodule Git 目录                                                                  |
| `rm -rf <dirname(gitDir)>/*`                     | glob 覆盖受保护目录                                                                         |
| `mv` 使用受保护源或目标                                   | 阻止移动路径                                                                               |
| `> .git` 和其他写入重定向                                | 阻止覆盖                                                                                 |
| `Write` 或 patch 的目标是 `.git/hooks/new-hook`       | 写入工具、patch 和未知工具路径；只读工具除外                                                            |
| `find .git -delete`                              | 即使将 `find.delete-git-metadata` 设置为 `off`，也始终是灾难性操作                                   |

符号链接的 `.git` 和 hooks 会同时按字面路径和规范路径保护，指向缺失 Git 目录的 `.git` 标记仍会阻止。POSIX shell 中末尾的 `*` 不匹配 dot-entry，因此仓库根目录中的 `rm -rf ./*` 不涵盖 `.git`，但 `rm -rf .git/worktrees/*` 和 PowerShell 通配符会涵盖。

<Note>保护范围是执行目录最近的 Git 控制面，不包括执行目录下其他嵌套仓库，也不包括解析集合外的 Git 内部路径。</Note>

## 规范 `policy.json`

修改或删除 `~/.cc-safety-net/policy.json`，或设置变量时的 `$CC_SAFETY_NET_HOME/policy.json`，始终被阻止。此检查在加载配置前运行，因此其保护策略无法禁用它，拒绝不带安全级别或配置状态。原因字符串严格为：

```text theme={"dark"}
This path contains the protected policy config and you must not modify or delete it.
```

检查覆盖文件、其目录和祖先目录的直接写入、编辑、patch、准确 shell 操作数、写入重定向、受支持的环境变量/相对路径/现有符号链接别名、递归删除，以及以文件、目录或祖先为源的移动。

以下只读命令允许检查该文件：`[`, `cat`, `file`, `grep`, `head`, `jq`, `less`, `ls`, `more`, `rg`, `sed`, `stat`, `tail`, `test`, `wc`。

<Warning>这是有意保持最小范围的精确路径保护，不是命令模拟。它跟踪仅赋值 shell 变量和明确的 `cd`，但不会展开 glob 或 brace，不会推断解释器计算路径、检查解释器正文、推断归档成员、模拟 `find` 操作或推断传输后的最终文件名。Rulebook、lockfile、缓存、同级文件和对策略目录的检查不在此防护范围内，只有 `policy.json` 防篡改。</Warning>

## PowerShell `Remove-Item`

PowerShell 支持是以 `Remove-Item` 及其别名和现有跨 shell 规则为中心的保守子集，不是通用 PowerShell 解析器。规则在 `powershell` 和 `auto` shell 模式中生效；`posix` 模式有意不应用这些规则，但仍保留 `git.reset-hard` 和 `rm.recursive-force-root-or-home` 等跨 shell 规则。

| 命令模式                                                             | 阻止原因                                                                             | 级别                                                                          |
| ---------------------------------------------------------------- | -------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
| `Remove-Item C:\`, `~`, `$HOME`, `$env:USERPROFILE`, `$env:HOME` | 删除根目录或主目录，包括末尾 `\`、`\*` 和 `/` 变体                                                 | 全部，灾难性                                                                      |
| `Remove-Item .git -Recurse -Force`                               | 受保护的 Git 元数据；PowerShell 通配符*会*匹配 dot-entry                                       | 全部，灾难性                                                                      |
| `Remove-Item . -Recurse -Force`                                  | 删除当前目录本身，包括位于 `--` 参数结束标记后时                                                      | 全部                                                                          |
| `Remove-Item ../other -Recurse -Force`                           | 删除 cwd 以外路径，包括 `..\other`、`../{other}`、含有外部元素的逗号分隔数组，以及 Windows UNC/namespace 目标 | 全部                                                                          |
| `Set-Location $HOME; Remove-Item ./build -Recurse -Force`        | cwd 为主目录时递归删除                                                                    | 全部                                                                          |
| `Remove-Item $target -Recurse -Force`                            | 无法验证动态目标                                                                         | **Strict**、paranoid                                                         |
| `Get-ChildItem . -Recurse \| Remove-Item -Force`                 | 无法验证管道输入                                                                         | **Strict**、paranoid                                                         |
| `Remove-Item -Recurse -Force -Path`                              | 缺少 `-Path` 值，因此分类为动态目标                                                           | **Strict**、paranoid                                                         |
| `Remove-Item @params -Recurse -Force`                            | splatted 参数分类为动态目标                                                               | **Strict**、paranoid                                                         |
| `Remove-Item ./cache -Recurse -Force`                            | cwd 内的非临时路径                                                                      | **Paranoid**（[`CC_SAFETY_NET_PARANOID_RM=1`](/docs/zh-Hans/configuration/modes)） |

系统解析别名和缩写参数，因此 `ri . -r -fo` 也会阻止。调用运算符形式（`& Remove-Item ...`、`& { ... }`、`. { ... }`）、带字面量字符串的 `iex` / `Invoke-Expression` 和 `$(...)` 子表达式都会被分析。行注释（`#`）和块注释（`<# ... #>`，包括嵌套）会被忽略，但其后的真实命令仍会阻止；格式错误或超过深度限制的块注释和子表达式会故障时拒绝。

<Note>`-WhatIf` 会取消删除，因此 `-WhatIf`、`-WhatIf:$true` 和 `-wi` 允许原本被阻止的命令；显式 `-WhatIf:$false` 仍会阻止。Strict 行有一个例外：`Remove-Item $HOME -Recurse -Force` 在 `standard` 中也会阻止，因为它分类为根目录/主目录目标，而不是动态目标。</Note>

## 敏感路径

敏感路径保护是独立的防护阶段，在命令分析前运行。它涵盖受支持的 **command**、**path**、**search**（grep/glob）和 **patch** 形式，也会检查未知工具，但绝不会将未知工具的任意文本视为 shell 命令。

内置敏感集合不只阻止写入，也阻止读取：`cat .env`、`env cat .env`、`sudo command cat .env`、`strings id_rsa`、`xxd .env`、`base64 .env`、`dd if=.env`、`cat ~/.ssh/id_rsa`、`bash -c "cat .env"` 和 `node -e 'require("child_process").execSync("cat .env")'` 都会被阻止。

command 形式的提取是有界且结构化的：达到结构 shell 语法限制时会故障时拒绝，无效解析会抛出错误。配置的 deny path 在内置规则前匹配，并且绝不会被任何 `standard` 模式放宽。

完整目录（每个规则 ID 和系列、受保护路径、两个 Coding CLI 层级、匹配顺序和豁免）见[机密保护参考](/docs/zh-Hans/reference/secret-protection)。可用 `secret_protection.enabled: false` 禁用整个功能，也可通过 `secret_protection.overrides` 开关单项规则，详情见[策略](/docs/zh-Hans/configuration/policy)。

## Shell 包装器和解释器单行命令

系统也会阻止包在 `bash -c` 或 `sh -c` 等 shell 解释器中的命令。CC Safety Net 最多递归分析 10 层嵌套包装器；超过该深度时会拒绝，而不会放行。

| 示例                           | 结果 |
| ---------------------------- | -- |
| `bash -c 'git reset --hard'` | 阻止 |
| `sh -lc 'rm -rf /'`          | 阻止 |

默认情况下，会检测并阻止解释器单行命令中嵌入的破坏性代码。CC Safety Net 提取传给解释器 `-c` 或 `-e` 标志的代码，并扫描嵌入的破坏性操作，因此智能体无法将 `os.system("rm -rf /")` 包在 Python 或 Node 调用中来绕过 hook。

| 示例                                                            | 结果   |
| ------------------------------------------------------------- | ---- |
| `python -c 'import os; os.system("rm -rf /")'`                | 默认阻止 |
| `node -e 'require("child_process").exec("git reset --hard")'` | 默认阻止 |

分析的解释器是 `python`、`python2`、`python3`、`node`、`ruby` 和 `perl`。触发阻止的是嵌入的破坏性命令，默认情况下不会只因单行命令形式而阻止。

### 阻止所有解释器单行命令

设置 `CC_SAFETY_NET_PARANOID_INTERPRETERS=1` 后，所有这些解释器单行命令都会被阻止，即使不含危险代码。`python -c "print(1)"` 在 `standard` 和 `strict` 中允许，在此处被阻止。详情见[模式](/docs/zh-Hans/configuration/modes)。

这会阻止每个 `python -c`、`node -e`、`ruby -e` 和 `perl -e` 单行命令，而不论其内容。

## `strict` 和 `paranoid` 中的 heredoc

启用 `fail_closed` 能力时，heredoc 仅在以下条件全部满足时允许：只有一个 heredoc；用于标准输入；分隔符带引号；没有其他输入重定向；消费者是字面量 `cat`、`tee`、`git apply`、`git commit`、`gh pr create` 或 `gh issue create`。`fail_closed` 在 [`strict`](/docs/zh-Hans/configuration/modes) 和 [`paranoid`](/docs/zh-Hans/configuration/modes) 中启用。

不带引号的分隔符会使用以下拒绝消息：

```text theme={"dark"}
Unquoted heredoc input is not supported safely. Quote the delimiter or ask the user to verify.
```

其他不受支持的形式或消费者会使用以下消息：

```text theme={"dark"}
This heredoc form or stdin consumer is not supported safely. Use a quoted heredoc with a supported consumer (cat, tee, git apply, git commit, gh pr create, gh issue create), or ask the user to verify.
```

完整 heredoc 合同（包括 `standard` 模式处理 heredoc 内容的方式）见[分析引擎](/docs/zh-Hans/guides/analysis-engine)。

## 无法解析的命令文本

| 输入                                  | `standard` | `strict` 和 `paranoid` |
| ----------------------------------- | ---------- | --------------------- |
| `echo 'unterminated`                | 允许         | 阻止，无法安全分析             |
| `git reset --hard 'unterminated`    | 后备扫描阻止     | 阻止                    |
| `dd if=/dev/zero of=/dev/sda 'oops` | 后备扫描阻止     | 阻止                    |

解析器资源限制与级别无关，在所有模式下都会拒绝。使用 `npx cc-safety-net explain "<command>"` 可查看具体规则和分析结果。

启发式扫描会查找 `rm -rf`、`git reset --hard`、`git reset --merge`、`git clean -f`、`git checkout --force`、`git checkout --`、`git push --force`、`git push --delete`、`git branch -D`、`git tag -d`、`git stash drop`、`git stash clear`、不带 `--staged` 的 `git restore`、`find -delete`、`dd of=/dev/`、`mkfs /dev/` 和 `shred <arg>`。匹配会以规则 `raw-text.dangerous-command` 拒绝。文本以 `echo ` 或 `rg ` 开头时会跳过 `find`、`dd`、`mkfs` 和 `shred` 模式，避免引用这些字符串触发扫描。

<Warning>资源耗尽限制独立于级别系统，并在包括 `standard` 在内的**每个**模式中拒绝：超过声明命令递归限制或结构命令验证限制始终拒绝，绝不会放行。</Warning>

<Note>`explain` 命令可准确跟踪 CC Safety Net 阻止或允许任意命令的原因。参数见 [CLI 命令](/docs/zh-Hans/reference/cli-commands)，JSON schema 见 [Explain 跟踪](/docs/zh-Hans/reference/explain-trace)。</Note>
