dsh-presence:用一条持久 SSH 把远程主机当本地工作区

前言

在 DSH 里让智能体操作远程机器,常见有两条路:每台主机都装一遍 agent,升级和代理要重复 N 次;或者本地 agent 每次 ssh host '<command>',握手开销大,也没有原生改文件、搜目录、开终端的连贯性。DeepSeek Harness 社区插件 Presence(fanrj3/dsh-presence)把 agent 留在本地,通过「每个主机一条持久 SSH 连接」延伸能力;远端只依赖系统自带的 sshd(SFTP、exec、PTY),无需在远程安装任何 Presence 组件。

这是什么

Presence 的定位是:Your SSH hosts, as local tabs——把 ~/.ssh/config 里的主机变成 DSH 侧栏里的工作区标签,文件树、编辑器、终端和工具调用都针对该远程目录。维护者为 fanrj3,npm 包名为 @rjfan/dsh-presence,当前资料中的版本为 0.19.0,许可证 MIT。分类属于 DSH 客户端插件;同一内核还提供独立 MCP 服务 presence-mcp,供未安装 DSH 插件的 Codex CLI、Claude Code、Cursor 等使用。

目录页:https://www.skillhub.cn/plugins/fanrj3/dsh-presence
源码:https://github.com/fanrj3/dsh-presence

核心功能

下面介绍 README 中已列出的能力,均建立在远程零安装前提下。

连接与语义

  • 连接池为每个主机保留一条持久连接,后续工具调用在同一条 SSH 上发请求,避免每次命令重新握手。
  • 读写在 SFTP 子系统完成;搜索与命令在远端 exec 通道执行(如 rg/grep、git),路径、权限与编码以远程为准。
  • 交互式终端走 shell 通道 + PTY,shell 运行在目标机上,而非本地。

工作区与编辑

  • 选定远程目录后,该目录成为普通 DSH 工作区:左侧文件树、编辑、agent 工具相对该路径解析。
  • 本地式编辑:presence_edit 支持 dry-run diff;原子写入、保留 mode、歧义拒绝、写前读保护等。
  • 远程工作区内 @ 补全索引远程机器上的文件(rg --files,必要时 find 回退),不是本地镜像。

文件与恢复

  • presence_mkdir / move / copy / chmod 及文件树右键菜单;删除可走可恢复的 presence_trash。
  • 破坏性 shell 命令会先 dry-run;统一 diff 可对比两个远程文件或远程与本地文件;面板可跟随远程日志而无需常驻 tail -f。

端口与通知

  • 端口转发可保存并在重连后自动恢复;Ports 面板可发现新监听端口并一键转发。
  • 后台任务结束有 toast(及可选桌面通知),可配置本地 notifyCommand。

工具规模

  • DSH 插件暴露 24 个工具;presence-mcp 提供 20 个核心工具,与插件共享同一内核。

README 中在 Linux 主机上测过:单次 ssh host '<cmd>' 约 520–540 ms;Presence 首次连接(密钥)约 145 ms;同任务相对裸 ssh/scp 的端到端时间对比见仓库文档中的 trajectory 图(具体数值以 README 为准)。

安装与启用

先做插件安装。官方 Quick start 给出的 npm 安装命令为:

dsh plugin add @rjfan/dsh-presence@0.19.0

若从源码目录安装(非 git clone 场景下的本地路径),资料中为:

dsh plugin add /path/to/dsh-presence

package.json 要求 Node >= 22.19.0,并依赖 @deepseek-ai/dsh-fs、dsh-tools 等 peer 包(版本范围见仓库 package.json)。

再做主机与工作区配置:

  1. 打开 Settings → Presence → New。
  2. 从 ~/.ssh/config 选择主机,或粘贴手动 ssh 命令。
  3. 选择远程文件夹;该文件夹会出现在工作区列表,侧栏、文件树、终端与 agent 工具均使用该远程目录。

典型用法

端口转发(README 示例)

You: 把远程 8000 端口转发到本地,然后打开看看
Agent: presence_forward { remotePort: 8000 }
       → http://127.0.0.1:8000

独立 MCP(无法装 DSH 插件时)

npx -y presence-mcp

Claude Desktop / OpenCode 风格配置示例(环境变量指定主机与工作区):

{
  "mcpServers": {
    "presence": {
      "command": "npx",
      "args": ["-y", "presence-mcp"],
      "env": {
        "PRESENCE_HOST": "server",
        "PRESENCE_WORKSPACE": "server:/srv/app"
      }
    }
  }
}

Codex TOML、Claude Code、Cursor/Windsurf 等更多示例见仓库 mcp/README.md。

架构简述

┌───────────────────────────────┐
│  DSH plugin  /  MCP server    │  two shells, one kernel
└──────────────┬────────────────┘
               │
        Presence kernel
        ├── ssh-config   hosts, ports, users, keys, jumps from ~/.ssh/config
        ├── connection   one persistent connection: SFTP / exec / PTY + pool + cancel
        └── host pool    one connection per host, created on demand, idle-collected
               │
        SSH (your existing keys, known_hosts, jumps, proxies)
               │
        target: Linux / macOS, stock sshd
Agent 操作 通道 远程依赖
read / write / edit / list / stat SFTP sftp-server(sshd 自带)
exec、搜索、git exec 主机上已有命令
交互终端 shell + PTY 主机登录 shell

适用场景与注意

适合谁

  • 已有 SSH 密钥与 ~/.ssh/config、需要在多台 Linux/macOS 上跑 coding agent,但不想在每台机器安装 DSH 或 agent 运行时。
  • 希望 DSH 内原生改远程文件、开远程终端、做端口转发,并保持会话连续性的开发者。

使用前注意

  • 插件在 当前 DSH 进程权限 下运行,通过你的 SSH 身份访问远程;安装前建议阅读 GitHub 仓库 源码与 MIT 许可证,确认主机与密钥策略符合你的安全要求。
  • 远程仅保证 sshd 与常规 shell 工具;搜索依赖主机上的 rg 或 grep 等,需自行保证目标环境具备。
  • README 提到保持 TCP_NODELAY,否则 SFTP 请求/响应可能受 delayed ACK 影响(p95 latency 会明显升高)。
  • SkillHub 上的插件目录为社区站点,与 DeepSeek / 幻方无官方从属关系;DSH 生态以「一切皆插件」为思路,Presence 是其中的 客户端 类 SSH 远程工作区方案。

结尾

Presence 把「每台装 agent」和「每次 ssh 一条命令」之间的折中做成了:本地 agent + 每主机一条 SSH + 远端零安装。若你的日常开发已经围绕 SSH 配置展开,可以用上述安装命令接入 DSH,或在其他 agent 里通过 presence-mcp 复用同一内核。

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

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

Xiaoye