跳到正文
claudemods

Claude Code 危险命令拦截:在执行前拒绝破坏性命令

在 rm -rf /、强推 main、DROP TABLE、curl | sh 等破坏性 Bash 命令执行前将其拒绝。

权限

  • 拦截工具调用能看到 Claude 发起的每一次工具调用(tool.call / tool.check),并可以阻止或修改它。
  • 修改界面在 Claude Code 界面中绘制内容:横条、面板、状态文字、弹出通知(ui.render / $.ui.*)。
实测版本
v2.1.291
最近实测
需要
Claude Code ≥ 2.1.287
显示位置
弹出通知

在 Claude Code 中安装:

/plugin install cm-block-dangerous-commands --marketplace rotbit/claudemods-marketplace
全部安装方式 ↓

这个插件能做什么?

借助这款 Claude Code 危险命令拦截插件,你可以阻止 Claude Code 通过 Bash 工具即将执行的危险命令。每条 shell 命令在执行之前,都会先与一小组规则逐一比对。一旦命中,命令就会被拒绝,Claude 会被告知触发的是哪条规则以及原因,你也会看到一条带有规则名称的提示通知(toast)。安全的命令则原样放行,不受任何影响。

内置规则涵盖:对 /、~、$HOME、. 或 * 执行 rm -rf;对 main 或 master 执行 git push --force;git clean -fdx;SQL 的 DROP TABLE、DROP DATABASE、DROP SCHEMA 和 TRUNCATE;chmod -R 777 /;mkfs;用 dd 写入磁盘设备;把输出重定向到裸磁盘;把 curl 或 wget 的输出通过管道交给 shell 执行;以及经典的 fork 炸弹。git reset --hard 作为可选规则提供,需要手动开启。需要 Claude Code 2.1.287 或更高版本。

演示

录屏中,我们让 Claude 在一个演示项目里执行一项破坏性操作。插件拒绝了这次 Bash 调用,一条提示通知显示出命中的规则名称,Claude 读到拒绝原因后做出回应,而没有真正运行该命令。

安装

使用安装区块中的任意一种方式即可。防护从下一次工具调用起生效;执行 /reload-plugins 之后无需重启。

$ install cm-block-dangerous-commands

需要 Claude Code ≥ 2.1.287

  1. 1.在 Claude Code 中一行安装

    /plugin install cm-block-dangerous-commands --marketplace rotbit/claudemods-marketplace

    粘贴到正在运行的会话中(v2.1.275+)。Claude Code 会先询问是否添加该插件市场。

  2. 2.从终端安装

    claude plugin marketplace add rotbit/claudemods-marketplace
    claude plugin install cm-block-dangerous-commands@claudemods

    然后在所有已打开的会话中运行 /reload-plugins。

  3. 3.免安装试用

    git clone https://github.com/rotbit/claudemods-marketplace
    claude --plugin-dir ./claudemods-marketplace/cm-block-dangerous-commands

    仅在当前会话中加载该插件,不会写入你的设置。

工作原理

全部逻辑都在一个 tool.call 钩子中。以下摘自 hooks/register.ts:

on('tool.call', { tool: 'Bash' }, ($, e, next) => {
  const match = findMatch(e.command, settings)
  if (match === undefined) return next(e)

  if (settings.mode === 'warn') {
    $.ui.toast(`${$.plugin.name}: "${match.name}" is running (warn mode)`)
    return next(e)
  }

  $.ui.toast(`${$.plugin.name}: blocked "${match.name}"`)
  return { deny: denyReason($.plugin.name, match) }
}).catch(($, e, next) =>
  next.called
    ? next(e)
    : { deny: `${$.plugin.name}: its check failed, so the command was not run to be safe.` },
)

匹配器 { tool: 'Bash' } 表示这个钩子只会看到 shell 命令。hooks/rules.ts 中的 findMatch 会先检查 allowPatterns,再检查内置规则(跳过已关闭的规则),最后检查你的 extraPatterns。没有命中时,next(e) 会照常运行命令。命中时,钩子返回 { deny: reason },这个原因就成为 Claude 读到的工具结果。

正是 .catch 处理器让它成为一道真正的防线,而不只是一个过滤器。如果检查在调用 next 之前抛出异常,这次调用会被拒绝而不是放行:插件采用失败即拒绝的策略。另有一个 session.start 钩子,在你的自定义模式中存在无效正则表达式时弹出一次提示。

rules.ts 中的每条规则都是纯数据,包含 id、名称、一句话原因,以及供测试校验用的示例命令。

自定义

在 /config 中修改这些选项。mode: warn 会把防护变成提醒器:命中的命令仍会执行,你只会收到一条提示。extraPatterns 和 allowPatterns 接受 JavaScript 正则表达式,每项一条。若要修改某条内置规则,请编辑 hooks/rules.ts 中 RULES 数组里对应规则的 pattern。

设置项类型默认值作用
modestring (block | warn)"block"Mode. block refuses a matching command; warn lets it run and shows a toast.
blockForcePushbooleantrueBlock force-push to main/master. Refuse git push --force / -f / +main to main or master.
blockHardResetbooleanfalseBlock git reset --hard. Also refuse git reset --hard (off by default: it is a common, recoverable-ish workflow).
extraPatternsstring[]Extra patterns. Additional JavaScript regular expressions; a Bash command matching any of them is treated as dangerous.
allowPatternsstring[]Allow patterns. JavaScript regular expressions; a Bash command matching any of them is never blocked, whatever else it matches.

在 Claude Code 中通过 /config 修改这些设置,插件会热重载。

权限与安全

拦截工具调用正是这个插件存在的意义:它会在每条 Bash 命令运行前看到它,并且可以拒绝执行。它从不改写命令,也从不自行运行任何命令。修改界面对应的是提示通知。除此之外,它本身没有任何文件、网络、模型或命令访问权限。

这是防止意外的保护措施,而不是沙箱。专门为规避这些模式而构造的命令仍然可能通过,所以请保持 Claude Code 的权限确认处于开启状态。可以用 /plugin disable cm-block-dangerous-commands 停用该插件,或者用 claude --safe-mode 启动一个关闭所有插件的会话。

拦截工具调用
能看到 Claude 发起的每一次工具调用(tool.call / tool.check),并可以阻止或修改它。
修改界面
在 Claude Code 界面中绘制内容:横条、面板、状态文字、弹出通知(ui.render / $.ui.*)。

兼容性与故障排除

已在 macOS 终端中使用 Claude Code 2.1.291 测试。如果你预期会被拦截的命令仍然执行了:

  • 确认 claude --version 为 2.1.287 或更高版本,并且该插件已在 /plugin 中启用。
  • 通过 shell 安装后,运行 /reload-plugins。
  • 在 /config 中确认 mode 是 block 而不是 warn。
  • 检查是否有某条 allowPatterns 匹配的范围超出了你的预期。
  • 这道防护只覆盖 Bash 工具。通过 Edit 和 Write 进行的文件编辑不会被检查。

如果某条安全命令被误拒,请添加一条范围较窄的放行规则,而不是把整个插件切换到 warn 模式。

常见问题

它能取代 Claude Code 的权限确认吗?
不能。它只是针对常见失误的模式防护。经过混淆的命令可能绕过正则表达式,所以请继续开启权限确认和拒绝规则。
命令被拦截时,Claude 会看到什么?
这次调用会被拒绝,并附上原因:说明命中了哪条规则、为什么危险,并建议请你亲自运行,或在 /config 中调整 allowPatterns 或 mode。Claude 通常会改用更安全的命令,或者直接询问你。
如何放行某一条特定命令?
在 /config 的 allowPatterns 中添加一个正则表达式。只要命中这里,就总是优先于内置规则和你的 extraPatterns。
git reset --hard 会被拦截吗?
默认不会,因为这是一种常见且往往是有意为之的操作。开启 blockHardReset 即可拦截它。
如果插件本身崩溃了怎么办?
tool.call 钩子采用失败即拒绝(fail closed)的策略。如果检查在命令运行前抛出异常,该命令会被拒绝,并提示检查失败。
提示框上方的 Git 分支 在 Claude Code 中运行

提示框上方的 Git 分支

在 Claude Code 输入框上方用一行横条显示当前 git 分支、已修改文件数和领先/落后状态。

  • 输入框上方
  • 执行命令
  • 拦截工具调用
  • 修改界面

已在 v2.1.291 实测

完成提示 在 Claude Code 中运行

完成提示

Claude 较长的一轮结束时弹出「Done in 2m 14s」提示并播放短促提示音,还可选发送桌面通知。

  • 弹出通知
  • 执行命令
  • 修改界面
  • 播放声音

已在 v2.1.291 实测

工具调用计数器 在 Claude Code 中运行

工具调用计数器

统计 Claude 每轮和每个会话的工具调用次数,在加载指示器旁显示计数,并新增 /tally 查看明细。

  • 加载动画
  • 对话记录
  • 状态栏
  • 拦截工具调用
  • 修改界面
  • 添加命令/工具

已在 v2.1.291 实测

更多 安全防护、Git 与 GitHub。