在 ECS 上让 DSH 接住外部智能体,进程、审批与出网三处边界
在云主机上装 GDWhisper/dsh-ntr,最常见的误解是「装完就多了一个受控沙箱」。事实相反:插件只是把 DSH 的界面接到一个外部 agent 上,那个 agent 在自己的进程里跑,DSH 的文件沙箱对它没有作用力。所以 ECS 上的边界不在插件里,而在安全组、系统用户和目录权限这三层。
基本盘:125 星、npm 周下载 3,282(含 CI 与镜像,不是本站安装数)、综合分 59.6、Apache-2.0、Node ≥22.12.0。npm 上是 0.4.3,站内实装验证针对 v0.4.4,档位「已验证」L4:本站已在 dsh 0.2.2-rc.1 下真实安装成功;安全扫描「含敏感能力」104 处证据、尚无人工评估,那是能力清单不是风险结论。
一、先认清一台机器上有两个进程
NTR 是 Negotiated Target Routing(协商式目标路由):宿主 Agent 作为 ACP 客户端,和目标 Agent 协商能力与权限,把这一轮任务交给它执行。会话列表、输入框、侧栏、消息展示来自 DSH;推理、工具执行、文件读写、权限判断由你配的那个 agent 完成。插件只做一件事:把两边接通,把 agent 的输出原样画回界面。
这条链路在云上是两套生命周期。DSH 是常驻 Web 服务,挂了要重启;agent 是每会话一个子进程,由 AgentBridge 经 stdio JSON-RPC 拉起,空闲自退(默认 30 分钟)。ECS 监控里的 CPU 尖峰多半来自 agent 子进程,2C4G 实例上把空闲窗口调小比加内存更直接。
二、账号与目录:边界就画在这里
沙箱管不到 agent,就用操作系统来管。给 DSH 一个专用系统用户,agent 的 CLI 也装在这个用户名下,工作目录只给它需要的那一层,例如 /srv/agent-workspace。同一个 home 里不要放其它项目的密钥、不要挂载生产盘、不要留 ~/.ssh。
插件自己的规则正好可以当落点:会话的工作目录就是你在侧栏点开的那个目录,agent 的读文件、搜索、执行命令都在那里发生,进程也从那里启动。所以「侧栏点进哪个目录」本身就是一次授权动作。要让只读真的只读,靠的是文件属主而不是界面开关。
三、Node 22.12 是硬门槛,两个东西装同一个用户下
插件声明 >=22.12.0,ECS 镜像自带的那份往往低于这个数。更要紧的是 dsh 与 agent CLI 必须能互相看见:启动命令是一整行程序加参数(例如 codebuddy --acp),PATH 里找不到就是找不到,跨用户安装的典型症状是「测试」报找不到程序。
node -v # ≥22.12.0
dsh plugin --profile web add dsh-ntr@latest
dsh plugin 是 pnpm 转发器,--profile <name> 必填,Web 版走 web。插件是 bundle 形态,dsh.bundle.patch 声明了两层补丁(插件本体与 NTR 模式 preset),装完自动生效,不需要手改配置文件。
四、安全组:入站只留两条,出站按目的放行
入站只留两类:运维用的 22(源 IP 收在跳板机或堡垒机网段),以及反代端口。DSH 自己的端口不要对 0.0.0.0/0 开——它带会话、带文件浏览、带审批卡,挂在公网上等于把工作区交出去。出站别图省事全放。这条链路要出去的一共三类:装包时的 npm registry、agent CLI 调的官方 API、以及你确实要用的其它服务。按域名或地址段放到 443,其余拒绝,并留下日志——出事时能回答「这台机器在什么时候连过谁」。
还有一处容易漏:agent 的包不在 PATH 里时,配置项 npmPackage 会触发一次全局安装,那也是一次出站。registry 没进白名单,症状是握手一直转圈、最后超时,而不是给你一句「连不上」。
五、接入与握手:只信「测试」按钮
设置 → NTR → 在 Agent 列表里选预设或手填启动命令 → 点「测试」。它用当前表单的值拉起一次性进程做完整握手,不保存、不注册:成功显示 agent 名字与握手耗时,失败给 stderr 尾部。云上这步尤其重要,安全组挡了出站时,握手可能过、真跑起来才在认证处失败,只有 stderr 会讲实话。
握手过了再新建会话,模式选 NTR,在输入框行尾的 NTR 底座里选 agent,然后说话。一个会话锁定一个 agent,锁定后改不了,换人只能新建会话。
审批还有一个云上特有的细节:询问卡出现在对话里、输入框上方,选项是 agent 自己给的那些;设置页的「待处理权限请求」是跨会话镜像,对话没打开时也能在那里回答。值班的人看到一排待处理请求,说明 agent 卡在等人点头,不是机器挂了。
面板别直接对公网:要么安全组只放 VPC 网段靠跳板机进,要么前面挡一层反代并加认证。反代时必须关掉响应缓冲——浏览器半区经 /api/acp/stream 走 SSE,proxy_buffering 开着会把工具输出憋到最后一起吐。反代只解决「谁能打开面板」,不解决「agent 能碰什么」。
坑一 · 命令没带 @latest,之后怎么升都升不上去
现象:首装是旧版,之后反复安装、升级,版本号纹丝不动。
原因:不带 tag 时包管理器一直复用首次写入的版本号,update 也一样。
解决:命令写全 dsh plugin --profile web add dsh-ntr@latest,升级重跑同一条。
坑二 · 刚发布的版本「装不到」,其实是防范期
现象:上游明明发了新版,只输包名装到的还是旧的。
原因:DSH 的 npm 渠道有 24 小时防范期,24 小时内新版本不算「最新版」。
解决:把版本号一起写上(包名后接 @ 与版本号),或等防范期过去再装。
坑三 · Auto 权限档下每张工具卡都红
现象:工具卡全报错,可 agent 那边文件确实改了、命令确实跑了。
原因:宿主对 Auto 档的每次工具调用先跑一次实验性自动审查:读请求头 schema,再让会话模型判风险。NTR 会话的模型就是外部 agent,插件不转发宿主这段内部提示词,审查永远得不出结论。
解决:改用非 Auto 的权限档。这是宿主的闸门,插件绕不过去,也还没修好。
坑四 · DSH 设成只读,外部 agent 照样写文件
现象:把 DSH 的访问模式调到只读,agent 依然在自己的目录里落盘、改代码。
原因:agent 在独立进程里跑,DSH 的文件沙箱对它没有作用力;真正生效的是 agent 自己的权限模式,以及它发给你的那些审批。
解决:回到操作系统层——专用用户、目录属主、只读挂载;同时在 agent 的模式清单里挑保守档(例如 Always Ask、Plan),它来问你就答。插件不另设权限档,也不翻译选项名。
总结
三处边界合起来就是结论:别把「装了插件」当成「有了沙箱」。同类工具还有哪些,精选插件 Top 榜 按站内综合分排了一份。
适合与不适合
适合:已经把 agent CLI 装在 ECS 上、想在浏览器里统一接管的场景;多个 agent 分给不同同事、各自开会话的团队;面板只在内网或跳板机后可达的部署;出站有白名单要求、愿意按目的放行的环境。
不适合:指望装个插件就获得文件沙箱与权限隔离的人;需要多人共享同一个 agent 进程与上下文的用法;不愿在安全组和系统用户上花时间、只想先跑起来再说的场景。
标签:阿里云 ECS、ACP、进程边界、部署教程
本文由 DeepSeek Harness Hub 自动整理,数据来源于插件详情页。