局域网远程访问 MaybeMeibeMaybi/dsh-lan-remote-access
DeepSeek 客户端用手机浏览器远程操作电脑上的 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 能力
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 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🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
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。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
MaybeMeibeMaybi/dsh-lan-remote-access
用手机浏览器远程操作电脑上的 dsh 会话
相关插件 · UI / 主题
破甲增强版JeffKeeping/dsh-purge-plus
dsh-purge 的非官方分支fork:适配 DeepSeek Harness 0.2.1-rc.2、破甲内核…
★ 387已汉化DeepSeek 客户端
71.9
无代码业务系统平台nocobase/nocobase
NocoBase 是什么
★ 24,804已汉化DSH
71.8
1Panel 服务器面板1Panel-dev/1Panel
全球 250 万+ 自托管用户共同喜爱。
★ 37,350已汉化DSH
71.5
工作状态行动态ccch1mneyyy/working-activity
作者:chimney@ccch1mneyyy。社区项目,非 DeepSeek 官方项目。
★ 664已汉化DSH
71.2
多模型配置管家farion1231/cc-switch
跨平台桌面一体化助手,支持 Claude Code、Codex、OpenCode、DeepSeek Harness 等工具,唯一官网 ccswitch.io
★ 151,506已汉化DSH
71.1
AI 矢量设计工具ZSeven-W/openpencil
全球首个 AI 原生开源矢量设计工具。
★ 7,027已汉化DSH
71.1
这是你的仓库?认领条目