dsh-remote: Managing Remote SSH Servers by Hostname within DSH Sessions

前言

在 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 为空表示不限制,非空则仅匹配主机可用。

典型用法(工作流)

  1. 安装插件并重启 DSH,确认本机 ~/.ssh/config 或补丁里 hosts 已有所需主机名。
  2. 在 Remote Ops 页对目标主机做连接测试;需要时在 GUI 增删主机或设置 readonlyHosts / denyCommandPatterns。
  3. 在对话中让智能体按主机名执行只读命令(如 uname -a、读日志);变更类命令会弹出审批,通过后执行并在右侧 Remote Terminal 看到流式输出。
  4. 需要人工操作时打开 远程终端 面板选主机,或在主机列表点 连接 开专属对话;审计页可事后核对命令与会话记录。

具体工具名与参数以插件在会话中注册的 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。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye