云端代理对照:Claude Code 的 cloud environments 与 Cursor 的 Cloud Agent

2026-08-18

把一个任务丢到云上让 agent 自己跑,选型时真正要问的不是”谁更聪明”,而是两件很土的事:这台云上的机器能连出去到哪里,以及它拿什么身份去访问你的仓库、你的 AWS、你的内部服务。这两件事两家的官方文档都写得挺细,而且划线的位置不一样。

下面只对照双方文档白纸黑字写明的机制。一方查不到的维度,我会直接说不比。

先把共同前提摆平

两边都是托管 VM 里跑、从仓库克隆到独立分支、跑完把改动推回去。共同点摆完就该说不同了。

有一条必须先标出来:Claude Code 官方文档在 code.claude.com/docs/en/claude-code-on-the-web 页顶明确写着,Claude Code on the web 处于 research preview,面向 Pro、Max、Team 用户以及持有 premium seats 或 Chat + Claude Code seats 的 Enterprise 用户。cloud environments 依赖这个能力,所以你读到的一切都要按”预览阶段”来估。Cursor 侧,cursor.com/docs/cloud-agent 写明 Cloud Agents 原来叫 Background Agents,是改过名的既有能力,并写明多仓环境的 long-running 目前还不可用。

维度一:云上到底能做什么

Claude Code 这边,“环境”是一份可保存的配置:网络访问级别、环境变量、setup script 三样。官方文档写明,onboarding 会给你建一个 Default 环境,而 Default 自身不带任何配置——只有 Trusted 网络级别,没有环境变量,没有 setup script。setup script 是 Bash,以 root 跑在 Ubuntu 24.04 上;它跑完之后 Anthropic 会对文件系统做快照,后续会话直接从快照起步、跳过脚本。文档特别点明这个快照只留文件不留进程:你装的包、拉的 Docker 镜像、写的文件都在,但脚本里 service postgresql start 起来的数据库、docker compose up 拉起的那一套,下次会话得重新起。

还有一条边界很硬:官方文档写明”You don’t get a shell into the session VM”——你没有进 VM 的 shell,所有命令都由 Claude 代你跑,连查预装工具的确切版本都得让它去执行 check-tools 这个 VM 上的 shell 命令(文档特意注明它不是 slash command)。

Cursor 这边,cursor.com/docs/cloud-agent 写明环境可以用 agent-led setup、保存的快照,或者 .cursor/environment.json 里的 Dockerfile 来配,Builds 会在后台把仓库和依赖准备好。差别最大的一块在 cursor.com/docs/cloud-agent/capabilities:文档写明每个 cloud agent 跑在自带完整桌面环境的隔离 VM 里,agent 能用鼠标键盘操作桌面和浏览器,起 dev server、在浏览器里点一遍 UI 流程,产出截图、视频和日志作为 artifacts;你也可以接管这台远程桌面自己点。

这一条就是第一个决策分叉:如果你的验收标准是”得有人跑起来点一遍”,Cursor 文档明确写了 computer use 与 remote desktop control 这条路;Claude Code 的文档里我们没有找到对应说明,这一点不比。反过来,如果你要的是终端与云之间来回搬,Claude Code 写得更具体:claude --cloud "…" 从终端起一个云会话,claude --teleport 把云会话连同分支拉回本地继续。文档同时写明这个搬运在 CLI 上是单向的——能拉回来,不能把已有的终端会话推上去(Desktop app 另有 Continue in 菜单可以送到 web)。另外 --teleport 有几条前置:工作区不能有未提交改动、必须在同一个仓库(不能是 fork)的 checkout 里跑、云会话的分支必须已经推到远端、必须是同一个 claude.ai 账号。

维度二:网络怎么隔

Claude Code 把出网收敛成一个字段。code.claude.com/docs/en/cloud-environments 的 Access levels 表列出四档:None(会话网络不能出网)、Trusted(只放行默认允许的域名)、Full(任意域名)、Custom(自己列,可选择是否叠加默认列表)。Custom 一行一个域名,前缀 *. 匹配所有子域:

api.example.com
*.internal.example.com
registry.example.com

有三条例外需要一起记住,否则你会以为自己关严了:

  • GitHub 流量走单独的 proxy,与这个级别无关;
  • 你在会话或 routine 上启用的 MCP connector 流量走 Anthropic 的服务器,不用把它们的 host 加进 Allowed domains;
  • 文档明写,即便设成 None,Claude Code 到 Anthropic API 的连接仍然是通的,并且原话是这可能允许数据离开 VM

这句我照抄不改写,因为它正是”有沙箱就安全”这种想当然会翻车的地方。文档还写明:每个环境有自己的 allowlist,不存在能由管理员推给全体成员环境的组织级 allowlist。

Cursor 侧,cursor.com/docs/cloud-agent 在 Runtime and environment controls 一节写明可以加 secrets、限制出站域名、用 Tailscale 或类似客户端接入私有网络、对受支持的源码托管路径使用 private connectivity,完整的网络控制在 cursor.com/docs/cloud-agent/security-network 那一页——本文没有把那一页作为依据,所以只复述到这里,更细的档位划分不比。

第二个决策分叉在这里:如果你的 agent 需要访问的是公司内网服务,Cursor 文档写明支持用 Tailscale 之类客户端接私网;Claude Code 的出网控制是域名维度的 allowlist,文档里我们没有找到接入私有网络的对应说明。另一个方向:如果你的组织开了 IP allowlisting,Claude Code 文档明写 Anthropic 托管的云会话会因此认证失败,因为 API 调用来自 Anthropic 的基础设施而不是你的网络。

维度三:身份怎么给

这是两家分歧最大的一块。

Claude Code 的官方口径是:目前没有专用的 secrets store。环境变量用 .env 格式,一行一个 KEY=value

NODE_ENV=development
LOG_LEVEL=debug
DATABASE_URL=postgres://localhost:5432/myapp

文档反复强调,用这个环境的任何人都能读到这些值,所以别往里放 API key。凭据的正解是 GitHub proxy:在 Anthropic 托管环境里,所有 GitHub 操作走这个 proxy,你真实的 GitHub 凭据不进会话 VM,VM 里的 git 客户端拿到的是一个 scoped credential,由 proxy 验证后换成真 token。判断自己是不是走在这条路上,文档给的动作是让 Claude 执行这条命令:

echo $GH_TOKEN

如果打印出 proxy-injected,说明 proxy 在替你认证。这里有个很容易咬人的点gh 这类会自己找凭据的工具能正常用,但你脚本里直接读 GITHUB_TOKEN 拿到的就是这个占位字符串,不是可用 token。proxy 还带三条硬限制:git push 只对会话当前工作分支生效;GitHub API 与 release asset 请求只能触达挂在这个会话上的仓库,否则 403;GraphQL 端点只放行固定的一组 PR 相关操作,其余一律 403,报错原文是 This GraphQL query is not enabled for this session 并指向 REST 兜底,因此只有 GraphQL 的接口(文档举的例子是 Projects v2)走不通。文档还写明这个限制与你自带的凭据无关,你自己设的 GH_TOKEN 照样吃 403。另外,AWS SSO 这类交互式登录在云会话里不支持,文档给的理由是它需要浏览器登录。

Cursor 走的是另一条路。cursor.com/docs/cloud-agent/identity 写明 Cursor 托管的 Cloud Agent VM 可以在 VM 内部铸造短时 OIDC JWT,用来 assume 云上的角色或调内部服务,从而不必把长期凭据塞进 Secrets。铸造走本地 Unix socket,路径取 CURSOR_AGENT_SOCKET,托管 VM 上默认是 /run/cursor/api.sock

curl --unix-socket "${CURSOR_AGENT_SOCKET:-/run/cursor/api.sock}" \
  -H 'Content-Type: application/json' \
  -d '{"aud":"sts.amazonaws.com"}' \
  http://cursor-agent/v1/tokens/oidc

请求体字段只有三个:必填的 aud、可选的 nonce、可选的 sub_claim(把某个 claim 投影进 sub,文档写明目前支持的名字由 discovery 的 x_cursor_sub_claims_supported 列出)。签发出来的 JWT 里带 cloud_agent_idteam_idrepo_urlrepo_urlsrepo_countbranch_nameenvironment_idsource 这些 claim,verifier 拿 https://api.cursor.com 这个 issuer 的 JWKS 验签后按 claim 授权。文档写明 token 短时有效且没有 refresh 端点,过期就重新铸。

Cursor 在这一页专门写了 Trust model,这段值得原样理解:token 标识的是这一次 run,不是 VM 里某个具体进程;任何能碰到那个 socket 的东西都能铸造 token——agent 本身、它跑起来的代码、以及 hooks 都算。所以授权粒度应该按”你愿意给这整个 run 什么权限”来定,而不是按”我只让 agent 自己用”来定。另外文档提醒:铸造只走本地 socket,但拿 JWT 去跟 AWS STS 之类换东西仍然需要出网,所以网络 allowlist 得把对应主机放行——网络这一维和身份这一维在这里是耦合的。

第三个决策分叉:如果你要让云端 agent 去拿 AWS、GCP、Azure 或自建服务的权限,Cursor 文档给出了一条不落地长期凭据的通用路径;Claude Code 的文档里,我们没有找到面向第三方云的短期身份铸造机制,找到的是”没有 secrets store,要放就按谁都能读来放”加上 GitHub 方向的 proxy。这不是谁好谁坏——一个把身份问题解在 GitHub 这条线上,另一个给了一个通用的 OIDC 出口。你的任务如果只在 GitHub 里打转,前者省事;一旦要碰云上资源,后者的机制更对得上。

维度四:CI 挂了谁去修

两边都有明文,可以比。

Claude Code 的 Auto-fix 需要在仓库上装 Claude GitHub App 来收 PR webhook,是按 PR 的开关。文档写明一个它自己承认的缺口:base 分支推进导致合并冲突时 GitHub 不发 webhook,所以 auto-fix 自己反应不了,得开会话让 Claude rebase。还有一条 warning 要认真读:Claude 可能用你的 GitHub 账号回复评论(每条会标明来自 Claude Code),如果你仓库里有靠 issue_comment 触发的自动化(文档点名 Atlantis、Terraform Cloud、自定义 GitHub Actions),一条评论就可能触发部署,开之前先审一遍。

Cursor 的自动修 CI 只支持 GitHub Actions,且只针对它自己开的 PR。文档列了几种跳过的情况:你往分支上推了新 commit(它不给人类的 commit 修 CI)、你给 agent 发了 follow-up、同一个 check 在 PR 的 base commit 上就已经在挂、以及跟进次数达到上限。单个 PR 上可以用评论 @cursor autofix off / @cursor autofix on 开关。这里必须照实标:文档写明自动修 CI 目前只在 Teams 可用,非 Teams 账号 “coming soon”。

两边的共同边界其实一致:人一插手,自动化就退场

不比的几条

  • 隔离强度不比。两家文档都只给到”isolated VM”这个层级的表述,再往下就是推断,我们不做。
  • 价格、额度、模型不比,本文不写这类数值。
  • Claude Code 的 self-hosted environments、Cursor 的 security-network 与 Builds 细节,本文没有把那些页面作为依据。

Windows 上要先知道的三件事

本站读者多在 Windows 上开工,有三条容易踩:

第一,云上那台机器不是 Windows。Claude Code 文档写明 Anthropic 托管环境的会话跑在 x86_64 的 Ubuntu 24.04 上,与你本机的系统和 CPU 架构无关,依赖若提供预编译产物要取 x86_64 Linux 版本;setup script 是 Bash 脚本、以 root 执行,你在 Windows 上写惯的 PowerShell 脚本不能直接贴进那个字段。Cursor 侧同理,环境由 .cursor/environment.json 里的 Dockerfile 或快照决定。

第二,CLI 侧 PowerShell 不特殊。Claude Code 文档写明,给已在跑的云会话发后续消息的命令在任何 shell 里都一样,包括 PowerShell:

claude -p "your message" --cloud <session-id>

它把消息排进会话就退出,不等回复;<session-id> 可以传裸 ID,也可以传 claude.ai/code/<id> 这个 URL。以上命令原样抄自官方文档,我们未做实测,以官方文档与 --help 的实际输出为准。

第三,.env 的注释规则。环境变量一行一个 KEY=value,未加引号的值里出现 # 会开启注释、把该行后面的内容丢掉,值里带 # 或跨行就要加引号。从 Windows 上现成的配置文件里复制粘贴时,这条最容易安静地把值截断。

最后重复一句本来就该重复的:这两个产品都在快速迭代,上面每一个命令、字段名和默认行为都以官方文档最新内容为准;本文只复述文档写明的机制,没有实测的成分。


本文依据 Claude Code 官方文档(code.claude.com/docs)于 2026-08-17 的公开内容整理。 该产品闭源,本文只复述官方文档写明的机制,不推断其内部实现我们没有对文中涉及的功能做过实测,因此不涉及界面外观、操作手感与运行速度的任何描述。 该产品迭代频繁,文中涉及的命令、配置项与默认值随版本变动,请以官方文档最新内容为准。 本文不涉及价格、额度与限流的具体数值,相关信息请以官方定价与用量说明页为准。

本文涉及的另一方内容依据其官方文档整理(Cursor:cursor.com/docs)。 双方均为闭源商业产品,本文只对照各方公开写明的机制,不推断实现,也不对产品做优劣排名

安全与合规相关做法请结合自身环境评估,本文不构成安全方案建议。

想系统学会用 AI?报名体系课或加入会员,照着学、照着用。