一、目标与结果
完成这篇操作后,你将获得:
·一个状态为 ACTIVE 的 WAA 沙箱工具。
·一个状态为 RUNNING 的 WAA 沙箱实例。
·可在浏览器中打开的 Windows 桌面地址,以及截图、平台信息、命令执行等入口。
二、前提条件
使用前请确认以下条件已满足:
1. 已注册腾讯云账号,并完成实名认证。
2. 已开通腾讯云 Agent Runtime 服务。如未开通,可 提交工单 申请开通。
3. 已获取 API 密钥(SecretId / SecretKey):
·登录 腾讯云控制台。
·进入 访问管理 > API 密钥管理。
·新建密钥或使用已有密钥,记录 SecretId 和 SecretKey。
4. 已选择目标地域。这篇以广州为例,其他地域的可用性以当前控制台为准:
| 地域 | Region ID | Domain |
| 广州 | ap-guangzhou | tencentags.com |
| 北京 | ap-beijing | tencentags.com |
| 上海 | ap-shanghai | tencentags.com |
三、步骤概览
1. 安装 agr CLI。
2. 配置腾讯云凭证。
3. 设置默认地域与 Domain。
4. 验证配置与连通性。
5. 创建 WAA 沙箱工具。
6. 创建沙箱实例。
7. 获取并打开 Windows 桌面。
五、步骤 1:安装 agr CLI
# 方式一:脚本安装curl -fsSL https://dl.tencentags.com/agr-cli/latest/install.sh | sh# 方式二:go install(需要 Go 环境)go install github.com/TencentCloudAgentRuntime/ags-cli/cmd/agr@latestexport PATH="$HOME/go/bin:$PATH"# 验证安装agr version -o json –non-interactive
详细安装说明请参见 agr CLI 安装与配置。
六、步骤 2:配置腾讯云凭证
注意:凭证仅写入本地 ~/.agr/config.toml。请勿将 SecretId / SecretKey 写入文档或提交到代码仓库。也可改用环境变量 TENCENTCLOUD_SECRET_ID / TENCENTCLOUD_SECRET_KEY。
agr init \\ –secret-id "<YOUR_SECRET_ID>" \\ –secret-key "<YOUR_SECRET_KEY>" \\ –non-interactive
七、步骤 3:设置默认地域与 Domain
agr config set region ap-guangzhouagr config set domain tencentags.com
八、步骤 4:验证配置与连通性
agr doctor -o json –non-interactive
检查配置、凭据和 API 连通性诊断结果。Connectivity 失败时,结合返回错误排查网络、凭据、权限和服务开通情况;该命令不检查 Windows 内的桌面或控制服务是否就绪。
九、步骤 5:创建 WAA 沙箱工具
WAA 是平台内置的 Windows 沙箱类型。你可以根据需要创建限时沙箱或常驻沙箱,两者不要混用。
十、方式一:创建限时沙箱工具
TOOL_NAME="my-waa-tool-$(date +%s)-$$"TOOL_ID=$(agr tool create \\ –tool-name "$TOOL_NAME" \\ –tool-type waa \\ –network-configuration '{"NetworkMode":"PUBLIC"}' \\ –default-timeout 1h \\ -o json –non-interactive –jq '.Data.ToolId')echo "ToolId: $TOOL_ID"
十一、方式二:创建常驻沙箱工具
TOOL_NAME="my-waa-tool-$(date +%s)-$$"TOOL_ID=$(agr tool create \\ –tool-name "$TOOL_NAME" \\ –tool-type waa \\ –network-configuration '{"NetworkMode":"PUBLIC"}' \\ –persistent \\ -o json –non-interactive –jq '.Data.ToolId')echo "ToolId: $TOOL_ID"
十二、参数说明
| 参数 | 含义 |
| –tool-name | 工具名称,全局唯一。建议使用小写字母、数字和短横线,例如 my-waa-tool。 |
| –tool-type waa | 指定创建 WAA(Windows Agent Arena)沙箱类型。 |
| –network-configuration | 网络配置,PUBLIC 表示沙箱可访问公网;实例端口鉴权由 –auth-mode 控制。 |
| –default-timeout | 限时沙箱的默认存活时长,到期自动停止。仅用于方式一,请勿与 –persistent 混用。 |
| –persistent | 常驻沙箱:该工具的实例不受超时和最长存活时长回收限制。仅用于方式二,请勿与 –default-timeout 混用。 |
注意:说明:
注意:限时 WAA 沙箱实例的最长存活时长为 24 小时;常驻沙箱(–persistent)的实例不受该上限约束。
确认工具状态为 ACTIVE,否则停止后续创建并排查:
for attempt in $(seq 1 24); do TOOL_STATUS=$(agr tool get "$TOOL_ID" -o json –non-interactive –jq '.Data.Status') echo "工具状态: $TOOL_STATUS" [ "$TOOL_STATUS" = "ACTIVE" ] && break [ "$TOOL_STATUS" = "FAILED" ] && exit 1 sleep 5done[ "$TOOL_STATUS" = "ACTIVE" ] || { echo "工具未就绪,请排查并清理本次资源" >&2; exit 1; }
十三、步骤 6:创建沙箱实例
INSTANCE_ID=$(agr instance create \\ –tool-name "$TOOL_NAME" \\ –auth-mode PUBLIC \\ –timeout 1h \\ -o json –non-interactive –jq '.Data.InstanceId')echo "InstanceId: $INSTANCE_ID"
| 参数 | 含义 |
| –auth-mode PUBLIC | 公网认证模式。业务端口无需 Token,ENVD 管理端口 49983 仍需携带 Token。 |
| –timeout | 实例存活时长,超时自动停止。常驻沙箱(–persistent)的实例不受该参数影响。 |
注意:PUBLIC 会让 5000 等业务端口允许匿名访问,包括 /setup/execute 命令执行接口。请只用于隔离的测试实例,不要在沙箱中放入敏感数据,用完及时删除。
等待实例与服务就绪。RUNNING 仅代表实例状态,控制服务与桌面可能仍在启动;以下轮询有次数上限,失败时停止并排查:
REGION=ap-guangzhouDOMAIN=tencentags.comfor attempt in $(seq 1 36); do STATUS=$(agr instance get "$INSTANCE_ID" -o json –non-interactive –jq '.Data.Status') echo " 状态: $STATUS" [ "$STATUS" = "RUNNING" ] && break case "$STATUS" in FAILED|STOPPED|STOPPING) echo "实例启动失败: $STATUS" >&2; exit 1;; esac sleep 5done[ "$STATUS" = "RUNNING" ] || exit 1# RUNNING 不代表 Windows 内的 WAA 服务已经就绪echo ">>> 等待 WAA 服务与桌面就绪…"READY=falsefor attempt in $(seq 1 24); do if PLATFORM=$(curl -k -fsS –max-time 10 "https://5000-${INSTANCE_ID}.${REGION}.${DOMAIN}/platform" 2>/dev/null) && \\ [ "$PLATFORM" = "Windows" ] && \\ curl -k -fsS –max-time 10 "https://8006-${INSTANCE_ID}.${REGION}.${DOMAIN}/vnc.html" > /dev/null 2>&1; then READY=true break fi sleep 5done[ "$READY" = "true" ] || { echo "WAA 服务未就绪,请检查镜像与实例" >&2; exit 1; }curl -k -fsS –max-time 60 "https://5000-${INSTANCE_ID}.${REGION}.${DOMAIN}/screenshot" -o screenshot.png
十四、步骤 7:获取并打开桌面
先通过 CLI 取回访问 Token,再按 WAA 的 noVNC 页面路径 /vnc.html 拼接地址:
REGION=ap-guangzhouDOMAIN=tencentags.comAGR_VNC_URL=$(agr instance browser vnc "$INSTANCE_ID" –port 8006 -o json –non-interactive –jq '.Data.VncUrl')VNC_TOKEN=${AGR_VNC_URL##*access_token=}VNC_TOKEN=${VNC_TOKEN%%&*}VNC_URL="https://8006-${INSTANCE_ID}.${REGION}.${DOMAIN}/vnc.html?path=websockify?token=${VNC_TOKEN}"echo "$VNC_URL"
注意:说明:
注意:CLI 返回的地址中页面路径为 /novnc/vnc_lite.html,在 WAA 镜像下该路径会返回 404;WAA 的 noVNC 页面实际是 /vnc.html,因此需要按上面的方式用 access_token 重新拼接。Token 必须取自当前实例的 CLI 返回值,完整 URL 含访问凭证,请勿公开分享。
注意:实例进入 RUNNING 后,noVNC 服务可能仍在初始化。页面 HTTP 200 也不能代替桌面连接验证,请在浏览器中确认能看到 Windows 桌面。
十五、端口与访问地址
数据面访问地址格式:
https://<port>-<instance_id>.<region>.<domain>/<path>
以广州地域为例(请替换 instance_id):
https://5000-<instance_id>.ap-guangzhou.tencentags.com/screenshothttps://8006-<instance_id>.ap-guangzhou.tencentags.com/vnc.html
常用端口:
| 端口 | 功能 | 路径 | 是否需要 Token(PUBLIC 模式) |
| 8006 | noVNC 桌面 | /vnc.html | 否(PUBLIC 模式);也可使用 CLI Token 生成连接地址 |
| 5000 | 沙箱控制服务 | /screenshot、/platform、/setup/execute | 否 |
| 9222 | Chromium CDP | /json/version | 否(需先启动 Chrome 1337 和 CDP 代理 9222) |
| 49983 | ENVD 管理端口 | – | 是(管理端口在 PUBLIC 模式下仍需 Token) |
注意:说明:
注意:端口是否可用取决于镜像内对应服务是否已启动。特别是 9222 需要单独启动 Chrome 和 CDP 代理,不能仅凭实例进入 RUNNING 就认定可用。
十六、结果验证
检查实例状态、平台信息和桌面截图:
# 预期输出 RUNNINGagr instance get "$INSTANCE_ID" -o json –non-interactive –jq '.Data.Status'# 预期返回 Windowscurl -k -sS –max-time 10 \\ "https://5000-${INSTANCE_ID}.ap-guangzhou.tencentags.com/platform"# 保存桌面截图curl -k -sS –max-time 60 \\ "https://5000-${INSTANCE_ID}.ap-guangzhou.tencentags.com/screenshot" \\ -o screenshot.png
在浏览器中打开步骤 7 得到的 noVNC 地址,确认能看到 Windows 桌面。
十七、常用操作示例
以下命令中的 INSTANCE_ID、REGION、DOMAIN 需替换为实际值:
INSTANCE_ID="your-instance-id"REGION=ap-guangzhouDOMAIN=tencentags.com
十八、获取并打开 noVNC 桌面
AGR_VNC_URL=$(agr instance browser vnc "$INSTANCE_ID" –port 8006 -o json –non-interactive –jq '.Data.VncUrl')VNC_TOKEN=${AGR_VNC_URL##*access_token=}VNC_TOKEN=${VNC_TOKEN%%&*}VNC_URL="https://8006-${INSTANCE_ID}.${REGION}.${DOMAIN}/vnc.html?path=websockify?token=${VNC_TOKEN}"echo "$VNC_URL"# 浏览器打开(macOS)open "$VNC_URL"
十九、获取当前桌面截图
curl -k -sS –max-time 60 \\ "https://5000-${INSTANCE_ID}.${REGION}.${DOMAIN}/screenshot" \\ -o screenshot.png
注意:说明:
注意:在 noVNC 不可用时,可通过截图确认桌面是否正常显示。
20、查看平台信息
curl -k -sS –max-time 10 "https://5000-${INSTANCE_ID}.${REGION}.${DOMAIN}/platform"# 预期返回: Windows
21、在沙箱内执行命令
# 获取当前用户和主机名curl -k -sS –max-time 30 \\ -H 'Content-Type: application/json' \\ -d '{"command":"whoami && hostname","shell":true}' \\ "https://5000-${INSTANCE_ID}.${REGION}.${DOMAIN}/setup/execute"# 列出目录curl -k -sS –max-time 30 \\ -H 'Content-Type: application/json' \\ -d '{"command":"dir C:\\\\Users","shell":true}' \\ "https://5000-${INSTANCE_ID}.${REGION}.${DOMAIN}/setup/execute"
返回格式:
{ "error": "", "output": "<command output>", "returncode": 0, "status": "success"}
注意:说明:
注意:WAA 是 Windows 环境,请使用 Windows 命令(whoami、dir、hostname),不要使用 Linux 命令(id、ls)。
22、浏览器自动化(CDP)
依次启动 Chrome 和 CDP 代理:
curl -k -sS –max-time 60 \\ -H 'Content-Type: application/json' \\ -d '{ "command": [ "google-chrome", "–remote-debugging-port=1337", "–force-renderer-accessibility" ], "shell": false}' \\ "https://5000-${INSTANCE_ID}.${REGION}.${DOMAIN}/setup/launch"curl -k -sS –max-time 60 \\ -H 'Content-Type: application/json' \\ -d '{ "command": [ "socat", "tcp-listen:9222,fork", "tcp:localhost:1337" ], "shell": false}' \\ "https://5000-${INSTANCE_ID}.${REGION}.${DOMAIN}/setup/launch"
检查 CDP 入口:
curl -k -sS –max-time 10 "https://9222-${INSTANCE_ID}.${REGION}.${DOMAIN}/json/version"
返回的 webSocketDebuggerUrl 可用于连接 CDP;连接失败时见“CDP 返回 502”。
23、查看 noVNC 静态资源目录
以下命令查看 noVNC Web 服务的静态资源目录,返回内容包括 app/、core/、vendor/ 和 vnc.html 等。该入口不用于浏览 Windows 沙箱文件系统。
curl -k -sS –max-time 10 "https://8006-${INSTANCE_ID}.${REGION}.${DOMAIN}/"
24、端到端创建脚本
在已安装 agr 并配置凭据的 Bash 环境运行。脚本创建常驻 WAA 沙箱,校验工具和实例状态,再等待 5000/8006 服务并保存截图。脚本成功后仍需在浏览器中确认桌面连接;CDP 需另按“浏览器自动化(CDP)”启动。
#!/bin/bashset -euo pipefail# ====== 修改以下变量 ======TOOL_NAME="my-waa-tool-$(date +%s)-$$"REGION="ap-guangzhou"DOMAIN="tencentags.com"TOOL_ID=""INSTANCE_ID=""# 失败时保留排查线索;按输出的 ID 清理本次创建的资源。trap 'rc=$?; if [ "$rc" -ne 0 ]; then echo "创建未完成(退出码 ${rc})。ToolId=${TOOL_ID} InstanceId=${INSTANCE_ID};请排查并清理本次资源。" >&2; fi' EXIT# ====== 创建工具 ======echo ">>> 创建沙箱工具…"TOOL_ID=$(agr –region "$REGION" –domain "$DOMAIN" tool create \\ –tool-name "$TOOL_NAME" \\ –tool-type waa \\ –network-configuration '{"NetworkMode":"PUBLIC"}' \\ –persistent \\ -o json –non-interactive –jq '.Data.ToolId')echo "ToolId: $TOOL_ID"# 确认工具就绪for attempt in $(seq 1 24); do TOOL_STATUS=$(agr –region "$REGION" –domain "$DOMAIN" tool get "$TOOL_ID" -o json –non-interactive –jq '.Data.Status') echo "工具状态: $TOOL_STATUS" [ "$TOOL_STATUS" = "ACTIVE" ] && break [ "$TOOL_STATUS" = "FAILED" ] && exit 1 sleep 5done[ "$TOOL_STATUS" = "ACTIVE" ] || { echo "工具未就绪,请排查并清理本次资源" >&2; exit 1; }# ====== 创建实例 ======echo ">>> 创建沙箱实例…"INSTANCE_ID=$(agr –region "$REGION" –domain "$DOMAIN" instance create \\ –tool-name "$TOOL_NAME" \\ –auth-mode PUBLIC \\ -o json –non-interactive –jq '.Data.InstanceId')echo "InstanceId: $INSTANCE_ID"# ====== 等待就绪 ======echo ">>> 等待实例启动(Windows 沙箱约需 30~90 秒)…"for attempt in $(seq 1 36); do STATUS=$(agr –region "$REGION" –domain "$DOMAIN" instance get "$INSTANCE_ID" -o json –non-interactive –jq '.Data.Status') echo " 状态: $STATUS" [ "$STATUS" = "RUNNING" ] && break case "$STATUS" in FAILED|STOPPED|STOPPING) echo "实例启动失败: $STATUS" >&2; exit 1;; esac sleep 5done[ "$STATUS" = "RUNNING" ] || exit 1# RUNNING 不代表 Windows 内的 WAA 服务已经就绪echo ">>> 等待 WAA 服务与桌面就绪…"READY=falsefor attempt in $(seq 1 24); do if PLATFORM=$(curl -k -fsS –max-time 10 "https://5000-${INSTANCE_ID}.${REGION}.${DOMAIN}/platform" 2>/dev/null) && \\ [ "$PLATFORM" = "Windows" ] && \\ curl -k -fsS –max-time 10 "https://8006-${INSTANCE_ID}.${REGION}.${DOMAIN}/vnc.html" > /dev/null 2>&1; then READY=true break fi sleep 5done[ "$READY" = "true" ] || { echo "WAA 服务未就绪,请检查镜像与实例" >&2; exit 1; }curl -k -fsS –max-time 60 "https://5000-${INSTANCE_ID}.${REGION}.${DOMAIN}/screenshot" -o screenshot.png# ====== 获取 noVNC URL ======AGR_VNC_URL=$(agr –region "$REGION" –domain "$DOMAIN" instance browser vnc "$INSTANCE_ID" –port 8006 -o json –non-interactive –jq '.Data.VncUrl')VNC_TOKEN=${AGR_VNC_URL##*access_token=}VNC_TOKEN=${VNC_TOKEN%%&*}VNC_URL="https://8006-${INSTANCE_ID}.${REGION}.${DOMAIN}/vnc.html?path=websockify?token=${VNC_TOKEN}"# ====== 输出访问入口 ======echo ""echo "========================================="echo " WAA 实例、控制服务与 noVNC 页面检查通过"echo "========================================="echo "ToolId: $TOOL_ID"echo "InstanceId: $INSTANCE_ID"echo ""echo "noVNC 桌面: $VNC_URL"echo "截图: https://5000-${INSTANCE_ID}.${REGION}.${DOMAIN}/screenshot"echo "平台信息: https://5000-${INSTANCE_ID}.${REGION}.${DOMAIN}/platform"echo "CDP(尚未启动;请执行“浏览器自动化(CDP)”): https://9222-${INSTANCE_ID}.${REGION}.${DOMAIN}/json/version"echo ""echo "删除实例: agr –region "$REGION" –domain "$DOMAIN" instance delete $INSTANCE_ID –ignore-not-found –yes"echo "删除工具: agr –region "$REGION" –domain "$DOMAIN" tool delete $TOOL_ID –yes"
如需创建限时沙箱,请将 –persistent 替换为 –default-timeout 1h,并在 instance create 中补上 –timeout 1h。运行失败时按输出的 ID 清理本次创建的资源;常驻实例成功后也需主动删除。
25、实例生命周期与资源清理
# 查询实例详情agr instance get <instance-id> -o json –non-interactive# 列出所有运行中的实例agr instance list –filters '[{"Name":"Status","Values":["RUNNING"]}]' -o json –non-interactive# 删除实例(–yes 跳过确认,–ignore-not-found 允许重复执行)agr instance delete <instance-id> –ignore-not-found –yes -o json# 删除工具agr tool delete <tool-id> –yes -o json
注意:实例或工具使用完成后请及时删除,避免持续占用资源。删除类操作请只针对自己创建的资源。
27、实例创建失败
·检查是否已开通 Agent Runtime 服务。运行 agr doctor -o json,若 Connectivity 不为 ok,请根据返回错误排查网络、凭据、权限与服务开通情况。
·检查 API 密钥是否正确。运行 agr status -o json,确认 Auth.SecretId.Present 为 true。
·若提示 timeout too large:限时沙箱实例最长存活 24 小时,请缩短 –timeout / –default-timeout。
28、noVNC 桌面无法打开或 502/404
·页面路径必须是 /vnc.html(CLI 返回的 /novnc/vnc_lite.html 在 WAA 镜像下是 404)。
·使用步骤 7 的方法,从当前实例的 CLI 返回值提取 access_token,生成 /vnc.html?path=websockify?token=… 地址。PUBLIC 模式允许匿名业务访问,Token 不是该模式下桌面连接的强制条件;含 Token 的完整 URL 请勿公开分享。
·实例刚启动时 noVNC 服务可能仍在初始化,请等待后重试;以实际桌面连接为准。
·可通过截图接口确认桌面是否正常显示。
29、截图请求超时或返回 502
·首次截图可能较慢,建议把客户端超时放宽到 60 秒。
·若持续 502,沙箱内桌面服务可能尚未就绪或不可达,稍后重试或先打开 noVNC 确认。
30、CDP 返回 502
先按“浏览器自动化(CDP)”依次通过 /setup/launch 启动 Chrome 1337 和 CDP 代理 9222。检查两条请求的返回值、Chrome 进程以及 1337/9222 监听状态。仅让 Chrome 监听 127.0.0.1:9222 不能替代这套代理流程。
31、命令执行返回 error
WAA 是 Windows 环境,请使用 Windows 命令(whoami、dir、hostname),不要使用 Linux 命令(id、ls)。
32、–network 报 unknown flag
请使用 –network-configuration '{"NetworkMode":"PUBLIC"}',而不是 –network。
33、WAA 与 OSWorld 沙箱差异
| 特性 | WAA | OSWorld |
| 操作系统 | Windows | Linux |
| 桌面 | noVNC(8006,页面 /vnc.html) | noVNC(5910,页面路径以镜像为准) |
| 控制服务 | 5000(同一套 API) | 5000(同一套 API) |
| 命令语法 | Windows | Linux |
| CDP | 9222(需启动 Chrome 和 CDP 代理) | 9222(需在沙箱内启动) |
注意:说明:
注意:WAA 和 OSWorld 在 5000 端口共用同一套控制 API(/screenshot、/platform、/setup/execute),接口一致,仅底层操作系统不同。
34、相关文档
·agr CLI 安装与配置
·agr CLI 命令参考
·agr CLI 常用操作示例
·ags-cli 开源仓库
·数据结构
·网络模式
·公共参数
·创建自定义沙箱