权限
控制哪些操作需要批准才能运行。
OpenCode 使用 permission 配置来决定给定操作是应自动运行、提示您还是被阻止。
自 v1.1.1 起,旧版布尔配置 tools 已弃用,并已合并到 permission 中。旧的 tools 配置仍受支持以实现向后兼容。
操作
每个权限规则解析为以下之一:
"allow"— 无需批准即可运行"ask"— 提示批准"deny"— 阻止操作
配置
您可以全局设置权限(使用 *),并覆盖特定工具。
{ "$schema": "https://opencode.ac.cn/config.json", "permission": { "*": "ask", "bash": "allow", "edit": "deny" }}您也可以一次性设置所有权限
{ "$schema": "https://opencode.ac.cn/config.json", "permission": "allow"}精细规则(对象语法)
对于大多数权限,您可以使用对象根据工具输入应用不同的操作。
{ "$schema": "https://opencode.ac.cn/config.json", "permission": { "bash": { "*": "ask", "git *": "allow", "npm *": "allow", "rm *": "deny", "grep *": "allow" }, "edit": { "*": "deny", "packages/web/src/content/docs/*.mdx": "allow" } }}规则通过模式匹配进行评估,以最后匹配的规则为准。常见模式是先放置包罗万象的 "*" 规则,然后是更具体的规则。
通配符
权限模式使用简单的通配符匹配
*匹配零个或多个任意字符?精确匹配一个字符- 所有其他字符按字面匹配
主目录展开
您可以在模式的开头使用 ~ 或 $HOME 来引用您的主目录。这对于 external_directory 规则特别有用。
~/projects/*->/Users/username/projects/*$HOME/projects/*->/Users/username/projects/*~->/Users/username
外部目录
使用 external_directory 允许工具调用访问 OpenCode 启动工作目录之外的路径。这适用于任何以路径作为输入的工具(例如 read、edit、list、glob、grep 以及许多 bash 命令)。
主目录展开(如 ~/...)仅影响模式的编写方式。它不会使外部路径成为当前工作空间的一部分,因此工作目录之外的路径仍必须通过 external_directory 允许。
例如,这允许访问 ~/projects/personal/ 下的所有内容。
{ "$schema": "https://opencode.ac.cn/config.json", "permission": { "external_directory": { "~/projects/personal/**": "allow" } }}此处允许的任何目录都将继承与当前工作空间相同的默认设置。由于 read 默认设置为 allow,因此除非被覆盖,否则 external_directory 下的条目也允许读取。当工具应在这些路径中受限时,请添加明确规则,例如阻止编辑但允许读取。
{ "$schema": "https://opencode.ac.cn/config.json", "permission": { "external_directory": { "~/projects/personal/**": "allow" }, "edit": { "~/projects/personal/**": "deny" } }}将列表重点放在受信任的路径上,并根据需要为其他工具(例如 bash)添加额外的允许或拒绝规则。
可用权限
OpenCode 权限以工具名称为键,并带有几个安全防护措施。
read— 读取文件(匹配文件路径)edit— 所有文件修改(包括edit、write、patch、multiedit)glob— 文件 globbing(匹配 glob 模式)grep— 内容搜索(匹配 regex 模式)list— 列出目录中的文件(匹配目录路径)bash— 运行 shell 命令(匹配解析后的命令,如git status --porcelain)task— 启动子代理(匹配子代理类型)skill— 加载技能(匹配技能名称)lsp— 运行 LSP 查询(目前非精细)question— 在执行期间向用户提问webfetch— 获取 URL(匹配 URL)websearch,codesearch— 网页/代码搜索(匹配查询)external_directory— 当工具访问项目工作目录之外的路径时触发doom_loop— 当同一个工具调用以相同输入重复 3 次时触发
默认设置
如果您未指定任何内容,OpenCode 将从宽松的默认设置开始。
- 大多数权限默认为
"allow"。 doom_loop和external_directory默认为"ask"。read默认为"allow",但.env文件默认被拒绝。
{ "permission": { "read": { "*": "allow", "*.env": "deny", "*.env.*": "deny", "*.env.example": "allow" } }}“询问”的作用
当 OpenCode 提示批准时,UI 提供三种结果:
once— 仅批准此请求always— 批准匹配建议模式的未来请求(在当前 OpenCode 会话的剩余时间内)reject— 拒绝请求
always 将批准的模式集由工具提供(例如,bash 批准通常会将安全命令前缀(如 git status*)列入白名单)。
代理
您可以按代理覆盖权限。代理权限与全局配置合并,代理规则优先。了解更多关于代理权限的信息。
{ "$schema": "https://opencode.ac.cn/config.json", "permission": { "bash": { "*": "ask", "git *": "allow", "git commit *": "deny", "git push *": "deny", "grep *": "allow" } }, "agent": { "build": { "permission": { "bash": { "*": "ask", "git *": "allow", "git commit *": "ask", "git push *": "deny", "grep *": "allow" } } } }}您也可以在 Markdown 中配置代理权限
---description: Code review without editsmode: subagentpermission: edit: deny bash: ask webfetch: deny---
Only analyze code and suggest changes.