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

局域网远程访问 MaybeMeibeMaybi/dsh-lan-remote-access

DeepSeek 客户端
MaybeMeibeMaybi37 天前有提交已提供中文文档扫描:含敏感能力兼容 / 相关生态

用手机浏览器远程操作电脑上的 dsh 会话

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

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

相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/MaybeMeibeMaybi/dsh-lan-remote-access.git

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:待复验
是什么
生态插件
可安装,未声明 dsh 能力
装得上吗
曾在 dsh 0.2.0-rc.2 下真实安装成功,但当前 dsh 已更新至 0.2.1-rc.5,本站尚未在新版下复验
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 37 天前
档位由哪些信号合成

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

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

未发布到 npm registry,仅可从源码安装

展开查看检查明细 ↓

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

✗npm 包dsh-lan-remote-access(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/8 08:45:28

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 19 处,展示前 19 条)
  • 写入本地文件
    src/plugin/lib/index.js:43
    appendFileSync(
  • 写入本地文件
    src/plugin/lib/index.js:83
    mkdirSync(dirname(path), { recursive: true });
  • 读取本地文件
    src/plugin/lib/index.js:84
    const info = existsSync(path) ? statSync(path) : undefined;
  • 读取本地文件
    src/plugin/lib/index.js:84
    const info = existsSync(path) ? statSync(path) : undefined;
  • 读取本地文件
    src/plugin/lib/index.js:86
    const kept = readFileSync(path, "utf8").split(/ ? /).slice(-TRACE_KEEP_LINES).join("\n");
  • 写入本地文件
    src/plugin/lib/index.js:87
    writeFileSync(path, `${kept}\n`);
  • 写入本地文件
    src/plugin/lib/index.js:89
    appendFileSync(path, `${new Date().toISOString()} [pid ${process.pid}] ${message}\n`);
  • 发起网络请求
    src/plugin/lib/index.js:189
    const response = await fetch(`http://${host}:${String(port)}/__proxy_health`, { signal: controller.signal });
  • 执行外部命令固定命令
    src/plugin/lib/index.js:218
    const out = execFileSync("pgrep", ["-f", matchArg], { encoding: "utf8" });
  • 执行外部命令固定命令
    src/plugin/lib/index.js:226
    const out = execFileSync(
  • 读取本地文件
    src/plugin/lib/index.js:246
    if (!script || !existsSync(script)) {
  • 执行外部命令来自配置/变量
    src/plugin/lib/index.js:278
    const child = spawn(process.execPath || "node", args, { detached: true, stdio: "ignore", windowsHide: true });
  • 读取本地文件
    src/plugin/lib/index.js:305
    if (!script || !existsSync(script)) {
  • 执行外部命令来自配置/变量
    src/plugin/lib/index.js:339
    const child = spawn(
  • 读取本地文件
    src/ops/Push-Alert.mjs:74
    const yml = readFileSync(join(homedir(), ".dsh", "profiles", "web", "cordis.patch.yml"), "utf8");
  • 读取本地文件
    src/ops/Push-Alert.mjs:126
    const yml = readFileSync(join(homedir(), ".dsh", "profiles", "web", "cordis.patch.yml"), "utf8");
  • 发起网络请求
    src/ops/Push-Alert.mjs:174
    const response = await fetch(PUSH_URL, {
  • 发起网络请求
    src/proxy/dsh-entry-proxy.mjs:240
    const proxyReq = http.request(
  • 发起网络请求
    src/proxy/dsh-entry-proxy.mjs:289
    const upstreamReq = http.request({
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 局域网设备访问网页GUI
  • 本地入口代理

让局域网内任意设备访问 DeepSeek Harness(dsh)网页 GUI:仅监听回环的服务端,加本地入口代理,转发 HTTP 和 WebSocket。

README

由 DeepSeek 最新模型翻译生成
局域网远程访问与控制 DeepSeek Harness 从局域网内任意设备访问 DeepSeek Harness(dsh)Web GUI License: MIT dsh Node Platform 手机或平板连上同一个 WiFi,打开浏览器就能操作电脑上的 dsh —— 看会话、发指令。 dsh web 本体始终只监听 127.0.0.1,暴露在局域网上的只有一个入口代理。 一、问题的本质 dsh web 只监听环回地址,这是刻意设计。所以手机直接访问 http://:3080 会连不上—— 不是防火墙挡住了,而是根本没有监听在局域网地址上。 本项目的做法:在两者之间放一个入口代理,它监听局域网地址,把请求转发给 127.0.0.1:3080。 手机 ──► http://192.168.x.x:3081 ──► dsh-entry-proxy.mjs ──► 127.0.0.1:3080 (dsh web) (绑 LAN 地址) (本代理) (始终只绑环回) 二、⚠️ 两个必须知道的技术点(否则做出来是坏的) 1. 不能改写 Host / Origin —— 必须在配置里声明可信主机 dsh 的 /api 有一道浏览器信任围栏:它取请求的 Host(或 Origin),要求两者一致, 且 authority 必须是环回地址、或显式声明过的主机。
展开完整文档(README 剩余 1 节)
局域网远程访问与控制 DeepSeek Harness

从局域网内任意设备访问 DeepSeek Harness(dsh)Web GUI

License: MIT
dsh
Node
Platform

手机或平板连上同一个 WiFi,打开浏览器就能操作电脑上的 dsh —— 看会话、发指令。
dsh web 本体始终只监听 127.0.0.1,暴露在局域网上的只有一个入口代理。

一、问题的本质

dsh web 只监听环回地址,这是刻意设计。所以手机直接访问 http://:3080 会连不上——
不是防火墙挡住了,而是根本没有监听在局域网地址上。

本项目的做法:在两者之间放一个入口代理,它监听局域网地址,把请求转发给 127.0.0.1:3080。

手机 ──► http://192.168.x.x:3081 ──► dsh-entry-proxy.mjs ──► 127.0.0.1:3080 (dsh web) (绑 LAN 地址) (本代理) (始终只绑环回)

二、⚠️ 两个必须知道的技术点(否则做出来是坏的)

1. 不能改写 Host / Origin —— 必须在配置里声明可信主机

dsh 的 /api 有一道浏览器信任围栏:它取请求的 Host(或 Origin),要求两者一致,
且 authority 必须是环回地址、或显式声明过的主机。

后果:任何反向代理都无法靠改写 Host 绕过它(这正是它的目的——防 DNS rebinding)。

实测证据:用 Host: 192.168.0.x:3081(本机局域网地址)直连环回端口 → 403 Forbidden;把该 authority 加进 trustedHosts 后才放行。

所以部署时必须改 cordis.patch.yml 的两处(缺一不可,前者持有值、后者是围栏):

- id: web-runtime
config:
trustedHosts:

- id: connection
config:
trustedHosts:

2. 必须隧道 WebSocket —— 否则页面能开但一直"自动重连中"

dsh 的实时数据面走 /api/remote.mux 这个 WebSocket。
只转发普通 HTTP 的代理会导致:页面能渲染,但会话列表为空、左下角一直显示"自动重连中"。

本项目的代理实现了 server.on('upgrade') 原始 socket 双向隧道。这一条是踩出来的:第一版代理没做,现象就是"看着正常、其实没连上"。

三、设计要点(为什么这么做)

| 决策 | 原因 |
| 代理绑 LAN 地址而不是 0.0.0.0 | 只在需要的网络上可达;环回留给本机 |
| 由 dsh 插件启动代理,而不是独立计划任务 | 计划任务会和 dsh 抢端口;插件在 dsh 进程内启动,顺序天然正确 |
| 插件启动前先健康探测 | 已在服务就复用,不产生重复实例 |
| 探测地址 = 绑定地址 | 对只绑 LAN 的代理探 127.0.0.1 必然 ECONNREFUSED,会导致每次启动都拉起一个注定失败的实例 |
| 子进程 detached + unref | 代理可活过本次 dsh 运行,下次启动直接复用 |
| 代理自己捕获 EADDRINUSE 后安静退出 | 第二道保险,不让端口冲突升级成崩溃 |
| 启动器先查端口再决定 | 否则每次双击都尝试起第二个实例,撞上 EADDRINUSE 3080 |

四、目录结构

.
├── README.md
├── LICENSE
├── package.json
├── docs/
│ └── DEPLOY.md 从零部署(6 步 + 12 条排错表) └── src/ ├── proxy/ │ └── dsh-entry-proxy.mjs 入口代理(HTTP + WebSocket 隧道) ├── plugin/ 本地插件:随 dsh 自动拉起代理 │ ├── package.json │ └── lib/index.js └── launcher/ 桌面启动器 ├── dsh-hiboard.cmd 纯 ASCII(cmd.exe 按 ANSI 解码,中文会乱码) └── dsh-start.ps1 纯 ASCII(PS 5.1 无 BOM 时按 ANSI 解码)

五、快速开始

前置:Windows + Node.js 18+ + dsh 已安装 + pnpm 已安装。

1) 放到「路径不含空格」的目录(pnpm 的 file: 依赖会被空格截断)例:把 src\plugin 复制到 E:\dsh-vendor\dsh-entry-startup 把 src\proxy\dsh-entry-proxy.mjs 复制到 E:\DSH\dsh-entry-proxy.mjs

2) 安装代理插件
dsh plugin --profile web add "file:E:/dsh-vendor/dsh-entry-startup"
3) 写 profile 补丁层(trustedHosts 两处 + insert 插件条目)见 docs/DEPLOY.md 第 3 步

4) 配置预检(只读,不起服务)
dsh --profile web --dump-config | Select-Object -First 5

5) 用 src\launcher\dsh-hiboard.cmd 启动(它会判断是否已在运行)

手机打开 http://:3081/?token=。
成功判据:完整 GUI + 侧边栏列出会话 + 左下角不是"自动重连中"。

完整步骤与排错表见 docs/DEPLOY.md。

六、排错速查(完整表见 DEPLOY.md)

| 现象 | 原因 |
| 手机打开是 403 | trustedHosts 没加 LAN 地址,或只加了一处 |
| 手机打开 401 | 地址漏了 ?token=,或 dsh 重启后 token 已更换 |
| 会话列表为空 + 一直"自动重连中" | 代理没有 WebSocket 隧道 |
| 电脑自己能访问、手机不通 | 路由器开了 AP 隔离 |
| EADDRINUSE 3080 | 旧实例还健康地占着端口,不代表崩溃;先查端口占用 |
| .cmd 满屏"不是内部或外部命令" | cmd.exe 按系统 ANSI(GBK) 解码,UTF-8 中文注释变乱码并吃掉行首 REM |
| .ps1 报语法错 | 含非 ASCII 却没有 UTF-8 BOM,PS 5.1 按 ANSI 解码导致解析失败 |

七、安全

- 访问仍需 dsh 自己的会话 token(无 token 一律 401/403);入口代理不是鉴权层。
- token 每次重启 dsh 都会更换,启动器会自动捕获到 ~/.dsh/lan/web-state.json。
- 关闭局域网入口:删掉 cordis.patch.yml 里那两条 trustedHosts,或结束代理进程。
- 电脑侧不需要开任何入站端口(代理只监听局域网地址,由 dsh 自己拉起)。

许可证

MIT,见 LICENSE。
预览分享卡片长什么样 ↓MaybeMeibeMaybi/dsh-lan-remote-access
分享 · DeepSeek Harness Hub
MaybeMeibeMaybi/dsh-lan-remote-access

用手机浏览器远程操作电脑上的 dsh 会话

这是你的仓库?认领条目

回到顶部