最關鍵的觀念校正:alias rm='trash' 擋不住 Claude 自己跑的 rm。Claude 的 Bash 工具用的是非互動 shell,不讀 ~/.zshrc、不展開 alias,所以那個別名只保護「你在終端機手打 rm」,不會約束 AI。把它當成「防 AI 誤刪的第一層」是錯的。
| 機制 | 實際擋的是 | 擋不了 |
|---|---|---|
| rm→trash 別名 | 你本人手打的 rm(防手誤) | Claude 自己的刪除(非互動 shell 不吃 alias) |
| Bash deny 黑名單 | 常見危險指令的直球寫法(防呆) | 換句話繞過:不同空格、find -delete、python -c、子 shell |
| 不開 bypass + managed deny + 容器 | 真正的隔離與底線 | —(這才是企業該倚靠的) |
黑名單給人「已經安全」的錯覺最危險。它是防呆,不是沙箱。真正的安全來自:預設不開 bypass、把絕對禁止放進使用者改不掉的 managed 層、需要硬隔離時用容器或沙箱跑。
permissions.defaultMode 決定 Claude 動作前要不要問你。企業共用機的重點:絕不要把 bypassPermissions 當預設。
| 模式 | 行為 | 企業建議 |
|---|---|---|
| default | 所有動作都要確認 | 新人 / 共用機的安全預設 |
| acceptEdits | 檔案編輯自動、指令仍要確認 | 熟手日常,效率與安全平衡 |
| plan | 只提計畫、不執行 | 盤點 / 評估高風險改動時 |
| bypassPermissions | 不再確認(除被 deny 的) | ⚠️ 僅限隔離容器,共用機禁用 |
還是值得裝——它保護「你本人手滑」。只是定位要正確:這是防你自己,不是防 AI。
# 給「人」用的防手誤:刪除進垃圾桶而非真刪
brew install trash
cat >> ~/.zshrc << 'EOF'
alias rm='trash' # 只影響你在終端機手打的 rm
alias rm!='/bin/rm' # 真的要硬刪時用 rm!
EOF
source ~/.zshrc把高風險指令加進 permissions.deny,降低誤觸機率。記得它不是密封沙箱,只是其中一層。
# 防呆層:把高風險指令加進 deny(會跳出阻擋)
# 注意:這是「防呆」不是「沙箱」,能降低誤觸但無法保證擋死
test -f ~/.claude/settings.json || echo '{}' > ~/.claude/settings.json
jq '
.permissions = (.permissions // {}) |
.permissions.deny = (((.permissions.deny // []) + [
"Bash(rm -rf:*)", "Bash(rm -fr:*)", "Bash(rm -r:*)",
"Bash(sudo:*)", "Bash(dd:*)", "Bash(mkfs:*)",
"Bash(diskutil erase:*)", "Bash(chmod -R 777:*)",
"Bash(git reset --hard:*)", "Bash(git push --force:*)",
"Bash(git clean -f:*)", "Bash(shutdown:*)", "Bash(reboot:*)"
]) | unique)
' ~/.claude/settings.json > /tmp/cc.json && mv /tmp/cc.json ~/.claude/settings.json黑名單與權限模式都是「請 AI 自律」。要程式化、無條件攔截,用 PreToolUse hook:在工具實際執行前跑你的腳本,腳本說 deny 就一定擋下——不管 Claude 怎麼想。官方也明說「要硬擋就用 hook,不要靠 CLAUDE.md 或權限提示」。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{ "type": "command", "command": "~/.claude/hooks/guard.sh" }
]
}
]
}
}#!/usr/bin/env bash
# ~/.claude/hooks/guard.sh — 真正的程式化攔截(不靠 AI 自律)
input="$(cat)"
cmd="$(echo "$input" | jq -r '.tool_input.command // ""')"
case "$cmd" in
*"git push"*main*|*"rm -rf"*)
jq -n '{hookSpecificOutput:{hookEventName:"PreToolUse",
permissionDecision:"deny",
permissionDecisionReason:"此操作被 hook 規則禁止"}}'
exit 0;;
esac
echo '{}' # 其餘放行exit 2,或回傳 permissionDecision: "deny",該次工具呼叫就被攔下。黑名單放在 user 層,使用者自己能改掉;企業要的是改不掉的底線——放進最高優先序的managed-settings.json,全機一致、無法關閉。這才是「出事可追、人人一致」的關鍵。
# 企業底線(使用者改不掉、關不了):把絕對禁止的放這層
sudo mkdir -p "/Library/Application Support/ClaudeCode"
sudo tee "/Library/Application Support/ClaudeCode/managed-settings.json" >/dev/null <<'JSON'
{
"permissions": {
"defaultMode": "default",
"deny": [
"Read(./.env)", "Read(./**/*.key)", "Read(./**/*.pem)",
"Bash(rm -rf:*)", "Bash(curl:* | sh)", "Bash(sudo:*)"
]
}
}
JSON這一段會由核心佈建的一鍵腳本一併佈署。安全分層的完整脈絡(四層優先序)也在那頁。
把工具變成戰力
Readie 幫台灣中小企業把 AI 從「裝好了」帶到「天天在用、人人一致」——不換系統、不買新軟體,從你們每天已經在用的工具與一台 Mac Mini 開始。
Readie AI 導入顧問 · 創辦人 Marco Liu · 19 年產業經驗