DSH Web GUI 多服务器 SSH 终端面板:浮动终端窗口支持标签页、并排组合、广播、宿主侧持久会话,以及密码/私钥/SSH Agent 认证。
安装
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:JUNQINGV587/dsh-ssh-hub
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
DeepSeek Harness(DSH)Web GUI 的多服务器 SSH 终端面板插件。
集中管理一批 SSH 服务器,在 DSH 会话里同时打开多个交互式终端——相当于把轻量级多标签 SSH 客户端内建进 DSH。终端住在可自由拖动的 终端浮窗(shell.overlay)里,配合并排 组合 一次盯住多台服务器。
特性
- 🪟 终端浮窗:一个浮动在整个 GUI 之上的终端窗口(Ctrl+Shift+` 或左栏「SSH 终端」按钮打开)。拖标题栏移动(不会拖出屏幕)、右下角缩放、双击最大化、Esc 逐级退出放大/最大化(收起窗口请用 ✕)。打开有轻动画(尊重系统「减弱动态效果」);窗口失焦时只淡化窗框——终端输出始终清晰可读
- 🗂️ 标签 = 会话:一个标签页就是一个全窗口会话;标签栏切换(Alt+1-9,F2 重命名,Alt+t 新建)
- 🧱 组合并排:点「新建组合」勾选会话即并排;把标签拖到另一标签上合并成组、拖到组合标签上追加成员;连新服务器可选「加入当前」直接并入当前组合;拖分隔线调比例;块可放大(Alt+m)占满窗口;组内拖成员排序(前/后/互换),拖到标签栏变回独立标签;组合的 ✕ 解散回各会话标签
- 📋 会话面板:窗口右上「会话」按钮打开全局会话视口——所有会话(含后台未放置的)照常运行,行内可放入当前组合 / 开新标签 / 终止(两次点击确认),并显示回收倒计时
- 📡 广播:在组合里点「广播」,点选要下发的成员,输入一次命令按 Enter——发送到所有选中成员的 shell(接收端短暂闪烁)
- ♻️ 会话宿主化:关闭窗口、移除视图、刷新页面、切换对话都不会杀掉你的 shell;重连回放近期输出、网络抖动自动重连;无查看者的会话默认 30 分钟后回收(可在设置卡调整),状态条可见倒计时;DSH 重启后窗口为空时,状态条出现「恢复上次布局」一键重开
- 🎹 Wave 风格快捷键可配置:Alt 系 Wave 预设(Alt+t 新标签、Alt+w 关闭聚焦块 / 组合内移除聚焦成员、Alt+Shift+w 关闭标签 / 组合内解散、组合内 Alt+1-9 聚焦成员、Alt+m 放大);全部动作可在 设置 → 插件 → 插件配置 → DSH-SSH-HUB → 快捷键 修改(格式校验、DSH 冲突提示、即时生效)
- 🔑 四种认证方式:密码、私钥(支持 passphrase)、SSH Agent、无认证(本机免密)
- 🚀 连接测试:保存服务器前可先测试(连通性 + 认证 + 延迟);连接失败在窗口内给出分类原因与「重试 / 编辑服务器」操作,而不是原生弹窗
- 🎨 主题自适应终端:终端跟随 DSH GUI 的浅色/深色主题(主题服务缺失时回退到系统
prefers-color-scheme);工具栏循环按钮可固定 跟随界面 / 深色 / 浅色(按浏览器记忆)。已打开的终端原地热切换。两套调色板均满足 WCAG 对比度门槛(前景/背景 ≥ 7:1,ANSI 色 ≥ 4.5:1),由npm test强制校验 - ⚙️ 设置卡片(DSH ≥ 0.1.0-rc.7):在 设置 → 插件 → 插件配置 中设置默认连接超时、Keepalive 间隔、主机密钥校验、终端主题与会话回收时长;字段留空的服务器继承默认值(服务器设置 > Server Default > 内置常量)
- 🔒 密钥安全处理:密码与私钥仅落盘于 DSH 数据目录(
0600权限),API 永不回传明文;编辑时留空则保留原值 - 🧪 完整后端集成测试(对接真实 SSH 服务端)
环境要求
- DSH Web GUI 在本机运行(在 dsh ≥ 0.1.0-rc.7 上测试通过)。Server Defaults 设置卡片需要
0.1.0-rc.7+;旧版本上面板功能完全不变,只是没有设置卡片 - Node.js ≥ 20(DSH 运行时自带)
- 目标服务器需允许 DSH 所在机器通过 SSH 登录
安装
从 GitHub 仓库安装(推荐):
dsh plugin --profile web add github:JUNQINGV587/dsh-ssh-hub
Git 源安装会现场构建包,而 pnpm 默认拦截构建脚本。若安装时报 "Ignored build scripts" 错误,把 pnpm 打印的构建 key 加到 profile 的
pnpm-workspace.yaml的allowBuilds下,再重新执行安装。
或从 npm 安装(发布后可用):
dsh plugin --profile web add dsh-ssh-hub
或从本地源码安装:
dsh plugin --profile web add /path/to/dsh-ssh-hub
安装后重启 DSH、刷新浏览器,即可使用终端面板。
使用方法
点左栏底部的 SSH 终端,或按 Ctrl+Shift+` 打开终端浮窗(居中,记住位置与大小)。双击标题栏最大化,Esc 逐级退出放大/最大化(收起请用 ✕);拖标题栏移动(不会拖出屏幕)、右下角手柄缩放。
点 管理服务器 → 添加服务器,填写:
字段 说明 名称 显示名,如 prod-db-1主机 IP 或域名 端口 SSH 端口,默认 22用户名 SSH 登录用户 认证方式 password/privateKey/SSH Agent/none密码 / 私钥 密钥字段;编辑时留空 = 保留原值 远程初始目录 可选,登录后进入的远程目录 连接超时 可选,单位秒;留空 = 继承全局默认(默认 15 秒) Keepalive 间隔 可选,单位秒, 0为禁用;留空 = 继承全局默认(默认 30 秒)严格主机密钥校验 继承全局默认 / 开启 / 关闭;开启要求 known-hosts 条目 保存前可点 测试连接 验证。
开会话:点窗口标签栏的 新会话 按钮选服务器——会话作为自己的标签页打开(选「加入当前」则并入当前组合);也可用 会话 面板,或在 管理服务器 抽屉里点/双击某行。空窗口会按你的状态给引导:无服务器 →「添加第一台服务器」;有服务器无会话 →「新会话」;有后台会话 →「打开会话面板」。
同时盯多台:点 新建组合,勾选会话即并排;把标签拖到另一标签合并成组、拖到组合标签追加成员;连新服务器时选 加入当前 直接并入当前组合;拖分隔线调比例;组内拖成员排序(前/后/互换)、拖到标签栏变回独立标签;悬停块可放大(Alt+m)占满窗口。组合的 ✕ 解散回各会话标签。
没在盯的会话:关标签只是移除视图——会话继续在宿主端运行(会有轻提示),并在 会话 面板里可见。在面板里可 放入当前 / 新标签 放回,或 终止(两次点击确认);后台会话显示回收倒计时。
输入命令、选择即复制、右键粘贴。终端主题:工具栏 跟随界面 / 深色 / 浅色 循环切换,按浏览器记忆,立即作用于所有终端。
shell 不会死:关闭窗口、移除视图、刷新页面、切换对话都只是 UI 脱离——会话在宿主端继续跑,重连回放近期输出、网络抖动自动重连。真正结束会话:在 会话 面板里 终止(或删除服务器)。无查看者的会话默认 30 分钟后回收,时长可在设置卡调整,状态条可见倒计时;DSH 重启后窗口为空时,状态条出现「恢复上次布局」一键重开。
快捷键可配置:设置 → 插件 → 插件配置 → DSH-SSH-HUB → 快捷键(开关窗口 / 最大化 / 新标签 / 关闭块 / 关闭标签 / 放大)。带格式校验、DSH 冲突提示(不阻止),保存即生效。
DSH ≥ 0.1.0-rc.7 时,同一张卡片可设置 Server Defaults 默认值——包括浏览器本地覆盖为「跟随界面」时使用的默认终端主题。卡片上的 管理服务器… 一键直达窗口的服务器抽屉。
换新机器?在管理服务器对话框用 导出配置 / 导入配置。导出的 JSON 不含任何凭据——导入后请逐台重新填写密码/密钥。导入一律新增条目,绝不覆盖现有服务器。
安全说明
- 凭据以明文存储在
$DSH_HOME/plugin-data/ssh-hub/servers.json(默认~/.dsh/…),文件权限0600。文件权限是唯一防线——不要把这个文件提交、同步或备份到任何不能接受明文凭据的地方。机器密钥加密曾被考虑并否决:同用户进程反正能读到密钥(见docs/adr/0001-credential-security-posture.md)。 - 切换服务器的认证方式会从磁盘删除上一认证方式的凭据(如切到
SSH Agent会清除已存密码)。 - REST API 永不返回密码或私钥,只返回
hasPassword/hasPrivateKey标记;导出文件同理。 - 终端 WebSocket 做了同源校验:跨源页面无法连接会话。
- 连接遵循服务器的 host key 策略(
strictHostKey默认关闭,或按你设置的 Server Default;需要更严格校验可开启)。 - 这是受信插件:它会在你配置的服务器上执行任意 shell 命令。请确保 DSH Web 的访问受控。
开发
npm install
npm run build # 产出 lib/index.js(host)+ lib/client.js(client)+ lib/client.css
npm test # 集成测试(对接本地测试 sshd,见 tests/)
工作原理
- host 半(
src/host/):cordis 插件(inject: ['webServer']),暴露/ssh-hubREST API 与按会话注册的 WebSocket upgrade 路由;SSH 走ssh2。Terminal Session 宿主化:脱离任何客户端照常存活,携带滚动环形缓冲(重连回放),无查看者按回收时长回收(默认 30 分钟,可配置;src/host/registry.ts、src/host/scrollback.ts)。全局 条目集合(标签与平面组合)由/ssh-hub/workspace提供、/workspace/events广播;会话死亡时宿主移除所有对应条目。 - client 半(
src/client/):预构建 React bundle;终端浮窗渲染进shell.overlay槽位(全框面、root scope),左栏入口注册在sidebar.footer.action。平面组合(src/shared/group.mjs)与快捷键解析(src/shared/keybind.mjs)是纯 DOM-free 模块。终端模拟器用@xterm/xterm。 - 数据流:
xterm → ws → ssh2 stream → 远端 shell,输出原路返回。窗口态与最大化态可同时 attach 同一批会话(多客户端广播)。
集成测试
tests/integration.mjs 会启动一个 DSH 服务 mock(HTTP + WS)、挂载插件,并驱动一个真实 SSH 会话(默认 127.0.0.1:2222,密钥认证)。可用 SSH_TEST_HOST / SSH_TEST_PORT / SSH_TEST_KEY 覆盖。测试 sshd 的 CI 就绪搭建脚本见 scripts/setup-test-sshd.sh。
npm test 会先跑 scripts/check-contrast.mjs(两套 Terminal Theme 的 WCAG 对比度门槛,见 docs/adr/0002-adaptive-terminal-theme.md)与 scripts/check-group.mjs(平面条目集合规则),再跑集成测试。
License
MIT © JUNQINGV587
链接
同类插件
zhu1090093659/dsh-web#packages/dsh-remote-web-ui★ 8296
手机/PC 远程操控 dsh web 工作区:扫码配对、令牌门控通道、SSE 实时同步,提供移动端与完整桌面 GUI 两种远程形态。
zhu1090093659/dsh-web#packages/dsh-ssh★ 8296
SSH 远程运维面板:Web 终端、SFTP 传输、本地端口转发与一条命令并发集群执行,Agent 与面板共用同一份主机配置。
saya-ch/dsh-mobile★ 356
通过 Android App 或手机浏览器访问 DeepSeek Harness,支持安全局域网连接、远程访问、持久设备配对和可自定义移动界面。
ZSeven-W/dsh-ios★ 309
在对话里直接操作 iOS 模拟器或 USB 连接的 iPhone:22 个 Agent 工具用于启动、构建、按无障碍标识或 OCR 文本驱动 UI、列表行操作与 SwiftUI 预览热重载,并附带可点击拖拽的流式侧边栏面板。
liguobao/ds-harness-remote★ 254
DeepSeek Harness 多端远程访问:从手机、平板、浏览器或另一台电脑继续进行中的会话,端到端加密通道(Noise IK + 自适应 Relay/WebRTC 传输),设备授权管理;远程端仅开放 ApiProxy 能力,支持 dsh-file-viewer 只读文件预览,不提供 Shell、远程桌面或写入权限。
wenbin-wb/dsh-bridge★ 181
DeepSeek Harness 远程与移动端接入插件:提供局域网扫码直连、Cloudflare 与自建公网隧道,以及微信、QQ、飞书、Telegram 机器人交互,内置安全认证与访问控制。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。