opencode 权限:allow、ask、deny
进阶最后更新: 2026年10月21日
opencode 的每个动作——读文件、改代码、跑 shell 命令——都会落到三种结果之一:直接执行、先问你、直接拦下。permission 配置决定走哪条。自 v1.1.1 起,旧的布尔型 tools 配置已废弃并入 permission(仍然兼容)。
三种动作
每条规则解析为 "allow"(不询问直接执行)、"ask"(在 TUI 里弹审批)或 "deny"(直接拦下)。
配置方式
用 "*" 设全局默认,再按工具覆盖:
{
"$schema": "https://opencode.ai/config.json",
"permission": {
"*": "ask",
"shell": "allow",
"edit": "deny"
}
}
一刀切写法:"permission": "allow"。
细粒度规则
多数权限接受一个对象,把输入模式映射到动作。最后命中的规则生效——兜底的 "*" 放前面,更具体的模式放后面:
{
"$schema": "https://opencode.ai/config.json",
"permission": {
"shell": {
"*": "ask",
"git *": "allow",
"git push *": "deny",
"grep *": "allow"
},
"edit": {
"*": "deny",
"packages/web/src/content/docs/*.mdx": "allow"
},
"webfetch": {
"*": "ask",
"https://en.wikipedia.org/*": "allow"
}
}
}
通配符很简单:* 匹配任意多个字符,? 匹配恰好一个字符,其余按字面匹配。模式开头的 ~ 或 $HOME 展开为家目录。模式匹配的是工具输入——read/edit 匹配文件路径,glob 匹配 glob 表达式,grep 匹配正则,webfetch 匹配 URL,shell 匹配解析后的命令。要匹配完整命令而不只是命令名:"grep *" 放行 grep pattern file.txt,光写 "grep" 会在带参数时被拦下。
权限键一览
| 键 | 匹配对象 |
|---|---|
read |
文件路径 |
edit |
文件路径——涵盖 edit、write、patch |
glob |
glob 表达式 |
grep |
正则表达式 |
list |
目录路径——ls 工具 |
shell |
解析后的命令(如 git status --porcelain) |
task |
子 agent 类型 |
skill |
skill 名称 |
lsp |
LSP 查询(不支持细粒度) |
question |
执行中向你提问 |
webfetch |
URL |
websearch |
网络搜索 |
external_directory |
触及工作目录外路径的工具调用 |
doom_loop |
相同输入的工具调用重复 3 次 |
默认偏宽松:多数键是 allow,两个安全兜底 external_directory 和 doom_loop 默认 ask。read 放行一切,唯独 .env 文件(*.env 与 *.env.* deny,*.env.example allow)。
external_directory 管的是触及启动目录之外路径的工具调用。显式放行信任的目录:
{
"permission": {
"external_directory": { "~/projects/personal/**": "allow" },
"edit": { "~/projects/personal/**": "deny" }
}
}
放行的目录继承工作区默认——read 默认 allow 所以直接可读,需要限制的地方(比如 edit)再叠 deny 规则。
ask 时会发生什么
审批弹窗给三个选项:
once——只批准这一次always——批准本次会话内匹配工具建议模式的后续请求(shell 审批一般建议安全前缀,如git status*)reject——拒绝
Auto 模式自动批准一切未被显式 deny 的请求:用 opencode --auto 或 opencode run --auto "…" 启动,或在命令面板里开关(Enable auto-approve permissions)。deny 规则照常生效。开启后 agent 名旁会显示灰色的 auto 标记。
按 agent 覆盖
agent 有自己的 permission 块,与全局配置合并且 agent 规则优先:
{
"agent": {
"plan": {
"permission": {
"edit": { "*": "deny", "~/.opencode/plan/*": "allow" },
"shell": "ask"
}
}
}
}
内置 plan agent 默认就禁止 ~/.opencode/plan/ 之外的编辑(直接拒绝不提示),并放行 question 工具——但 shell 命令跟随你的 permission 配置。注意顺序:plan 的默认值在顶层 permission 之前生效,所以全局 "edit": "allow" 会重新打开编辑权限——想保持 plan 只读,就显式钉住 agent.plan.permission。Markdown 定义的 agent(~/.config/opencode/agents/*.md)可在 frontmatter 里写同样的 permission: 块。
v2 差异
v2 把整块重做了:permissions(复数)是 { "action", "resource", "effect" } 有序规则数组——后者覆盖前者——取代 v1 的 permission 对象,配置文件为 opencode.jsonc。action 改名 bash→shell、task→subagent;doom_loop 和 lsp 不在 v2 action 之列。默认值也变了:v2 对 .env 读取是 ask 而非 deny。本篇对应 v1 的配置。