跳转到内容

权限 Permissions

控制哪些操作需要批准才能运行。

OpenCode 使用 permission 配置来决定给定的操作是应自动运行、提示你批准还是被阻止。

从 v1.1.1 开始,旧的 tools 布尔配置已弃用并合并到 permission 中。为了向后兼容,仍然支持旧的 tools 配置。


动作 Actions

每个权限规则解析为以下之一:

  • "allow" — 无需批准即可运行
  • "ask" — 提示批准
  • "deny" — 阻止操作

配置 Configuration

你可以全局设置权限(使用 *),并覆盖特定工具。

opencode.json
{
"$schema": "https://opencode.ai/config.json",
"permission": {
"*": "ask",
"bash": "allow",
"edit": "deny"
}
}

你也可以一次性设置所有权限:

opencode.json
{
"$schema": "https://opencode.ai/config.json",
"permission": "allow"
}

细粒度规则(对象语法) Granular Rules (Object Syntax)

对于大多数权限,你可以使用对象根据工具输入应用不同的操作。

opencode.json
{
"$schema": "https://opencode.ai/config.json",
"permission": {
"bash": {
"*": "ask",
"git *": "allow",
"npm *": "allow",
"rm *": "deny",
"grep *": "allow"
},
"edit": {
"*": "deny",
"packages/web/src/content/docs/*.mdx": "allow"
}
}
}

规则通过模式匹配进行评估,最后匹配的规则获胜。常见的模式是将包罗万象的 "*" 规则放在最前面,然后在其后放置更具体的规则。

通配符 Wildcards

权限模式使用简单的通配符匹配:

  • * 匹配零个或多个任意字符
  • ? 匹配确切的一个字符
  • 所有其他字符按字面匹配

主目录扩展 Home Directory Expansion

你可以在模式的开头使用 ~ 或 $HOME 来引用你的主目录。这对 external_directory 规则特别有用。

  • ~/projects/* -> /Users/username/projects/*
  • $HOME/projects/* -> /Users/username/projects/*
  • ~ -> /Users/username

外部目录 External Directories

使用 external_directory 允许触及 OpenCode 启动的工作目录之外路径的工具调用。这适用于任何接受路径作为输入的工具(例如 read、edit、list、glob、grep 和许多 bash 命令)。

主目录扩展(如 ~/...)仅影响模式的编写方式。它不会使外部路径成为当前工作区的一部分,因此工作目录之外的路径仍必须通过 external_directory 允许。

例如,这允许访问 ~/projects/personal/ 下的所有内容:

opencode.json
{
"$schema": "https://opencode.ai/config.json",
"permission": {
"external_directory": {
"~/projects/personal/**": "allow"
}
}
}

此处允许的任何目录都继承与当前工作区相同的默认值。由于 read 默认为 allow,除非被覆盖,否则也允许读取 external_directory 下的条目。当工具在这些路径中应受到限制时(例如阻止编辑但保持读取),添加显式规则:

opencode.json
{
"$schema": "https://opencode.ai/config.json",
"permission": {
"external_directory": {
"~/projects/personal/**": "allow"
},
"edit": {
"~/projects/personal/**": "deny"
}
}
}

将列表集中在受信任的路径上,并根据需要为其他工具(例如 bash)添加额外的允许或拒绝规则。


可用权限 Available Permissions

OpenCode 权限按工具名称键入,外加几个安全防护:

  • read — 读取文件(匹配文件路径)
  • edit — 所有文件修改(覆盖 edit、write、patch、multiedit)
  • glob — 文件 globbing(匹配 glob 模式)
  • grep — 内容搜索(匹配正则表达式模式)
  • list — 列出目录中的文件(匹配目录路径)
  • bash — 运行 shell 命令(匹配解析后的命令,如 git status --porcelain)
  • task — 启动子智能体(匹配子智能体类型)
  • skill — 加载技能(匹配技能名称)
  • lsp — 运行 LSP 查询(目前是非细粒度的)
  • todoread, todowrite — 读取/更新待办事项列表
  • webfetch — 获取 URL(匹配 URL)
  • websearch, codesearch — web/code 搜索(匹配查询)
  • external_directory — 当工具触及项目工作目录之外的路径时触发
  • doom_loop — 当同一工具调用使用相同的输入重复 3 次时触发

默认值 Defaults

如果你没有任何指定,OpenCode 从宽松的默认值开始:

  • 大多数权限默认为 "allow"。
  • doom_loop 和 external_directory 默认为 "ask"。
  • read 是 "allow",但默认拒绝 .env 文件:
opencode.json
{
"permission": {
"read": {
"*": "allow",
"*.env": "deny",
"*.env.*": "deny",
"*.env.example": "allow"
}
}
}

“Ask” 做什么 What “Ask” Does

当 OpenCode 提示批准时,UI 提供三种结果:

  • once — 仅批准此请求
  • always — 批准匹配建议模式的未来请求(对于当前 OpenCode 会话的剩余时间)
  • reject — 拒绝请求

always 将批准的模式集由工具提供(例如,bash 批准通常白名单化像 git status* 这样的安全命令前缀)。


智能体 Agents

你可以为每个智能体覆盖权限。智能体权限与全局配置合并,智能体规则优先。了解更多 关于智能体权限的信息。

opencode.json
{
"$schema": "https://opencode.ai/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 中配置智能体权限:

~/.config/opencode/agents/review.md
---
description: Code review without edits
mode: subagent
permission:
edit: deny
bash: ask
webfetch: deny
---
Only analyze code and suggest changes.