Destructive Command Guard 怎麼保護 Codex:攔截危險 Git 和 Shell 命令

介紹 dcg 如何透過 Agent Hooks 攔截危險 Git 和 Shell 命令、安裝驗證、預提交掃描及其安全邊界。

AI 程式設計 Agent 可以執行 Shell 後,最大的風險之一不是程式碼寫錯,而是在錯誤目錄執行刪除、覆蓋或 Git 清理命令。Destructive Command Guard,簡稱 dcg,會作為工具呼叫前置 Hook 檢查命令,在執行前攔截高風險操作。

專案地址:Dicklesworthstone/destructive_command_guard

快速答案

dcg 支援 Codex CLI、Claude Code、Gemini CLI、Copilot CLI、Cursor 等工具。它適合作為額外防線,但不是完整沙箱:Agent 仍可能把危險操作寫進指令碼,部分執行路徑也可能繞過 Hook。

Linux、macOS 和 WSL 的快速安裝:

1
curl -fsSL "https://raw.githubusercontent.com/Dicklesworthstone/destructive_command_guard/main/install.sh?$(date +%s)" | bash -s -- --easy-mode

遠端安裝指令碼應先審查。安裝器會下載對應平臺二進位制、校驗雜湊,併合並支援的 Agent Hook 配置,而不是直接覆蓋合法的現有 JSON。

Codex 中怎樣工作

對支援 Hooks 的 Codex CLI,安裝器會向 ~/.codex/hooks.json 合併 PreToolUse Hook。安裝完成後開啟一次 Codex 的 /hooks 介面確認信任。

當 Agent 準備執行命令時,dcg 會:

  1. 解析工具呼叫的 JSON;
  2. 提取並規範化 Shell 命令;
  3. 快速排除明顯安全的命令;
  4. 用規則識別刪除、覆蓋、強制重置等風險;
  5. 返回允許、拒絕或需要人工確認。

給倉庫增加預提交掃描

除了實時 Hook,還可以掃描將要提交的指令碼和工作流:

1
2
3
dcg scan install-pre-commit
dcg scan --staged
dcg scan --paths scripts/ .github/workflows/

團隊匯入時建議先採用“高嚴重度才失敗”的保守策略,觀察誤報後再擴大到 Makefile、Dockerfile 和更多 Shell 指令碼。

安裝後如何驗證

不要用真實刪除命令測試。可以讓 Agent 解釋一條明顯危險的模擬命令,並觀察 Hook 是否在執行前給出阻止資訊。隨後檢查:

  • dcg 是否位於 PATH
  • Agent 的 Hook 配置是否為有效 JSON;
  • /hooks 是否顯示並信任該 Hook;
  • 原有 Hook 是否仍然存在;
  • 普通只讀命令是否沒有明顯延遲。

安裝方式與平臺差異

Linux、macOS 和 WSL 可以使用 Shell 安裝器。原生 Windows 應使用倉庫提供的 install.ps1,不要在 PowerShell 中硬套 Bash 命令。

安裝前建議:

  1. 開啟指令碼檢查下載地址;
  2. 備份 Agent 的 Hook 配置;
  3. 記錄現有 PATH
  4. 確認安裝版本和校驗機制;
  5. 在測試賬戶或測試環境先執行;
  6. 安裝後檢視配置差異。

Easy Mode 會嘗試自動檢測並配置支援的 Agent。團隊環境更適合先使用 --no-configure 只安裝二進位制,再人工稽核各工具的 Hook 合併。

Codex Hook 的完整檢查

新版 Codex CLI 使用 ~/.codex/hooks.json 中的 PreToolUse Hook。配置完成後:

  • 確認 JSON 能正常解析;
  • 檢查原有 Hooks 沒有被刪除;
  • 在 Codex 中開啟 /hooks
  • 明確信任 dcg Hook;
  • 用無破壞性的模擬請求測試阻止流程;
  • 檢視普通命令是否仍可透過。

如果 /hooks 沒有顯示,不要假設保護已經生效。檢查 Codex 版本、功能支援和實際配置路徑。

哪些命令容易被攔截

dcg 關注可能造成不可恢復損失的 Git 和 Shell 操作,例如遞迴刪除、強制清理、覆蓋歷史和針對寬泛目錄的危險命令。實際規則會更新,應以當前版本為準。

一個命令是否危險,不只看命令名,還要看引數和目標:

1
2
3
4
rm file.tmp                 范围明确,可能允许
rm -rf /broad/path          范围宽且不可恢复,应阻止
git status                  只读
git reset --hard            会丢弃修改,应阻止或确认

不要為了繞過誤報把命令拆成多個更隱蔽步驟。應修正規則、使用明確目標或交給人工執行。

Scan 模式怎樣用於程式碼庫

實時 Hook 保護 Agent 當前準備執行的命令,dcg scan 則檢查倉庫中可能執行的 Shell 片段,包括指令碼、CI 工作流、Dockerfile 和 Makefile。

首次匯入建議:

1
dcg scan --staged --fail-on error

只讓高置信度嚴重問題阻止提交。觀察一段時間後,再把範圍擴大到:

1
dcg scan --paths scripts/ .github/workflows/

不要第一天就把所有 Warning 設為 CI 失敗,否則誤報會促使團隊直接關閉工具。

預提交 Hook 與 CI 的職責

本地預提交

反饋快,適合在提交前發現新增危險命令,但使用者可用 --no-verify 繞過,也可能沒有安裝 Hook。

CI 掃描

由倉庫統一執行,更適合形成強制規則。CI 中應固定 dcg 版本、驗證下載,並只掃描本次差異或明確路徑,避免結果隨上游變化。

Agent PreToolUse

在命令執行前阻止,保護的是當前工作區。它無法替代 CI 對倉庫內容的持續檢查。

三者解決的時間點不同,可以同時使用。

Allowlist 應怎樣管理

某些專案確實需要清理構建目錄或重置臨時環境。不要關閉整個 dcg,應為範圍明確、可驗證的命令建立最小例外:

  • 只允許專案內特定臨時目錄;
  • 不使用環境變數拼接寬泛根路徑;
  • 先解析並輸出絕對路徑;
  • 對生產目錄不設永久例外;
  • 例外進入版本控制和程式碼評審;
  • 定期刪除不再需要的規則。

安全例外的目標是縮小誤報,不是讓 Agent 獲得通用繞過通道。

怎樣測試而不破壞資料

不要在真實倉庫執行 git reset --hard 或遞迴刪除。可使用臨時測試倉庫和虛擬命令引數,觀察 dcg 的解析輸出。測試至少包括:

  1. 普通只讀命令被允許;
  2. 明顯危險命令被阻止;
  3. 目標範圍明確的清理命令按預期處理;
  4. 非法 Hook JSON 不會被靜默放行;
  5. 超時或無法判斷時進入人工確認;
  6. 原有 Hook 仍正常工作。

為什麼 Hook 不是完整沙箱

Hook 只能檢查它看到的工具呼叫。以下路徑仍可能繞過:

  • Agent 寫入指令碼後由其他程序執行;
  • IDE 或外掛使用未接入的終端介面;
  • 程式透過 API 刪除雲端資源;
  • 容器內命令影響掛載的宿主機目錄;
  • 憑據洩露後在另一臺機器操作;
  • 使用者主動使用 --no-verify

因此作業系統許可權、容器掛載、雲 IAM、備份和審批仍然必須存在。

更新與回滾

可使用:

1
dcg update

團隊不應在所有開發機上無計劃自動更新規則。先在測試倉庫驗證新版本的誤報和相容性,再分批升級。回滾需要保留舊版本號和配置備份。

故障排查矩陣

現象 可能原因 處理
dcg 找不到 PATH 未更新 新開終端並檢查安裝目錄
Codex 不呼叫 Hook 版本或 hooks.json 路徑錯誤 檢查 /hooks 與配置
原有 Hook 消失 合併異常 恢復備份,手工合併
普通命令被攔截 規則誤報 縮小命令範圍並報告案例
危險指令碼未攔截 實際執行路徑不可見 增加 Scan、許可權和沙箱
CI 結果不穩定 使用浮動版本 固定 dcg 版本和規則

它不能解決什麼

Hook 不是作業系統許可權邊界。官方也提示,Agent 可以先寫入指令碼再執行,Codex 的部分統一執行路徑可能尚未全部攔截。因此仍需配合:

  • 非管理員賬戶;
  • 限定工作目錄;
  • Git 分支或工作樹;
  • 重要資料備份;
  • 刪除和推送操作的人工審批;
  • 容器或虛擬機器隔離。

常見問題

安裝器會覆蓋我的 Hooks 嗎?

官方實現會嘗試合併;若現有 JSON 無效或結構異常,會保留原檔案並報告錯誤。安裝前仍應備份配置。

為什麼危險命令沒有被攔截?

檢查命令是否走了受支援的 Hook 路徑。若 Agent 把操作封裝進指令碼、應用內部工具或未覆蓋的執行介面,dcg 可能無法看到最終命令。

dcg 會明顯拖慢每次命令嗎?

專案設計為快速 Hook,並設定絕對處理時間上限。實際延遲仍應在自己的終端和規則集上測量;若明顯變慢,檢查日誌和其他 Hook。

可以只在 CI 安裝,不裝到開發機嗎?

可以掃描倉庫內容,但無法在本地 Agent 真正執行命令前攔截。高許可權 Agent 環境仍建議配置 PreToolUse Hook。

緊急情況下如何處理誤攔截?

先確認命令目標和可恢復性,再由人手動執行或建立最小臨時例外。不要讓 Agent 自動尋找繞過方法。

總結

dcg 能降低 Agent 誤執行危險 Git 和 Shell 命令的機率,尤其適合已經允許 Codex 或 Claude Code 執行終端的環境。但它應被視為安全帶,不是保險箱;真正可靠的方案仍是最小許可權、目錄隔離、備份和人工審批共同生效。