AI 程式設計教程中文版
官方教程中文版CLI 與自動化

CLI 許可權

基於 Cursor 官方 Permissions 文件解釋 Shell、Read、Write、WebFetch、MCP permission tokens、allow/deny 優先順序和配置位置。

Cursor CLI permissions 用 permission tokens 控制 Agent 能做什麼。它們可以寫在全域性 ~/.cursor/cli-config.json,也可以寫在專案級 <project>/.cursor/cli.json

閱讀目標:讀完本章,你應該能寫出一份最小許可權配置,區分 shell、read、write、web fetch 和 MCP 工具許可權,並理解 deny 為什麼優先。

1. 配置位置

ScopePath用途
Global~/.cursor/cli-config.json當前使用者預設 CLI 配置
Project<project>/.cursor/cli.json當前專案許可權配置

專案級配置適合團隊儲存庫,因為它能把“這個專案裡 Agent 可以做什麼”寫進儲存庫邊界。

2. 五類 permission tokens

型別格式控制什麼
ShellShell(commandBase)shell command base
ReadRead(pathOrGlob)檔案和目錄讀取
WriteWrite(pathOrGlob)檔案和目錄寫入
WebFetchWebFetch(domainOrPattern)web fetch 可訪問域名
MCPMcp(server:tool)MCP server tool 呼叫

核心規則:allow 只是允許,deny 是硬阻止。deny rules take precedence over allow rules。

3. Shell 許可權

Shell token 看命令列第一個 token,也支援 command:args 做更細控制。

示例含義
Shell(ls)允許 ls
Shell(git)允許任意 git subcommand
Shell(npm)允許 npm
Shell(curl:*)允許 curl 及任意引數
Shell(rm)常見 deny,用於阻止刪除

生產預設不要輕易 allow gitghrmsudocurl 和包管理器全量命令。它們要麼能改歷史,要麼能訪問外部網路,要麼能破壞檔案系統。

4. Read 和 Write 許可權

Read 控制可讀範圍:

示例含義
Read(src/**/*.ts)允許讀 src 下 TypeScript
Read(**/*.md)允許讀任意 Markdown
Read(.env*)常見 deny,阻止讀環境檔案
Read(/etc/passwd)常見 deny,阻止讀系統檔案

Write 控制可寫範圍。官方提醒:print mode 中寫檔案需要 --force

示例含義
Write(src/**)允許寫 src
Write(package.json)允許改 package.json
Write(**/*.key)常見 deny,阻止寫私鑰檔案
Write(**/.env*)常見 deny,阻止寫環境檔案

商業專案裡,Write 的範圍應該比 Read 更窄。能讀全倉不等於能寫全倉。

5. WebFetch 和 MCP

WebFetch 控制網頁讀取域名:

示例含義
WebFetch(docs.github.com)允許 GitHub docs
WebFetch(*.example.com)允許 example.com 子域名
WebFetch(*)允許任意域名,高風險

MCP token 使用 server:tool

示例含義
Mcp(datadog:*)允許 Datadog MCP 所有工具
Mcp(*:search)允許任意 server 的 search 工具
Mcp(*:*)允許所有 MCP 工具,高風險

WebFetch(*)Mcp(*:*) 都不適合預設生產配置。它們方便,但審計邊界太寬。

6. 最小配置示例

{
  "permissions": {
    "allow": [
      "Shell(ls)",
      "Shell(grep)",
      "Read(src/**/*.ts)",
      "Read(**/*.md)",
      "Write(docs/**/*)",
      "WebFetch(docs.github.com)"
    ],
    "deny": [
      "Shell(rm)",
      "Shell(git)",
      "Shell(gh)",
      "Read(.env*)",
      "Write(**/*.key)",
      "WebFetch(*)"
    ]
  }
}

這不是通用答案,而是思路:先只開放任務需要的讀、寫、命令和域名;再用 deny 鎖住高風險區域。

7. Pattern matching

官方規則:

  • glob 支援 ***?
  • relative paths 以當前 workspace 為作用域。
  • absolute paths 可以指向專案外檔案。
  • deny 優先於 allow。
  • command:args 可對命令和引數做 glob 匹配。

這意味著 <project>/.cursor/cli.json 裡的相對路徑要結合 workspace 理解。CI 中最好顯式設定 workspace,避免路徑作用域誤判。

深讀:為什麼 deny 要寫得比 allow 更保守

allow 定義任務能力,deny 定義事故邊界。任務變化時,allow 可能需要擴充套件;但 .env*、private key、刪除命令、系統檔案、生產憑據這類邊界通常長期穩定。

把穩定紅線寫進 deny,可以減少因為臨時任務擴權導致的洩露或破壞。

本章自檢

完成本章後,用這 3 個問題檢查自己是否真正理解:

  1. 為什麼 Write 範圍通常應該小於 Read 範圍?
  2. WebFetch(*)Mcp(*:*) 為什麼不適合預設生產配置?
  3. deny 和 allow 同時命中時誰優先?

透過標準:你能為 docs-only CI workflow 寫出 permissions,並解釋每條 allow / deny 的業務原因。

官方來源

接下來去哪

本頁目錄