阿里云 ECS 上给 dsh-remote 备一台可连接的远端
dsh-remote 把远端目录变成 DSH 工作区,但它的前置条件全在远端:能 SSH、node 够新、dsh 能起。这篇按 ECS 的实际操作顺序写,从安全组到私钥,把五个最常见的卡点写清。
一、实例与系统:够用就行,但别选最小规格
这个插件不要求 GPU,也不吃大内存,但它会在远端跑 dsh、跑构建、跑同步。实际经验是:1 核 2G 的突发性能实例能装能连,但一跑 npm ci 就开始卡,同步大目录时更明显。2 核 4G 是更实际的下限。
系统选常见发行版即可。需要注意两件与插件直接相关的事:
- node 版本必须 ≥ 20.12。dsh 启动要用
node:util的parseEnv,这个导出从 20.12 起才有。 - 不要用 dsh 0.1.0-rc.6。它依赖的
node-pty@1.1.0没带linux-x64预编译产物,会报Failed to load native module: pty.node,dsh web在 Linux 上根本起不来。要 0.1.5-rc.2 及以上。
第二条是 Linux 专属坑,很多人在 macOS 上试通了,搬到 ECS 才发现起不来。
二、安全组:只放行你真正需要的
默认只需要放行 22。如果你把 SSH 端口改成了别的(比如 2222),安全组必须跟着改——这是坑二的常见形态。
不需要为「远程 DSH 界面」额外开放任何端口:插件是本地主动连出去,远端那个 dsh web 只监听 127.0.0.1,端口经 SSH 隧道搬回本机。
不建议把 22 开放给 0.0.0.0/0。至少限定到你的出口 IP 段;有堡垒机的走堡垒机。
三、账号与私钥:别直接给 root
建一个普通账号,只授予必要目录的权限:
useradd -m -s /bin/bash dev
mkdir -p /srv/app && chown -R dev:dev /srv/app
然后在本地生成一对专用密钥,公钥写进 ~dev/.ssh/authorized_keys,私钥留在本机并收紧权限:
chmod 600 ~/.ssh/id_ed25519_dsh_remote
插件配置里用 privateKeyPath 指向它。私钥如果带 passphrase,插件里对应的 passphrase 也要填。
为什么不用 root:插件有 rw_exec 与 rw_remove,一旦模型误判,代价按你给的权限算。README 的安全提醒原话是「把凭据交给插件等于允许 Agent 以你的用户身份在该主机执行 shell 命令」——这句话在 ECS 上尤其要当真。
四、体检与部署:先只读,再动手
连接配好后,第一件事是点「远端 dsh 体检与部署」的体检。它只读,会报:平台、node / npm / dsh 版本、原生模块能否启动、是否认识 --no-open、代理与 npm 源。
判读很简单:
- node < 20.12 → 先升 node;
- 原生模块起不来 → 大概率是 node-pty 的预编译缺失,升 dsh;
- npm 源慢 → 体检会报当前源,换个近的。
只有体检判定「需要且可以自动装」,才会出现部署按钮。它装到 ~/.dsh-remote/dsh(webInstallPrefix 可改),不写系统目录、不改 PATH、不覆盖你在用的版本。删目录即回滚——这点在云上很重要,因为你随时可以把实例释放掉重来。
五、五个真实卡点
坑一 · ECS 的 Node 版本没到 20.12
现象。 连接成功、插件也装上了,但远端 dsh web 起不来,日志里是 does not provide an export named 'parseEnv'。
原因。 dsh 启动要用 node:util 的 parseEnv,该导出从 node 20.12 才有。npm 安装时只给 EBADENGINE 警告,不会拦住。
解决。 用 nvm 或系统包升到 20.12+,再重跑体检。体检会直接把它标成 blocker。
坑二 · 安全组只放行了 22 却改了端口
现象。 本地 ssh 也连不上,插件报连接超时,但实例是运行中的。
原因。 port 改成非 22 之后,安全组入方向仍只放行 22。
解决。 安全组加一条对应端口的规则,源地址限定到你的 IP。改完先用本地 ssh -p <port> 验证,再回插件里试。
坑三 · 远端 dsh 不在登录 PATH
现象。 体检说 dsh 已安装,但「远程 DSH 界面」一直拿不到启动令牌。
原因。 非交互式 SSH 会话的 PATH 与登录 shell 不同,dsh 可能装在 nvm 或私有前缀里,插件按 webAttachCommand(默认就是 dsh)找不到。
解决。 在机器卡片的「高级 → 远端 dsh 命令」填绝对路径,例如 ~/.nvm/versions/node/v22.19.0/bin/node ~/.dsh-remote/dsh/node_modules/@deepseek-ai/dsh/lib/bin.js。机器级配置优先于全局。
坑四 · 私钥权限过宽被拒
现象。 认证失败,但用户名和公钥都对。
原因。 OpenSSH 系对私钥权限敏感,644 会直接被拒。
解决。 chmod 600。用 useAgent(SSH_AUTH_SOCK)也能绕开文件权限问题,但要把 key 提前加进 agent。
坑五 · 直接给 root 账号
现象。 一开始很顺,直到某次 Agent 执行了一条 rw_remove 或带 sudo 语义的命令。
原因。 插件的能力是按「你给的账号权限」生效的,root 意味着没有护栏。
解决。 换普通账号、限定目录、开 auditLog(默认就是 true),并把 hostKeyMode 从 accept-new 改成 verify。
六、跑通的最小验收
rw_connect成功,rw_info能看到远端上下文;rw_list_dir("/srv/app")有内容;rw_sync异步任务完成,本地镜像能看到文件;rw_exec("node -v")返回 ≥ v20.12;- 可选:远程界面能打开,且远端没有新增监听端口。
五步全过,这台 ECS 才算「可连接的远端」。
总结
ECS 侧的失败几乎都落在「node 版本、安全组、PATH、私钥权限、账号权限」这五处,而且都能在体检里提前看到。
适合与不适合
适合:准备在阿里云上长期放一台开发机的人;已经买好 ECS 但连不上的人;需要给团队一份标准化开通流程的人。
不适合:只想临时跑一条命令的人(用 ECS 控制台的远程连接更省);不愿意管密钥与安全组的人;需要 GPU 任务的人。
标签:dsh-remote、DeepSeek Harness、阿里云、ECS、SSH
本文由 DeepSeek Harness Hub 自动整理,数据来源于插件详情页。