🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

SSH 远程工作区 CrazyShout/dsh-ssh-remote

DeepSeek Harnessv0.1.5
CrazyShout4 天前有提交已提供中文文档扫描:含敏感能力

dsh-ssh-remote — 远程工作区,就在手边。

44.6/100
综合分
14
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/31 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查有告警:npm 同名包「dsh-ssh-remote」归属 kkutysllb/dsh-kylin-ssh-tunnel,装到的可能不是本插件。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add CrazyShout/dsh-ssh-remote
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · market
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 4 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意

npm 同名包「dsh-ssh-remote」归属 kkutysllb/dsh-kylin-ssh-tunnel,装到的可能不是本插件

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-ssh-remote @ 0.1.5
✓Node 引擎要求 >=22 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/1 07:01:55

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 48 处,展示前 48 条)
  • 发起网络请求
    lib/client.js:3696
    cache?.request(requested.values());
  • 发起网络请求
    lib/client.js:5646
    constructor(sessionId, remote, fetcher = (...args) => fetch(...args)) {
  • 读取本地文件
    lib/ssh-config.js:58
    if (!existsSync(configPath))
  • 读取本地文件
    lib/ssh-config.js:71
    text = readFileSync(absolutePath, 'utf8');
  • 读取本地文件
    lib/ssh-config.js:99
    if (!existsSync(configPath))
  • 执行外部命令固定命令
    lib/ssh-config.js:185
    execFile('ssh', ['-G', '-F', configPath, alias], { encoding: 'utf8', timeout: 5_000, maxBuffer: 1024 * 1024 }, (error, stdout, stderr) => {
  • 读取本地文件
    lib/ssh-config.js:302
    return statSync(path).isFile();
  • 读取本地文件
    lib/registry.js:149
    configExists: existsSync(configPath),
  • 执行外部命令来自配置/变量
    lib/port-forwards.js:108
    const worker = entry.worker = this.options.forkWorker?.() ?? fork(fileURLToPath(new URL('./port-forward-entry.js', import.meta.url)), [], {
  • 读取本地文件
    lib/updates.js:41
    const runningVersion = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')).version;
  • 读取本地文件
    lib/updates.js:79
    const manifest = JSON.parse(readFileSync(join(this.owner.profileContext.dir, 'package.json'), 'utf8'));
  • 读取本地文件
    lib/ptc-router.js:83
    const bytes = readFileSync(path);
  • 读取本地文件
    lib/helper/installer.js:36
    let content = readFileSync(path);
  • 读取本地文件
    lib/helper/installer.js:42
    const source = readFileSync(join(dirname(path), `${name}.py`), 'utf8');
  • 执行外部命令来自配置/变量
    lib/helper/installer.js:89
    execFile(sshBinary, [
  • 读取本地文件
    lib/anchors.js:9
    if (existsSync(absolute))
  • 读取本地文件
    lib/anchors.js:25
    if (!existsSync(file))
  • 读取本地文件
    lib/anchors.js:28
    const rows = JSON.parse(readFileSync(file, 'utf8'));
  • 写入本地文件
    lib/anchors.js:41
    mkdirSync(entry.anchorPath, { recursive: true, mode: 0o700 });
  • 写入本地文件
    lib/anchors.js:59
    mkdirSync(anchorPath, { recursive: true, mode: 0o700 });
  • 读取本地文件
    lib/migration.js:9
    const st = await lstat(file);
  • 读取本地文件
    lib/migration.js:12
    return await readFile(file, 'utf8');
  • 删除本地文件
    lib/migration.js:94
    await unlink(file);
  • 写入本地文件
    lib/migration.js:97
    await mkdir(dirname(file), { recursive: true, mode: 0o700 });
  • 写入本地文件
    lib/migration.js:110
    await rename(tmp, file);
  • 删除本地文件
    lib/migration.js:120
    await unlink(tmp).catch(error => { if (error.code !== 'ENOENT')
  • 写入本地文件
    lib/migration.js:125
    await mkdir(this.stateDir, { recursive: true, mode: 0o700 });
  • 读取本地文件
    lib/migration.js:126
    const directory = await lstat(this.stateDir);
  • 写入本地文件
    lib/migration.js:129
    await chmod(this.stateDir, 0o700);
  • 读取本地文件
    lib/migration.js:223
    const journal = JSON.parse(await readFile(join(this.stateDir, `${id}.json`), 'utf8'));
  • 写入本地文件
    lib/port-forward-transport.js:67
    await chmod(this.directory, 0o700);
  • 读取本地文件
    lib/port-forward-transport.js:91
    const info = await lstat(this.socket).catch(() => undefined);
  • 删除本地文件递归
    lib/port-forward-transport.js:137
    await rm(this.directory, { recursive: true, force: true });
  • 执行外部命令来自配置/变量
    lib/port-forward-transport.js:148
    spawn(args) {
  • 写入本地文件
    lib/transfer-store.js:61
    await mkdir(path, { recursive: true, mode: 0o700 });
  • 读取本地文件
    lib/transfer-store.js:62
    const info = await lstat(path);
  • 写入本地文件
    lib/transfer-store.js:65
    await chmod(path, 0o700);
  • 读取本地文件
    lib/transfer-store.js:70
    const names = await readdir(this.directory);
  • 写入本地文件
    lib/transfer-store.js:93
    await rename(temporary, path);
  • 删除本地文件
    lib/transfer-store.js:103
    await unlink(temporary).catch(() => { });
  • 读取本地文件
    lib/transfer-store.js:107
    const folder = await lstat(join(this.directory, transferId(id)));
  • 读取本地文件
    lib/transfer-store.js:131
    const names = await readdir(this.directory).catch((error) => { if (error.code === 'ENOENT')
  • 读取本地文件
    lib/transfer-store.js:183
    const directory = join(this.directory, transferId(id)), names = await readdir(directory);
  • 读取本地文件
    lib/transfer-store.js:187
    const info = await lstat(join(directory, name));
  • 删除本地文件
    lib/transfer-store.js:192
    await unlink(join(directory, name));
  • 删除本地文件
    lib/transfer-store.js:193
    await rmdir(directory);
  • 发起网络请求
    lib/release-catalog.js:86
    const response = await this.request(url, { signal, headers: { Accept: 'application/json' }, redirect: 'follow' });
  • 执行外部命令固定命令
    lib/known-hosts.js:118
    execFile('ssh-keygen', ['-F', lookup, '-f', file], { encoding: 'utf8', timeout: 5_000, maxBuffer: 1024 * 1024 }, (error, stdout, stderr) => {
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery@deepseek-ai/cordis@deepseek-ai/dsh-agent@deepseek-ai/dsh-app-boot@deepseek-ai/dsh-api-remotes@deepseek-ai/dsh-api-session-controller@deepseek-ai/dsh-api-terminal-controller@deepseek-ai/dsh-api-workspace-controller@deepseek-ai/dsh-api-workspace-files@deepseek-ai/dsh-atomic-write@deepseek-ai/dsh-brand@deepseek-ai/dsh-client-locale
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

2 张 · 点击查看大图

功能亮点

  • 浏览远程文件
  • 读写远程文件
  • 执行远程命令

DeepSeek Harness 的 SSH 远程工作区:浏览、读写远程文件,执行远程命令,带连接状态圆点。

README

由 DeepSeek 最新模型翻译生成
dsh-ssh-remote — 远程工作区,就在手边。 English · 下载 0.13.3 · 更新记录 · 排错 远程开发,像在本地一样顺手。 在 DeepSeek Harness 中打开 SSH 工作区,用原生文件面板和终端开发。复用 ~/.ssh/config,支持远程编辑、@ 文件引用、端口转发和文件传输,无需在服务器运行完整 DSH。 安装:复制、安装、连接 已有可用的 DSH 和 SSH 别名?直接从这里开始。Desktop 自带运行时,不必额外安装 Node。 Desktop / Web 1. 打开左侧 插件 → 添加插件,粘贴下面的完整地址。 2. 点击 安装 → 立即启用。首次安装或从 0.11.x 升级后,保存工作并完整重启当前 DSH;日后按更新结果提示操作。 3. 点击 添加工作区,选择 SSH 主机与远端文件夹,即可使用官方 工作区文件 和 新建终端。 ~~~text https://github.com/CrazyShout/dsh-ssh-remote/releases/download/v0.13.3/dsh-ssh-remote-0.13.3.tgz 无需克隆、编译或复制插件目录。安装器仍需联网下载运行依赖。 插件详情中的 开始使用 可随时展开查看连接步骤;界面跟随 DSH 的中文/英文设置,不另设语言开关。
展开完整文档(README 剩余 1 节)
dsh-ssh-remote — 远程工作区,就在手边。

English · 下载 0.13.3 · 更新记录 · 排错

远程开发,像在本地一样顺手。

在 DeepSeek Harness 中打开 SSH 工作区,用原生文件面板和终端开发。复用 ~/.ssh/config,支持远程编辑、@ 文件引用、端口转发和文件传输,无需在服务器运行完整 DSH。

安装:复制、安装、连接

已有可用的 DSH 和 SSH 别名?直接从这里开始。Desktop 自带运行时,不必额外安装 Node。

Desktop / Web

1. 打开左侧 插件 → 添加插件,粘贴下面的完整地址。
2. 点击 安装 → 立即启用。首次安装或从 0.11.x 升级后,保存工作并完整重启当前 DSH;日后按更新结果提示操作。
3. 点击 添加工作区,选择 SSH 主机与远端文件夹,即可使用官方 工作区文件 和 新建终端。

~~~text
https://github.com/CrazyShout/dsh-ssh-remote/releases/download/v0.13.3/dsh-ssh-remote-0.13.3.tgz

无需克隆、编译或复制插件目录。安装器仍需联网下载运行依赖。

插件详情中的 开始使用 可随时展开查看连接步骤;界面跟随 DSH 的中文/英文设置,不另设语言开关。已有 0.12.0 的用户可直接在插件详情检查更新。

请使用完整地址。 npm 上同名的 dsh-ssh-remote 属于其他项目。Desktop 与 Web 使用独立 profile,需分别安装。

CLI / Web:一条安装命令

~~~sh
dsh plugin --profile web add 'https://github.com/CrazyShout/dsh-ssh-remote/releases/download/v0.13.3/dsh-ssh-remote-0.13.3.tgz'

安装后重新启动 dsh web;已有服务先在它的终端按 Ctrl-C。Desktop 请使用应用自己的插件页。

其他安装方式与安装界面

在官方插件页面粘贴固定版本安装地址

固定 Git Tag(需要本机 Git):

~~~sh
dsh plugin --profile web add 'github:CrazyShout/dsh-ssh-remote#v0.13.3'

也可下载 Release 的 .tgz,在插件页输入其绝对路径;SHA256SUMS 用于校验下载包。遇到依赖脚本提示时按官方安装器确认,不要全局放开未知脚本。0.11.0 起已移除 ssh2 / cpu-features 原生构建依赖。

打开之后能做什么

实际 Web 界面:SSH 远程工作台

| 日常操作 | 入口 |
| 浏览、预览文件 | 官方侧栏 工作区文件 |
| 编辑并保存文本 | 文件页签菜单 编辑远程文本,或快速打开中的 编辑 |
| 找到并引用代码 | SSH · 主机 → 快速打开,或输入框中的原生 @ |
| 运行命令 | 官方侧栏 新建终端 |
| 查看目录、命令退出码与上下文 | 终端页签菜单 查看 SSH 终端状态 |
| 访问 TensorBoard、Jupyter、开发网页 | 远程工作台 → 端口转发 |
| 上传、下载文件或目录 | 远程工作台 → 文件传输 |
| 使用远端 skill | 当前远程会话的原生 / 技能菜单 |

顶部 SSH · 主机 打开统一远程工作台;空会话入口在输入框上方。本地会话仍使用原来的文件和终端,不会被接管。

连接圆点:绿=SSH/helper 已连接,黄=连接中或能力受限,灰色空心=未连接或状态未知,红=连接错误。悬停或键盘聚焦可查看完整路径和原因。绿点不代表所有远端功能都已经验证。

第一次使用 SSH?

先按 DSH 官方说明安装 DSH,再准备本机 OpenSSH 别名:

~~~sshconfig
Host devbox
HostName your-server.example.com
User your-user

运行 ssh devbox,首次连接时核对主机指纹,确认能登录后 exit。插件后台使用非交互认证,因此还需确认:

~~~sh
ssh -o BatchMode=yes devbox true

随后按上面的三步安装连接,在原生终端运行 pwd 验证远端目录,无需发送模型消息。首次连接会部署匹配的 Python helper;主机诊断位于 设置 → 内置插件 → SSH Remote。自定义 Port、IdentityFile、ProxyJump 仍写在 OpenSSH 配置中,不必在插件里重复填写。

环境与边界

兼容验收覆盖 DSH 0.2.0-rc.2 / 0.2.1-rc.2 / 0.2.1-rc.3;结果以对应 Release 的验收记录为准,不自动切换 DSH 更新通道。

| 用途 | 要求 |
| Desktop | 官方 DSH Desktop,自带 Node 和包管理器 |
| CLI / Web | Node 22+,dsh 与 pnpm 可用 |
| 基础远程连接 | 本机 OpenSSH、可用的非交互认证;远端 Python 3.8+ |
| 文件搜索与 @ 补全 | 远端 ripgrep;Git 工作区索引还需要 Git |
| 模型受限命令执行 | 远端 Linux 和 bubblewrap;浏览文件、人工终端不要求它 |
| 远端 run_code / PTC | 远端 Node 22.13+(须支持 stripTypeScriptTypes);受限权限仍需 bubblewrap。Desktop 自带 Node 不等于远端已有 Node |
- 文本编辑:完整 UTF-8 文件,最大 256 KiB;重启前保存草稿。
- 文件传输:单文件、单批上限 1 TiB;小样本实测、容量边界模拟,未测试 TB 级吞吐。重启续传需重新授权源或目标目录。
- 端口转发:目前仅验收 macOS / Linux 本机;Windows 尚无完整 Desktop/SSH 验收。
- 远端技能:默认发现项目及用户的 .dsh/skills、.agents/skills,不跟随符号链接、不自动执行脚本。
- DSH 的 Finder / 本机应用入口仍是本机操作;远端文件使用面板预览和远程编辑。

详细范围见技术参考。从旧 SFTP/插件 host 配置迁移见迁移指南;已有 OpenSSH 别名无需迁移,升级不会自动改写 SSH 配置。

更新、回退与卸载

应用内更新: 打开 插件 → dsh-ssh-remote → 检查更新。发现稳定版后点击 更新到版本号 → 确认更新,无需返回仓库或复制新链接。默认在页面可见时每 6 小时检查一次;可在同页关闭自动检查,手动检查仍可用。提醒只显示一次,不自动安装。

网络检查失败后,页面可见时约 5 分钟自动复查;展开“更新排错建议”可查看失败阶段和脱敏错误码。不会擅自切换代理、关闭证书校验或反复安装。

更新调用 DSH 官方安装服务,保留依赖审批与兼容性检查。安装完成与新版生效会分别显示;若提示需要重启,请先保存草稿、暂停传输。更新重载可能结束 SSH 终端和端口转发;插件不会自动重启 DSH。 断线或响应丢失时选择 重新确认结果,不会自动重复安装。

“检查更新”也会刷新本机安装状态。若旧请求已不在当前 DSH 中,重新核对版本后可点 结束这次提示;它只清理提示,不代表安装已取消。之后如仍需更新,再由你确认发起。安装错误的短说明和日志路径放在详情里,长日志不会塞进浏览器恢复记录。

源码 link: / 本地目录安装只提示版本,使用 Git 同步,不会被安装包覆盖。0.11.2 及更早版本尚无此入口,需要先按上方步骤安装当前版本。也可随时从 Releases 手动选择固定版本;若 DSH 拒绝直接替换某种来源,按官方插件页提示处理,不自动卸载旧版。Web CLI 仍可在同一 profile 再次运行 add。

回退到 0.13.2: 在插件页安装上一正式版本,或使用:

~~~sh
dsh plugin --profile web add 'https://github.com/CrazyShout/dsh-ssh-remote/releases/download/v0.13.2/dsh-ssh-remote-0.13.2.tgz'

按提示重启,已迁移的 OpenSSH 配置保留。0.13.0 及更早版本没有本版的控制连接认证修复;回退仅用于隔离排障,不应作为安全等价版本长期使用。

停用 / 卸载: 使用对应应用的插件页。Web 也可停止服务后运行:

~~~sh
dsh plugin --profile web remove dsh-ssh-remote

不会删除远端项目、本地会话或 SSH 配置。已有远程工作区需要插件才能访问,重新安装可复用保存的映射。

帮助与开发

排错指南 · 提交 Issue · 技术参考 · 路线图 · 发布流程 · 更新记录

反馈时附上插件 / DSH 版本、Desktop 或 Web、安装来源及第一个实际错误;不要提交凭据。

MIT License.
预览分享卡片长什么样 ↓CrazyShout/dsh-ssh-remote
分享 · DeepSeek Harness Hub
CrazyShout/dsh-ssh-remote

dsh-ssh-remote — 远程工作区,就在手边。

这是你的仓库?认领条目

回到顶部