这类工具最值得先看的不是功能列表,而是能不能在普通环境里稳定跑起来。Destructive Command Guard(简称 dcg)是一个专门拦截危险 Git 和 Shell 命令的工具,主要面向使用 AI 编程助手(如 Claude Code、GitHub Copilot、Cursor 等)的开发者。它的核心价值是:当 AI 助手建议或尝试执行rm -rf /、git reset --hard这类高风险操作时,能自动拦截并给出明确提示,而不是真的执行。
我建议先从最小样例开始验证它的拦截能力,再考虑是否部署到生产环境。下面按实际落地顺序拆一遍。
1. 先确认它到底拦截哪些命令、怎么判断危险
dcg 不是简单匹配关键词,而是通过规则包(packs)来识别危险模式。默认包含的规则包有:
- core.git:拦截
git reset --hard、git push --force、git clean -fd等会丢失数据的操作 - core.shell:拦截
rm -rf /、chmod -R 777 /等系统级危险命令 - containers.docker:拦截
docker system prune -a、docker rm -f $(docker ps -aq)等清理操作 - database.postgresql:拦截
DROP DATABASE、TRUNCATE TABLE等数据删除操作
判断逻辑是四层管道:
- 解析输入:从 AI 助手传来的 JSON 中提取命令字符串
- 标准化命令:把绝对路径转为命令名(
/usr/bin/git→git) - 快速过滤:如果命令中不包含任何危险关键词(如 git、rm、drop 等),直接放行
- 模式匹配:先检查安全模式(匹配则放行),再检查危险模式(匹配则拦截)
这种设计保证了 99% 的普通命令能快速通过,只有真正可疑的命令会进入详细匹配。
1.1 关键配置项:控制严格程度
安装后可以通过环境变量或配置文件调整行为:
# 环境变量方式(优先级最高) export DCG_QUIET=1 # 只输出错误信息 export DCG_NO_COLOR=1 # 禁用彩色输出 export DCG_FAIL_CLOSED=1 # 解析失败时默认拦截(严格模式) export DCG_BYPASS=1 # 临时完全绕过 dcg # 或使用配置文件 ~/.config/dcg/config.toml [general] fail_closed = false # 默认宽松模式:解析失败时放行 [heredoc] fallback_on_parse_error = true # 遗传文档解析失败时放行 fallback_on_timeout = true # 超时时放行新手建议:刚开始用默认配置即可,等熟悉拦截逻辑后再考虑调严格程度。
1.2 安全模式与危险模式的优先级
匹配顺序很重要:
# 安全模式优先:如果命令匹配安全模式,直接放行 safe_patterns = [ "git status", "git log --oneline", "ls -la", "pwd" ] # 危险模式其次:只有不匹配安全模式且匹配危险模式的命令才会被拦截 destructive_patterns = [ "git reset --hard", "rm -rf", "chmod -R 777" ] # 都不匹配:默认放行这意味着你可以通过添加安全模式来放行特定场景的危险命令(需谨慎)。
2. 低配置环境能不能跑,关键看安装方式和资源占用
dcg 本身是 Rust 编写的静态二进制文件,资源占用很小:
- 内存:常驻内存约 2-4MB
- CPU:单次检查通常在 1ms 内完成
- 磁盘:二进制文件约 20MB,配置和历史数据另占 10-50MB
2.1 选择适合的安装方式
推荐方案:一键安装脚本(适合大多数环境)
# 最基本安装 curl -fsSL "https://raw.githubusercontent.com/Dicklesworthstone/destructive_command_guard/main/install.sh" | bash # 带交互提示的安装 curl -fsSL "https://raw.githubusercontent.com/Dicklesworthstone/destructive_command_guard/main/install.sh" | bash -s -- --interactive # 系统级安装(需要 sudo) curl -fsSL "https://raw.githubusercontent.com/Dicklesworthstone/destructive_command_guard/main/install.sh" | sudo bash -s -- --system安装脚本会自动:
- 检测操作系统和架构
- 下载对应的预编译二进制文件
- 验证 SHA256 校验和
- 配置支持的 AI 助手钩子
- 更新 PATH 环境变量
备选方案:手动下载二进制文件
如果网络环境特殊,可以直接从 GitHub Releases 下载对应版本:
- Linux x86_64:
dcg-x86_64-unknown-linux-musl.tar.gz - macOS Apple Silicon:
dcg-aarch64-apple-darwin.tar.gz - Windows x64:
dcg-x86_64-pc-windows-msvc.zip
下载后解压到 PATH 中的目录即可。
2.2 验证安装是否成功
安装后运行:
dcg --version # 正常输出示例:dcg 0.6.8 (x86_64-unknown-linux-musl) # 测试拦截功能 echo '{"tool_name":"Bash","tool_input":{"command":"git reset --hard"}}' | dcg # 应该看到拦截信息如果安装失败,检查:
- 网络连接(GitHub 访问)
- 磁盘空间(至少 100MB 空闲)
- 执行权限(二进制文件需要可执行权限)
2.3 资源占用监控和优化
虽然 dcg 本身很轻量,但在 AI 助手频繁调用时需要注意:
# 查看 dcg 进程资源占用 ps aux | grep dcg | grep -v grep # 如果发现频繁调用影响性能,可以调整超时设置 export DCG_HOOK_TIMEOUT_MS=50 # 将超时从默认 200ms 降到 50ms对于低配机器,建议保持默认超时设置,避免因超时导致的误放行。
3. 单任务跑通之后,再处理批量任务和钩子配置
先手动测试单条命令的拦截效果,确认符合预期后再配置 AI 助手钩子。
3.1 手动测试模式
dcg 提供多种测试方式:
基础测试:
# 人类可读输出 dcg test "rm -rf /tmp/build" # JSON 输出(适合脚本处理) dcg test --format json "git reset --hard HEAD~1"详细分析模式:
# 查看决策过程 dcg explain "git reset --hard HEAD" # 输出示例: # Command: git reset --hard HEAD # Normalized: git reset --hard HEAD # Decision: BLOCKED # Pack: core.git # Rule: reset-hard # Reason: git reset --hard destroys uncommitted changes临时放行机制: 当命令被拦截时,dcg 会输出一个 6 位数字码:
BLOCKED: git reset --hard HEAD Allow-once code: 123456使用该码临时放行:
dcg allow-once 123456 # 24小时内有效 dcg allow-once 123456 --single-use # 仅一次有效3.2 配置 AI 助手钩子
安装脚本会自动配置支持的 AI 助手,但了解手动配置有助于排查问题:
Claude Code(~/.claude/settings.json):
{ "hooks": { "PreToolUse": [ { "matcher": "Bash", "hooks": [ { "type": "command", "command": "dcg" } ] } ] } }GitHub Copilot CLI:
# 安装脚本会自动配置 # 手动检查:确保 ~/.copilot/hooks/dcg.json 存在Cursor IDE:
# 安装脚本会配置 ~/.cursor/hooks.json # 重启 Cursor 后生效重要提醒:配置钩子后,一定要重启 AI 助手应用才能生效。
3.3 验证钩子是否工作
测试钩子是否正常拦截:
在 AI 助手中输入危险命令:
请清理构建目录:rm -rf ./build观察行为:
- 正常情况:AI 助手显示 dcg 的拦截提示,不执行命令
- 如果命令被执行:说明钩子配置有问题
排查步骤:
# 检查 dcg 是否在 PATH 中 which dcg # 检查钩子配置文件语法 jq . ~/.claude/settings.json # 需要 jq 命令 # 查看 AI 助手日志(如果有)
4. 输出质量不稳定时,优先排查输入格式和参数边界
dcg 的拦截准确性依赖正确的输入格式和参数解析。遇到误拦截或漏拦截时,按这个顺序排查。
4.1 输入格式问题
AI 助手传给 dcg 的 JSON 格式必须正确:
标准格式(Claude Code):
{ "tool_name": "Bash", "tool_input": { "command": "git reset --hard HEAD" } }常见格式问题:
- 缺少必要的字段(如
tool_name) - 命令格式错误(如多级嵌套)
- 编码问题(非 UTF-8)
检测方法:
# 使用 explain 模式查看 dcg 实际收到的命令 dcg explain "问题命令" # 如果 explain 也报错,可能是格式问题4.2 遗传文档(Heredoc)扫描
dcg 能扫描遗传文档中的危险模式,但这可能引起误判:
# 示例:遗传文档中的危险命令会被扫描 cat <<EOF > script.sh #!/bin/bash rm -rf /tmp/cache # 这行会被 dcg 检测 EOF控制遗传文档扫描:
# 禁用遗传文档扫描 export DCG_HEREDOC_ENABLED=false # 或限制扫描语言 export DCG_HEREDOC_LANGUAGES=python,bash # 调整超时(默认 50ms) export DCG_HEREDOC_TIMEOUT_MS=204.3 边界情况处理
Git 变基恢复模式: 当处于 rebase 状态时,dcg 会放宽对git checkout -- .的拦截:
# 检测到 .git/rebase-merge/ 或 .git/rebase-apply/ 目录时 git checkout -- . # 正常被拦截的命令,在 rebase 状态下会放行 # 手动启用恢复模式(120秒内有效) dcg rebase-recover路径标准化问题:
# 这些命令会被正确识别为 git 命令 /usr/bin/git reset --hard /usr/local/bin/git reset --hard git reset --hard # 但别名或函数可能绕过检测 alias git='my-git-wrapper' # dcg 可能无法识别4.4 误拦截处理流程
当安全命令被误拦截时:
先确认是不是真的误判:
dcg explain "被拦截的命令" # 查看详细原因临时解决方案:
# 使用 allow-once 码临时放行 dcg allow-once 123456长期解决方案:
# 添加到项目级白名单(需要代码审查) dcg allowlist add core.git:reset-hard --reason "CI 环境需要" --project # 或个人白名单 dcg allowlist add core.git:reset-hard --reason "个人开发习惯"如果确实是 bug:
- 在 GitHub 仓库提交 issue
- 提供
dcg explain的完整输出 - 说明期望的行为
5. 批量任务和仓库扫描的实战配置
除了实时拦截,dcg 还提供仓库扫描功能,用于检测代码中的危险命令。
5.1 预提交钩子配置
一键安装:
dcg scan install-pre-commit这会创建.git/hooks/pre-commit,在每次提交前自动扫描暂存文件。
手动配置(如果使用其他钩子管理器):
#!/bin/bash # .git/hooks/pre-commit # 只扫描暂存的文件 dcg scan --staged --fail-on error # 可以根据项目需要调整参数 dcg scan --staged \ --fail-on warning \ --redact quoted \ --format pretty5.2 扫描配置优化
创建项目级配置文件.dcg/hooks.toml:
[scan] # 检查级别:none(不失败)、warning(警告级失败)、error(错误级失败) fail_on = "warning" # 输出格式 format = "pretty" # pretty, json, markdown # 敏感信息脱敏 redact = "quoted" # none, quoted, aggressive # 最大文件大小(字节) max_file_size = 1000000 [scan.paths] # 只扫描这些路径 include = [ "scripts/**", ".github/workflows/**", "Dockerfile*", "Makefile" ] # 排除这些路径 exclude = [ "node_modules/**", "dist/**", "*.md" ]5.3 CI/CD 集成示例
GitHub Actions:
name: Security Scan on: [pull_request, push] jobs: dcg-scan: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 # 需要完整历史记录进行差异扫描 - name: Install dcg run: | curl -fsSL "https://raw.githubusercontent.com/Dicklesworthstone/destructive_command_guard/main/install.sh" | bash echo "$HOME/.local/bin" >> $GITHUB_PATH - name: Scan changed files run: | dcg scan \ --git-diff origin/${{ github.base_ref }}..HEAD \ --format markdown \ --fail-on error \ --redact quotedGitLab CI:
scan: stage: test script: - curl -fsSL "https://raw.githubusercontent.com/Dicklesworthstone/destructive_command_guard/main/install.sh" | bash - ~/.local/bin/dcg scan --git-diff origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME..HEAD --fail-on error rules: - if: $CI_MERGE_REQUEST_ID5.4 扫描结果处理
扫描输出示例:
scripts/deploy.sh:15:2: [ERROR] core.shell:rm-recursive-force Command: rm -rf ./dist Reason: Recursive force deletion can cause data loss Suggestion: Consider using 'rm -r' without '-f' to confirm deletions处理建议:
高危发现(ERROR):必须修复
- 替换为更安全的命令
- 或添加项目级白名单(需团队评审)
警告发现(WARNING):建议修复
- 评估实际风险
- 根据团队规范决定是否放行
误报处理:
# 添加到项目白名单 dcg allowlist add core.shell:rm-recursive-force --reason "构建清理需要" --project
6. 生产环境部署的注意事项
在团队中推广使用 dcg 时,需要制定清晰的流程和规范。
6.1 分阶段推广计划
阶段一:监控模式(1-2周)
# 配置为只警告不拦截 export DCG_POLICY_DEFAULT_MODE=warn # 或使用配置文件 [general] policy_default_mode = "warn"这个阶段的目标:
- 收集常见的误报模式
- 让团队成员熟悉 dcg 的行为
- 建立白名单规范
阶段二:拦截模式(2-4周)
# 切换到拦截模式 export DCG_POLICY_DEFAULT_MODE=deny # 但配置宽松的超时和错误处理 [heredoc] fallback_on_timeout = true fallback_on_parse_error = true阶段三:严格模式(1个月后)
# 启用严格模式 export DCG_FAIL_CLOSED=1 [general] fail_closed = true6.2 团队白名单管理
个人级白名单(~/.config/dcg/allowlist.toml):
# 个人开发习惯相关的放行 [[rules]] id = "core.git:reset-hard" reason = "个人开发流程需要"项目级白名单(.dcg/allowlist.toml):
# 需要代码审查的放行 [[rules]] id = "core.shell:rm-recursive-force" reason = "CI 构建清理" commands = ["rm -rf ./dist"] # 限定具体命令 [[rules]] id = "containers.docker:system-prune" reason = "开发环境清理"白名单评审流程:
- 提出申请(说明为什么需要放行)
- 团队评审(评估风险和替代方案)
- 添加到项目配置(需要 PR 和批准)
- 监控使用情况(定期回顾)
6.3 监控和审计
启用日志记录:
# 详细日志(用于调试) export DCG_LOG=debug # 或使用配置文件 [general] log_level = "info" # error, warn, info, debug, trace定期审计:
# 查看白名单使用情况 dcg allowlist list --verbose # 扫描历史拦截记录 dcg history --last 30d # 检查配置变更 git log --oneline .dcg/6.4 故障排除清单
当 dcg 不工作时,按这个顺序检查:
基础功能检查:
dcg --version # 确认安装 dcg test "rm -rf /tmp/test" # 确认核心功能钩子配置检查:
# 检查配置文件语法 cat ~/.claude/settings.json | jq . # 需要 jq # 检查钩子文件是否存在 ls -la ~/.copilot/hooks/权限和环境检查:
which dcg # 确认在 PATH 中 ls -la $(which dcg) # 确认可执行权限 echo $PATH # 检查 PATH 设置AI 助手集成检查:
- 重启 AI 助手应用
- 检查助手是否支持钩子功能
- 查看助手日志(如果有)
网络和资源检查:
# 检查是否因超时被跳过 export DCG_HOOK_TIMEOUT_MS=500 # 临时增加超时时间 # 检查系统资源 ulimit -a # 查看系统限制
我个人更建议先把单任务跑稳,再考虑批量和团队部署。这个工具真正落地时,最该盯住的不是功能列表,而是输入格式、资源占用和失败重试机制。如果只是个人学习,默认配置通常够用;如果要团队使用,就要把白名单流程、监控指标和升级计划提前准备好。