为什么做这个插件
我现在用 AI Agent(DeepSeek Harness,下称 DSH)管理自己的服务器。Agent 能通过 SSH 在远端执行命令,但每次执行,我在聊天界面里看到的只是一坨 JSON 工具调用——命令到底跑了什么、输出是什么、有没有超时、连接还活着吗,全得靠翻记录。服务器操作一多,这就成了一个黑盒:出了问题分不清是命令失败还是连接断了,长时间任务跑到哪一步也看不见。
于是我写了 DSH Agent SSH Dashboard:Agent 继续负责执行,人类得到一个只读的、可以逐层下钻的看板。
它是什么
一个 DeepSeek Harness 插件,给 Agent 提供一组 SSH 工具,同时在 Web 界面上加一块「SSH 会话」看板:
ssh_session_open—— 创建或重新打开逻辑会话(只登记连接参数,首次执行命令才真正握手验证)ssh_bash—— 通过本地 OpenSSH 在远端执行bash -s --,标准输出、标准错误、远端退出码、本地 SSH 进程退出码、超时状态全部分开记录ssh_task_start / status / stop / list—— 长任务的异步启动、轮询、终止与清单(后台 nohup + PID 文件跟踪)ssh_sessions / ssh_session_close—— 列出全部会话与统计、正常关闭会话
看板长什么样

一个逻辑会话一张卡片,卡片左边有一条状态色带。卡片表达的是「连接生命周期」,而不是命令成败:
| 状态 | 含义 |
|---|---|
ready |
已登记连接参数,等待首次命令验证连接 |
healthy |
最近一次 SSH 传输正常完成(内部命令可以成功也可以失败) |
running |
正在执行命令 |
closed |
Agent 正常关闭了会话 |
error |
明确的认证、DNS、主机密钥、网络或 SSH 传输故障 |
点开一张卡片,是逐轮的「Agent 命令 → 远端响应」对话视图:标准输出和标准错误分段展示,失败信息(分类 + 摘要)单独成块,每条命令可以一键下载完整输入输出,整个会话也能整体导出为文本。异步长任务另有任务卡片,显示 PID、运行时长和最新消息。
一个关键设计:命令失败不会把会话卡片标红。命令失败 ≠ 连接失败——
ls 一个不存在的路径返回非零很正常,而认证失败、DNS 解析失败才是连接问题。把两者混在一起,看板很快满屏红,失去信息量。插件把「连接生命周期」和「单命令结果」拆成两层语义,失败只计入统计,连接出问题才亮红。
安全考虑
- 人只读,Agent 执行:看板不给人类任何输入通道,所有远端操作都走 Agent 的工具调用,受 DSH 的审批策略约束
- 私钥路径不出现在看板里,也不出现在
ssh_sessions的返回中 - 首次连接默认 OpenSSH
accept-new策略;生产环境建议显式strict并预先维护known_hosts
安装
git clone https://github.com/dkvkvk/dsh-agent-ssh-dashboard.git cd dsh-agent-ssh-dashboard npm run check dsh plugin --profile desktop add link:.
完整退出并重启 DSH Desktop,确认启动页包含 agent-ssh-dashboard 就装好了。之后直接对 Agent 说人话:
- 「打开 SSH 会话
prod,主机 server.example.com,用户 deploy」 - 「在 prod 上执行
uname -a && df -h」 - 「列出所有 SSH 会话及命令统计」
- 「关闭 prod 会话」
链接
仓库地址:github.com/dkvkvk/dsh-agent-ssh-dashboard(MIT 协议,含架构文档、Tool API 文档与测试)。如果你的 Agent 也天天在服务器上跑活,欢迎试试,有想法随手开 issue。


