前言¶
在 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)。
再做主机与工作区配置:
- 打开 Settings → Presence → New。
- 从
~/.ssh/config选择主机,或粘贴手动ssh命令。 - 选择远程文件夹;该文件夹会出现在工作区列表,侧栏、文件树、终端与 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 复用同一内核。