介绍
启用本地沙盒后,Copilot CLI 会在操作系统沙盒内运行它代你调用的命令。 沙盒强制实施 文件系统策略:一组规则,用于确定沙盒进程或操作可以读取哪些路径、可以写入哪些路径,以及它根本无法触摸哪些路径。
大部分策略都是自动组装的,以便日常命令在未设置的情况下继续工作。 本文介绍如何 Copilot 得出该策略,以及如何检查它在特定目录中授予了哪些访问权限。
有关本地沙盒的概述(包括如何启用和禁用它),请参阅 关于 GitHub Copilot 的云沙盒和本地沙盒 和 使用本地沙盒机制。 有关如何配置本地沙盒的详细信息,请参阅 配置本地沙盒设置。
策略适用于的内容
文件系统策略涵盖代表你执行的工作 Copilot ,但根据工作类型,它以不同的方式强制执行:
- Shell 命令和内置搜索 以沙盒化的子进程形式运行,因此操作系统会直接强制执行该策略。 例如,
grep和glob工具将 ripgrep 作为受沙盒限制的子进程运行。 - 默认情况下,本地 MCP 和语言服务器进程(LSP) 在沙盒中运行,因此操作系统也会对其强制执行策略。 可以更改沙盒设置中的此项,但如果某个受管理的策略要求这样做,则无法更改。
- 内置的文件读取和文件编辑工具作为 Copilot CLI 自身的一部分运行,而不是作为受沙盒保护的子进程运行。 它们先检查相同的文件系统策略,然后再读取或写入文件,但由于操作系统沙盒永远不会看到这些操作,因此检查是仅软件保护,而不是操作系统强制执行的一种。
- 远程 MCP 服务器 在计算机外部运行,因此没有沙盒的本地子进程,文件系统策略不会限制它们。 启用沙盒 MCP 服务器时,他们从 CLI 发起的连接仍可能受到网络策略限制。
- 子代理 使用其他工具执行其工作。 策略是否适用以及应用方式取决于子代理调用的工具。
因此,沙盒 进程 受操作系统的约束,而进程内 操作 在软件中强制实施相同的策略,这就是为什么本文引用沙盒进程或操作,而不仅仅是命令。
权限级别
沙盒采用默认拒绝策略:除非明确授予某一路径权限,否则命令无法使用该路径。 策略中的每个路径都有三个权限级别之一:
- 读/写 - 命令可以读取和修改此路径上的文件。
- 只读 - 命令可以读取此路径上的文件,但不能更改这些文件。
- 被拒绝 — 命令无法在此路径上读取或写入,即使更广泛的规则将允许它。
由于访问默认会被拒绝,除非已明确授予权限,因此 Copilot 必须向命令授予其因正当用途所需的一切访问权限——你的项目文件、它运行时使用的工具,以及临时目录等辅助位置——同时将其他所有内容设为不可访问。
注意
这些权限级别适用于每个沙盒化进程或操作,但其执行方式有所不同:对于沙盒化子进程,这些权限级别由操作系统直接强制执行;而 CLI 自身内置的文件读取和文件编辑工具则在软件层面检查同样的权限级别,没有操作系统提供兜底保障。
如何生成策略
在每个沙盒进程启动之前,Copilot CLI 会根据当前工作目录、环境、设置和自动授予项,为该进程确定生效的策略。 这包括工具所需的常用位置,因此无需自行逐一授予这些权限。 工具还可以获得对所选会话文件以及它们需要使用的已安装技能的访问权限。
工作目录
当本地沙盒的文件系统设置中启用了 Include 工作目录 (默认启用)时,将授予当前工作目录读/写访问权限。 在 Git 存储库中, Copilot 还会添加关联的 Git 授权。 关闭此设置将禁止所有这些自动授予,因此必须手动添加所需项目和 Git 路径的允许规则。 请参阅“配置本地沙盒设置”。
注意
如果你从企业拥有的组织收到 Copilot,管理员可以关闭包括工作目录设置并将其锁定,这样就无法重新开启。 请参阅“企业管理设置”。
PATH 中的工具
要运行诸如 python 或 git 这样的程序,沙盒必须让该命令能够看到该程序所在的目录。 启用 “允许开发工具访问 ”(如默认情况下)时,Copilot 将 授予对 环境变量中列出的 PATH 目录的只读访问权限,以及相关工具变量(例如 GOPATH, JAVA_HOME和 PYTHONPATH)命名的目录。 只读是外部工具的正确级别:命令需要运行 git,而不是对其进行修改。 如果关闭 “允许开发工具访问” ,则不再自动授予这些目录,并且必须来自你自己的允许规则。 有关沙盒检查的 PATH 环境变量和工具链环境变量的完整列表,以及对每个变量如何解释的说明,请参阅 GitHub Copilot CLI 命令参考。
系统和配置文件位置
在 macOS 上,标准系统位置被授予只读权限,以便命令可以加载共享库和读取系统配置,而无需更改它们。 启用 “允许开发工具访问”时,用户配置文件中的应用程序目录(例如,Windows上的子目录%LOCALAPPDATA%\Programs或 ~/.local/bin macOS 和 Linux 上的目录~/.local/lib)也被授予只读权限,以便命令可以读取已安装的工具,而无需修改它们。
包管理器缓存
启用 “允许开发工具访问 ”时, Copilot 授予对常见包管理器和工具链使用的缓存和注册表的访问权限。 大多数位置为只读。 所选位置(例如 npm 的缓存、生成缓存和某些依赖项存储)是可写的,因此安装和生成可以正常工作。
这些授权取决于项目中检测到的命令和工具。 他们可以按照您在常规目录之外配置的缓存位置进行查找。 某些授予的配置文件包含仓库凭据,并且可写缓存可与在沙盒外部运行的命令共享。 如果想要自行授予这些位置,请关闭 “允许开发工具访问”。
在/sandbox policy报告中,“开发工具” 部分列出了检测到的工具及其路径。 当命令需要这些缓存时,会创建选定的可写缓存,因此在首次使用之前,它们可能不会显示在报表中。
Git 存储库
在 Git 存储库的子目录中工作时,Copilot授予对整个存储库的读取访问权限,以便命令可以查看完整的项目,同时限制对当前工作目录和存储库的 Git 元数据(其.git目录)的写入。 这样,命令就可以跨存储库进行读取,但将更改集中在你工作的位置上。
由于读取访问权限跨越整个存储库,沙盒命令可以读取当前子目录之外的文件,包括项目中其他位置存储的任何敏感内容。 若要使特定路径无法访问,可以添加拒绝规则。 请参阅“配置本地沙盒设置”。
访问规则重叠时
由于 Copilot 授予多个位置,你可以添加自己的位置,因此规则可以重叠。 当只读和读/写授予重叠时, 更具体的路径将获胜。 例如,如果 /project 可写,但你将 /project/secrets 标记为只读,则 /project/secrets 中除 /project 外的所有内容都将保持可写。 被拒绝的路径优先于这两种类型的授权。
发现的工具目录授予被已涵盖它们的读/写访问权限取代。 假设有一个 Python 项目,其中包含一个本地虚拟环境 (.venv),该环境出现在你的 PATH 上。 将该目录视为普通的只读工具位置会使它处于只读状态(即使它位于可写项目内),并且这样的命令在 pip install 尝试更新环境时可能会失败。
Copilot 将其保留为工作区的一部分,并保持可写状态。 其他只读规则(包括自己配置的规则)不会以这种方式丢弃。
你配置的规则不会仅仅因为自动发现了相同的路径而被删除。 可以使用它们来限制对敏感位置(如现有 .env 文件)的访问。 缺少路径和符号链接需要额外的照顾,如 文件系统访问故障排除中所述。
检查当前策略允许的内容
由于策略是按每个目录和命令组装的,因此,查看自己拥有的访问权限的最简单方法是向 Copilot CLI 查询。 在会话中,输入:
/sandbox policy
/sandbox policy
Copilot 打印当前目录 的有效 策略。 路径按源(如 用户配置的路径 和 开发工具)以及访问级别分组。 报告还包括网络设置和 功能 部分,涵盖绕过、MCP/LSP 沙盒和身份验证等设置。 这是自动授予、设置和托管限制合并后的结果,而不仅仅是已保存设置的副本。
若要检查特定命令的开发人员工具访问权限,请在 policy 后添加该命令。 例如:
/sandbox policy npm install
/sandbox policy npm install
这无法运行 npm install。 它显示该命令将获得的工具访问权限。 预览不会创建任何目录,包括缺失或被拒绝访问的路径和工具缓存。
阅读报表时要记住的一些事项:
- 它反映 当前目录。 由于授权是按目录发现的,因此相同的设置可能会因运行位置不同而解析为不同的路径。
- 检查备注中未能包含的已配置路径。 缺少读/写或只读授权的项将被省略。 在 Linux 上,此预览中会省略缺少的被拒绝路径,但启动准备会在应用策略之前创建它们。 预览在 macOS 和支持被拒绝路径的 Windows 主机上保留它们。
- 如果沙盒已禁用,
/sandbox policy会告知你这一点,而不是打印策略,因为此时没有任何限制生效。
若要仅检查当前是否已启用沙盒机制,请使用 /sandbox status。 有关这些命令的详细信息,请参阅 使用本地沙盒机制。
文件系统访问疑难解答
如果配置的读/写或只读路径不存在,请在沙盒外部创建它,然后再再次启动命令。 正在运行的子进程将保留它在启动时收到的策略。 稍后创建路径不会向该过程添加缺少的授予项。 如果需要更新后的访问权限,请重启长时间运行的服务器。
在沙盒进程启动之前,Copilot CLI 在计算机上创建缺失的拒绝访问路径及其父目录。 这包括用于文件的路径,因此缺少 .env 时,该路径会成为目录。 进程退出后,这些目录仍然存在。
如果无法准备无权限访问的路径,则进程不会启动。 只读 /sandbox policy 预览不会执行此准备,这就是为什么缺失的被拒绝路径在 Linux 上会被省略。 有关故障排除,请参阅 使用本地沙盒机制。
允许目录内的符号链接不能保证访问该目录外部的目标。 如果拒绝消息提到此类目标,请检查它,并仅在预期情况下授予访问权限。 通过 /sandbox config 添加可解析的符号链接本身还会添加其当前目标进行读/写或只读访问。 手写路径规则和自动发现的开发人员工具授予不会自动添加该目标。
拒绝的路径处理方式不同于授予:CLI 解析文本中写出的路径及其当前目标。 在 Linux 上,被拒绝访问的符号链接可保护其目标,但无法可靠地阻止链接本身被替换。 首选拒绝实际敏感目录,而不是仅依赖符号链接规则。
有关网络故障、托管限制和绕过选项,请参阅 阻止命令故障排除。
自定义策略
你可以从对话框或设置文件中授予额外的读/写或只读路径、拒绝路径和更改其他文件系统行为 /sandbox config 。 进行更改后,运行 /sandbox policy 以确认结果。 有关分步说明,请参阅 配置本地沙盒设置。
企业管理的策略
如果你是通过企业所属组织获得 Copilot,管理员可以通过托管设置强制执行文件系统策略。 托管设置可作为限制性的基线配置:它们可以要求启用沙盒机制、添加拒绝访问的路径,并限制你可以授予权限的路径。 在应用了受管理设置的情况下,/sandbox config 对话框会将其显示为已锁定的 (managed) 值,且 /sandbox policy 会在已解析的策略中反映这一点。 如果有效策略允许绕过沙盒,用户可以明确禁用当前会话剩余时间内的沙盒,方式可以是通过当前显示的绕过权限提示,也可以是运行 /sandbox disable。 此会话选择退出不会放宽已保存的策略。
大多数设置都是单一来源生效,但沙盒策略不同,它由当前生效的所有来源共同组合而成。 托管设置可以同时通过多个渠道下发——服务器托管、MDM 和基于文件——这些设置会彼此叠加,也会与你自己的设置一起按 最严格 的方向生效,而不是由某一个来源覆盖另一个来源:要求开启的开关会保持开启,所有来源拒绝的路径会累加,而你被允许授予的路径范围只能进一步收窄。 有关详细信息,请参阅“企业管理设置”。