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

远程安全中继 sorsama/deepseek-harness-relay

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

在手机上使用 DeepSeek Harness,不用把它暴露给同一 Wi-Fi 下的所有人。

42.1/100
综合分
10
GitHub 星标
608
npm 周下载
—/5
用户评分

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-relay
npm 源 · dsh-relay 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · ui
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已在 dsh 0.2.1-rc.5 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
数据截至 2026/11/01·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/03·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 11 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

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

✓npm 包dsh-relay @ 0.3.0
✓Node 引擎要求 ^22.19.0 || >=24 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

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

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

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

读写/删除本地文件
查看扫描证据(共 12 处,展示前 10 条)
  • 写入本地文件
    lib/index.js:3293
    await mkdir(dir, {
  • 读取本地文件
    lib/index.js:3300
    const raw = await readFile(file, "utf8");
  • 写入本地文件
    lib/index.js:3311
    await writeFile(file, `${JSON.stringify(state, null, 2)}\n`, { mode: SECRET_MODE$1 });
  • 写入本地文件
    lib/index.js:3333
    await writeFile(temp, `${JSON.stringify(draft, null, 2)}\n`, { mode: SECRET_MODE$1 });
  • 写入本地文件
    lib/index.js:3334
    await rename(temp, this.file);
  • 写入本地文件
    lib/index.js:3454
    await mkdir(dir, {
  • 写入本地文件
    lib/index.js:3458
    await writeFile(join(dir, CERT_FILE), pems.cert, { mode: SECRET_MODE });
  • 读取本地文件
    lib/index.js:3499
    const [cert, key] = await Promise.all([readFile(options.certPath, "utf8"), readFile(options.keyPath, "utf8")]);
  • 读取本地文件
    lib/index.js:3515
    const [cert, key] = await Promise.all([readFile(join(options.dir, CERT_FILE), "utf8"), readFile(join(options.dir, KEY_FILE), "utf8")]);
  • 读取本地文件
    lib/index.js:3527
    existingKey = await readFile(join(options.dir, KEY_FILE), "utf8");
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

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

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery@deepseek-ai/cordis@deepseek-ai/dsh-client-ui-plugin-manager@deepseek-ai/dsh-client-ui-primitives@deepseek-ai/dsh-client-ui-settings@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-host-webserver
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • TLS加密远程访问
  • 二维码/验证码设备配对
  • 按设备吊销权限

给 DeepSeek Harness 网页配置档加上带认证的远程访问:TLS、二维码/验证码设备配对、密码登录、按设备吊销,全部挡在未改动的回环 harness 前面。

v0.3.02026-10-24
支持 Harness 0.1.7 到 0.2.x。在这些 Harness 上,已发布的 0.2.1 会直接弄坏 Web UI:它的浏览器端在等一个 0.1.7 已移除的客户端服务,页面只显示 dsh-relay: pending (waiting for service: settingsScope)(#11、#13)。npm 上的 0.2.1 tarball 还打包了比自身源码更旧的运行时,导致它根本无法向 Harness 认证。 dsh plugin --profile web add dsh-relay@0.3.0 还没上 npm?从这个 release 安装: dsh plugin --profile web add 如果 pnpm 报 ERR_PNPM_ADDING_TO_ROOT,把 -w 放在 add 后面。 需要 Harness 0.1.7-rc.2 或更高版本,现在 Harness 会强制检查。在 Harness 0.1.2 到 0.1.5 上,继续用 0.2,并从它的 tag 安装:github:sorsama/deepseek-harness-relay#v0.2.1。 · 修复 · Web UI 重新能启动,设置页也回来了。位置在 Plugins → dsh-relay → Configure,就在 relay 自己那一行。保存会就地重新绑定 relay,不用重启。 · 冷启动不再让每个请求都卡在 401。relay 挂载时,Harness 还没写入签名密钥。以前它只读一次密钥,读不到就一直记着这个失败,直到进程结束。现在每个请求都会重新查,密钥出现后的第一个请求就能通过认证。 · npm tarball 不会再打包过期的运行时。prepack 会重新构建两端,CI 会解包 tarball 并校验里面的字节。 · 地址集变化不再让已配对的设备失联。以前 VPN 断开或 IP 变动会用新密钥重新签发自签名证书,导致每台手机的 pin 都失效。现在证书用存储的密钥重新签发。 · 地址授权不能覆盖多台手机。以前在同一台机器上通过反向代理配对,或从机器本身配对,会授权 loopback 或机器自己的局域网地址。这等于让代理的所有客户端、或宿主机上的所有容器无需凭据就能访问。 · 同一台手机的两个配对现在能在 /relay/devices 上区分开(#8)。 · 变更 · 支持范围 >=0.1.7-rc.2 <0.3.0-0 声明在 engines.dsh 和 dsh-* peers 上。Harness 会拒绝范围外的插件,并在提示里写明范围。 · relay 拒绝前置绑定到任何非 loopback 地址的 Harness(0.2.1 的 --host 允许这种),也拒绝自己提供 TLS 的 Harness。 · 验证 每次运行都在 Windows 上,针对隔离 home 里的真实 Harness,安装这个 tarball。Harness 0.2.1-rc.3、0.2.0-rc.2 和 0.1.7-rc.2 全部通过: · 冷启动在第一个请求时自愈; · Web UI 启动,浏览器端处于活动状态; · 设置页正常渲染,改端口会重新绑定 relay,不用重启 Harness; · Host 防护、配对、密钥 pin,以及 /api 和 /api/remote.mux 升级上的 bearer token 都正常; · 机器自己的地址上没有地址授权。 在 0.2.1-rc.3 上,还检查了密码登录、吊销、pin 和密码在重启后保留,以及 --host 拒绝。两个较旧的 Harness 和一次独立代码审查由另外的 Antigravity Gemini 3.8 Flash 智能体执行。CI 在 Ubuntu 和 Windows 上全绿(146 个测试)。 由 @hazyumps 的 #12 构建,其中包含 @snailium 的 #10、@makhammadzhanov 的 #6、#14,以及 @js-easy-school 的 #9。报告和测量来自 #11 和 #13 里的 @dimpurr、@johnlam1968 和 @Cruzor-Blade。完整列表在 changelog 里。
v0.1.22026-08-23
安全加固版本:同机上的反向代理不再把它的客户端当成操作者。中继把回环 TCP 对端视为坐在键盘前的人——免密码、免配对。这条规则对机器上的浏览器是对的,对人们用来把中继放到公网的反向代理却是错的:Tailscale Funnel 文档里的 HTTP 目标恰好就是回环地址,经由它,未认证的 GET / 直接返回了 harness 本身(#1)。带转发头(Forwarded、X-Forwarded-*、X-Real-IP、Via)的回环请求现在归类为网络流量:必须出示凭证——持有设备 token 或会话 cookie 的代理客户端仍然可用——并且像任何网络地址一样受速率限制。本地浏览器不发送这些头,照旧直接放行。转发头只是线索,不是证明。剥离转发头的代理与操作者的浏览器无法区分,所以「把它暴露到公网」里的建议依然成立:让代理指向中继监听的某个非回环地址。dsh plugin --profile web add dsh-relay@0.1.2 由 @toolazytoname 报告。
v0.1.02026-08-21
为 DeepSeek Harness 的 web 配置档提供带认证的远程访问。 dsh plugin --profile web add dsh-relay dsh web 然后在运行 harness 的机器上打开 /relay/password 设置密码。入门指南里以 npx @deepseek-ai/dsh web 为例走了一遍流程。 先移除 LAN 补丁。如果 ~/.dsh/profiles/web/cordis.patch.yml 把 harness 绑定到 0.0.0.0,中继会拒绝启动——它保护不了一个已经在无认证状态下响应网络的服务器。 · 功能 harness 在回环地址上提供浏览器 API,并明确说明它的 /api 防护「不是认证层」,配置面「在真正的认证层出现之前」只走回环,而 --host 0.0.0.0 会被拒绝,因为「那会把远程代码执行暴露到网络上」。这个插件就是那一层,挂在 harness 旁边而不是里面:第二个监听器,负责终止 TLS、做认证,再反向代理到原封不动的回环服务器。 · 密码登录(scrypt,签名的 HttpOnly;SameSite=Strict cookie),二维码和验证码设备配对,可吊销的 bearer token,设备列表,以及轮换密钥的「到处登出」。 · 自带 DNS 重绑定和跨站防护,在 Host 重写之前生效——否则 harness 的防护会先拦下它;还自带一份回环限定的方法列表,因为重写会把它抬掉。 · 自签名证书,附带公开的 SPKI pin,也可以自带证书。 · 整个 web UI 原样保留,角落多一个 Relay 链接,设置 → 插件里多一张卡片。 · _dsh._tcp mDNS 广播。 · DSH Mobile 0.5.0 它硬编码 讲清了源地址能证明什么、不能证明什么,CLIENT_INTEGRATION.md 则是给能持有 token 的客户端的约定。 · 安装之前 登录授予的权限等同于宿主机上的 shell,因为智能体在那里执行命令。这个插件里的一切都由此而来。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
dsh-relay dsh-relay 在手机上使用 DeepSeek Harness,不用把它暴露给同一 Wi-Fi 下的所有人。 dsh-relay 是 Harness 的 web 配置档插件。它在 Harness 前面加上 HTTPS、密码和配对设备,这样你就能从网络里的另一台设备访问它;转发端口后,还能从任何地方访问。 它基于 DeepSeek Harness 构建,但不是 DeepSeek 官方项目。 为什么需要它 Harness 的 web 应用只监听 127.0.0.1,所以只有运行它的那台电脑能打开。这是有意为之。Harness 是编码智能体,会在你的机器上执行命令,作者拒绝 dsh web --host 0.0.0.0,因为这样「会把远程代码执行暴露到网络上」。 常见的绕法是用配置补丁把 Harness 绑定到 0.0.0.0,完全不设登录。这样一来,同一 Wi-Fi 下的任何人都能操控你的智能体,在你的电脑上执行命令。 dsh-relay 是更安全的做法。Harness 留在回环地址上,relay 作为第二个监听器跑在它旁边。每个请求先过 TLS 和凭证检查,relay 才会转发。
展开完整文档(README 剩余 1 节)
dsh-relay

dsh-relay

在手机上使用 DeepSeek Harness,不用把它暴露给同一 Wi-Fi 下的所有人。

dsh-relay 是 Harness 的 web 配置档插件。它在 Harness 前面加上 HTTPS、密码和配对设备,这样你就能从网络里的另一台设备访问它;转发端口后,还能从任何地方访问。

它基于 DeepSeek Harness 构建,但不是 DeepSeek 官方项目。

为什么需要它

Harness 的 web 应用只监听 127.0.0.1,所以只有运行它的那台电脑能打开。这是有意为之。Harness 是编码智能体,会在你的机器上执行命令,作者拒绝 dsh web --host 0.0.0.0,因为这样「会把远程代码执行暴露到网络上」。

常见的绕法是用配置补丁把 Harness 绑定到 0.0.0.0,完全不设登录。这样一来,同一 Wi-Fi 下的任何人都能操控你的智能体,在你的电脑上执行命令。

dsh-relay 是更安全的做法。Harness 留在回环地址上,relay 作为第二个监听器跑在它旁边。每个请求先过 TLS 和凭证检查,relay 才会转发。

phone / browser ──TLS──▶ relay :3443 ──plain HTTP──▶ harness 127.0.0.1:3080
├─ /relay/password
├─ /relay/login
├─ /relay/pair
├─ /relay/devices
└─ everything else ─proxy─▶ /api · WebSocket downlinks · web UI

因为 Harness 从不离开回环地址,relay 崩溃或配置出错时,Harness 只会从网络上不可达,绝不会对网络敞开。如果 relay 发现 Harness 已经在网络地址上监听,它会拒绝启动。

Harness 0.1.2 及以后版本自带登录(浏览器会话 cookie)。但它们仍然拒绝绑定到网络,仍然没有 TLS,而且只在自己的页面上发放那个 cookie,所以手机仍然没有安全入口,除非有 relay 这样的东西。

你能得到什么

- 从任何浏览器用密码登录。猜错太多次,该地址会被锁定一段时间。
- 用二维码或 8 位数字码配对。每台配对设备有自己的 token,你可以单独吊销任意设备。配对码一次性使用,五分钟后过期,且只能在运行 Harness 的机器上创建。
- 「在所有地方退出登录」按钮,会轮换签名密钥,一次性登出所有浏览器和设备。
- HTTPS,可以用你自己的证书,也可以用自签名证书,其密钥可供应用固定。
- 在 _dsh._tcp 上做 mDNS 广播,应用不用扫描子网就能找到 relay。
- 完整的 harness Web UI,原样不变,角落多一个 Relay 链接。
- 在运行 harness 的机器上,打开 Plugins → dsh-relay → Configure 就是设置页。按 Save 立即生效,不用重启。

支持的 harness 版本

| Harness | dsh-relay |
| 0.1.7-rc.2 到 0.2.x | 0.3(已在 0.2.1-rc.3、0.2.0-rc.2 和 0.1.7-rc.2 上测试) |
| 0.1.2 到 0.1.5 | 0.2,从它的 git tag 安装:dsh plugin --profile web add github:sorsama/deepseek-harness-relay#v0.2.1。npm 上的 0.2.1 包带的是旧构建,无法向 harness 认证。 |
| 0.1.1 及更早 | 0.1 |

装的版本和 harness 不匹配时,harness 会拒绝加载,并告诉你它需要哪个范围。0.3 依赖 harness 0.1.7 新增的设置系统,而 0.2 在 0.1.7 及更高版本上会让 Web 应用卡死,所以两者不能重叠。

快速开始

第一次用?docs/GETTING_STARTED.md 用 npx @deepseek-ai/dsh web 带你走完每一步,包括途中会看到什么。

1. 有 LAN 补丁就先删掉。 如果 ~/.dsh/profiles/web/cordis.patch.yml 把 harness 绑定到 0.0.0.0,删掉那一行。harness 已经对网络开放时,relay 不会启动在它前面。

2. 安装插件,重启 harness。

dsh plugin --profile web add dsh-relay
dsh web

包是预构建的,你机器上不用编译任何东西。harness 启动后会打印 relay 的地址。

3. 设置密码。 在运行 harness 的机器上打开 https://127.0.0.1:3443/relay/password。密码存在之前,这个页面只能从该机器访问,所以网络上没人能抢先占用 relay。

4. 配对手机。 还是在那台机器上,打开 https://127.0.0.1:3443/relay/pair。用手机扫二维码,或者在手机上打开同一路径输入配对码。给设备起个名字,它就会出现在 /relay/devices 下。

PATH 里没有 dsh?所有命令都可以换成 npx @deepseek-ai/dsh ...。

在运行 harness 的机器上不会问你要密码。能坐到那个键盘前的人本来就有 shell,所以 relay 把 loopback 当作你本人。密码是给网络上其他一切用的。

配合 DSH Mobile 使用

DSH Mobile 0.8.0 及更高版本完整支持 relay。在应用里进入 Relay → Pair a relay,扫二维码或输入配对码。应用保存真正的 token,走 HTTPS,并固定 relay 的密钥,其他都不用配。

等你用的每个应用都升到 0.8.0 并完成配对后,在配置里关掉兼容桥:

compat:
addressGrants: false

使用 DSH Mobile 0.5.0 到 0.7.0

这些旧版本在 relay 出现之前就发布了,有两个限制。

他们连不上自签名的 HTTPS 服务器。0.6.0 之前,应用只支持 http://。0.7.0 加入了 https://,但只支持受信任机构签发的证书,自签名中继的证书不属于这一类。要支持这类服务器,在 HTTPS 监听之外再跑一个纯 HTTP 监听:

DSH_RELAY_PLAIN_PORT=3444 dsh web

这个监听没有登录页和配对页,也永远访问不到 harness 设置或凭据。

他们也无法发送任何凭据:没有 Authorization 头,没有 cookie,没有 Origin。所以换个办法:从手机浏览器完成配对,中继记住手机的网络地址,之后应用从同一地址连进来就放行。

网络地址不是真正的认证。NAT 后面地址是共享的,DHCP 和 IPv6 隐私地址会让它变化,同一 Wi-Fi 上的任何设备都能伪造。中继限制了危害范围(只接受私有地址、一天后过期、撤销设备时移除、永远不许进入设置),但真正的解决办法是更新应用。

如果你在写自己的客户端,docs/CLIENT_INTEGRATION.md 就是你要遵循的协议。

配置

有三个地方可以改设置:

- 运行 harness 的机器上,Plugins → dsh-relay → Configure 设置页。
- 单次运行用的环境变量,例如 DSH_RELAY_PORT=8443 dsh web。没有 --relay-* 命令行参数,因为 harness 会拒绝任何它不认识的参数。
- 永久修改写在 ~/.dsh/profiles/web/cordis.patch.yml 的 relay 行里。

docs/CONFIGURATION.md 列出了所有选项,还有如何配置证书、如何从互联网访问中继。

暴露到互联网之前

先读配置指南的互联网部分。简要版:

- 转发中继的端口,绝不要转发 harness 的端口。
- 用真实证书。
- 设置 compat.addressGrants: false 和 privilegedMethods: loopback-only。
- 不要把 Tailscale Funnel、Tailscale Serve、nginx 或 Caddy 指向 127.0.0.1:3443。这些代理从 loopback 连进来,而中继把 loopback 当作你本人,所以不会向任何人要密码。

安全

登录中继就等于拿到宿主机上的 shell,因为智能体在那里执行命令。这个插件的一切都围绕这个事实设计。docs/SECURITY.md 说明了中继防住什么、防不住什么,以及如何报告漏洞。

文档

| 指南 | 什么时候读 |
| 入门 | 第一次设置中继。 |
| 配置 | 想改端口或证书,或者要从网络外部访问中继。 |
| 故障排查 | 有东西不工作。 |
| 安全 | 你想确切了解中继保护了什么。 |
| 客户端集成 | 你正在构建一个与中继通信的应用。 |
| 贡献 | 你想构建、测试或修改插件。 |

开发

pnpm install
pnpm build # tsc -b, then tsdown
pnpm test
pnpm typecheck

CONTRIBUTING.md 介绍了如何用源码检出对真实 harness 运行,以及发布流程。

命名

harness 的品牌指南要求社区项目使用 DSH 缩写,而不是完整商标,并且不要使用官方品牌素材。因此 npm 包名为 dsh-relay,中继的页面使用本项目自己的 logo。

许可证

MIT
预览分享卡片长什么样 ↓sorsama/deepseek-harness-relay
分享 · DeepSeek Harness Hub
sorsama/deepseek-harness-relay

在手机上使用 DeepSeek Harness,不用把它暴露给同一 Wi-Fi 下的所有人。

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部