一句官方口径
Claude Code 文档写得很直:
Instructions in your prompt or
CLAUDE.md shape what Claude tries to do, but they don't change what Claude Code allows.翻译成习惯:CLAUDE.md 是说明书,permissions 才是门锁。
@CryonixCrypto 用实验说明同一点:把「never read .env」只写在 CLAUDE.md 里,模型仍可能去试;真正在命令进 shell 前拦住的,是 .claude/settings.json 里的 deny / ask / allow。
规则怎么排
匹配顺序固定:deny → ask → allow,先命中先生效。宽泛的 deny 不会被更窄的 allow「挖洞」。/permissions 可以列出每条规则来自哪个文件。
常见起步配置(示例,按项目改):
- deny:
Read(./.env)、Read(./.env.*)、Read(./secrets/**),以及你绝不愿自动执行的破坏性命令模式; - ask:
git push、部署、删库一类; - allow: 你每天都批准的安全命令,减少疲劳点击。
团队共享写进项目 .claude/settings.json;个人「不要再问」往往落在 settings.local.json。
两个常见误解
.claudeignore不是权限墙。 @readmodelmag 提醒:官方口径下它挡不住读取;该拦的路径请写成Read(...)deny。- 规则匹配的是命令文本,不是魔法沙箱。 文档也写了:
Bash(rm *)拦不住刻意绕开的写法;要对任意子进程做系统级限制,需要开启 sandbox,并理解它覆盖的范围(主要是 shell,不是所有 MCP)。
写完 CLAUDE.md 当然有用——约定风格、目录、禁止事项。但若你关心的是「绝对不能读密钥、绝对不能乱删」,请打开 /permissions,确认门锁真的挂上了。
如果你想把 Claude Code 放在一台常开、整机独享的新加坡 Mac mini 上长期运行,可以了解 Zumac.Ai,咨询 Telegram @singatao。
