前言¶
在 DeepSeek Harness(DSH)里做运维或排查时,智能体往往只能改本地工作区,无法像你平时 ssh prod-web-1 那样在真实主机上取证、执行命令或改配置。把密钥和 ~/.ssh/config 交给模型又担心误删、误重启。下面介绍的 dsh-remote(维护者 aide-family)把远程 SSH 操作做成 DSH 插件:主机发现、远程执行、SFTP 读写、持久 shell,并在每次可能改动的动作前做静态命令风险审查与人类审批,思路来自同团队的 Crescent 运维工作台。
这是什么¶
dsh-remote 是面向 DSH 的 SSH 远程服务器操作插件。它在会话中让智能体可以:列出你在 ~/.ssh/config(含 Include)里已配置的主机、探测连通性、运行非交互命令、通过 SFTP 读写远程文件、在工作区与服务器之间传文件;对会改变系统状态的命令,先经 Crescent 风格的静态分类器审查,再通过 DSH 审批对话框由人放行。
运行环境要求:DSH >= 0.2.1-rc.5(Desktop 与 dsh CLI 已捆绑)、Node.js ^22.19.0 || >=24.0.0(DSH 已捆绑)。目标机需具备 SSH 访问能力(密钥、ssh-agent,或通过环境变量提供的密码);插件会尊重 HostName、User、Port、IdentityFile、ProxyJump 等配置。
核心功能¶
主机与连接¶
- 自动发现
~/.ssh/config中的具体Host条目,并与插件配置里的补充主机列表合并;模型按名称引用主机,与ssh <name>一致。 - Remote Ops 管理页为 DSH Web GUI 一级面板:展示主机清单(每行可读连接测试)、进行中的远程 shell 会话(滚动预览与关闭)、近期远程操作审计。
- 主机管理器:在 Remote Ops 页增删改连接项,持久化在
$DSH_HOME/remote/hosts.json;认证信息只存环境变量名,不存明文密钥。 - 主机行上的 审计 可查看该主机的命令与终端会话历史;连接 可一键建会话、开新对话并挂上原生终端,把主机交给该对话里的智能体。
远程执行与文件¶
- remote exec:单次非交互命令,支持工作目录、超时、输出上限,结果带
[exit code: N]。 - SFTP:按行号分页读取、列目录、原子写入(临时文件 + rename)、精确字符串编辑、上传/下载。
- 持久 remote shell(
remote_shell_*):交互 PTY,跨工具调用保持;提交每一行与remote_exec一样做风险审查。
终端与可视化¶
- 对话右侧 Remote Terminal 标签:智能体执行的远程命令实时镜像 stdout/stderr 与状态行,首次远程命令时自动打开。
- 远程终端 面板:选择主机后通过本地中继 attach DSH 原生 xterm,关闭标签可重连同一会话,SSH 断线自动 backoff 重连。
- 主机列表 复制连接命令:原生终端不可用时仍可复制等价 shell 命令。
安全与策略¶
- 命令风险审查:静态分类器区分只读(
low)、明确变更(high)、未知(gray);理解 shell 列表、sudo/env/nohup等包装、sh -c/ssh/kubectl exec内层、find -delete、sed -i、docker/kubectl/systemctl子命令及引号。 - 审批策略
policy:auto(只读直接跑、变更需审批)、always、never(无审批则 fail-closed)。默认下仅分类器能证明为 mutating 的命令才弹审批;只读与无法证明但非 mutating 的命令(如curl、awk)可直接执行;readonlyHosts、allowHosts、denyCommandPatterns等更严规则仍生效。 - 硬限制:单主机只读锁、主机白名单、命令 deny 模式、输出/传输上限、TOFU 主机密钥校验(
knownHostsPolicy: tofu | strict | insecure)。
安装与启用¶
插件当前版本 0.5.2(MIT)。从 npm 安装(发布后):
dsh plugin --profile desktop add dsh-remote --ignore-scripts
本地开发包可用 tarball 安装(README 示例版本号与仓库一致):
npm run pack:plugin
dsh plugin --profile desktop add file:$PWD/dist/dsh-remote-0.5.2.tgz --ignore-scripts
使用 pnpm 11 时必须加 --ignore-scripts,以避免 ssh2 可选原生构建脚本触发工具链要求;纯 JS 实现可正常工作。不要用 link: 指向仓库外目录安装开发检出,DSH 无法正确解析 @deepseek-ai/* 依赖。
安装完成后完全退出并重启 DSH Desktop(或重启你安装到的 CLI profile),新 bundle 才会加载。卸载:
dsh plugin --profile desktop remove dsh-remote
配置要点¶
设置在 profile 补丁里插件行 dsh-remote 的 config 下。Desktop 默认补丁路径为 ~/.dsh/profiles/desktop/cordis.patch.yml;无头或 CI 可用 --patch 覆盖。
- id: dsh-remote
config:
hosts:
- name: prod-web-1
host: 10.0.0.11
port: 22
username: ops
identityFile: ~/.ssh/prod_ed25519
tags: [prod, web]
description: primary web node
- name: legacy-db
host: 10.0.0.31
username: dba
passwordEnv: LEGACY_DB_SSH_PASSWORD
policy: auto
readonlyHosts: ["prod-*"]
allowHosts: []
denyCommandPatterns: ["\\b(shutdown|reboot|mkfs)\\b"]
connectTimeoutMs: 20000
execTimeoutMs: 120000
maxOutputBytes: 200000
maxReadBytes: 800000
maxTransferBytes: 52428800
knownHostsPolicy: tofu
unprovenCommands: allow
hosts 中勿写明文密码,只写持有密码的环境变量名(如 passwordEnv)。readonlyHosts 匹配的主机拒绝一切 mutating 操作;allowHosts 为空表示不限制,非空则仅匹配主机可用。
典型用法(工作流)¶
- 安装插件并重启 DSH,确认本机
~/.ssh/config或补丁里hosts已有所需主机名。 - 在 Remote Ops 页对目标主机做连接测试;需要时在 GUI 增删主机或设置
readonlyHosts/denyCommandPatterns。 - 在对话中让智能体按主机名执行只读命令(如
uname -a、读日志);变更类命令会弹出审批,通过后执行并在右侧 Remote Terminal 看到流式输出。 - 需要人工操作时打开 远程终端 面板选主机,或在主机列表点 连接 开专属对话;审计页可事后核对命令与会话记录。
具体工具名与参数以插件在会话中注册的 DSH tools 为准,行为与 README 中 remote_exec、SFTP、remote_shell_* 描述一致。
适用场景与注意¶
适合已在 DSH 里用智能体做远程排查、批量只读巡检、在审批下执行有限变更的场景;与现有 SSH 配置和 jump 拓扑兼容,不必 duplicate 一套主机清单(仍可 YAML 补充未写入 config 的主机)。
插件以当前 DSH 进程的用户权限运行,能读到的密钥、能连的主机与你在本机用 SSH 的能力一致;安装前应阅读 GitHub 仓库 源码与 MIT 许可证,确认策略字段符合组织安全要求。社区目录 SkillHub 插件页 与 DeepSeek / 幻方无官方从属关系,仅作发现与链接用途。
结尾¶
dsh-remote 把「按主机名、一次一个边界动作、变更前审查与审批」落到 DSH 插件里,并补上 GUI 主机管理、实时终端镜像与审计。进一步了解与安装说明见 SkillHub 目录页 与 GitHub:aide-family/dsh-remote。