DeepSeek Harness(dsh)Web 插件
49.3/100
综合分
38
GitHub 星标
489
npm 周下载
—/5
用户评分
数据截至 2026/10/18 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-web-lan-accessnpm 源 · dsh-web-lan-access 的发布者账号已校验与本仓库一致
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:需留意
是什么
dsh 原生插件 · ui
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 16 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
⚠︎ 实装验证未通过(runtime_boot_failed · 2026/10/29) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包dsh-web-lan-access @ 1.3.2
✓Node 引擎要求 >=20.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/29 22:40:05
安全扫描自动 · 静态分析源码v2.7.0🟢 扫描:未发现敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
README
由 DeepSeek 最新模型翻译生成dsh-web-lan-access
DeepSeek Harness Web UI 的局域网/远程访问支持插件。
一条命令绑定所有网口,从局域网 IP、Tailscale IP 或 VPN 地址访问界面,同时保持远程页面上的宿主设置可用。
兼容性
| dsh | 插件 | 说明 |
| 0.2.1-rc.2 | 1.4.x | 当前版本,已端到端验证 |
| 0.2.0-rc.x | 1.3.x | 当时的 webserver 仍接受 0.0.0.0 |
| ≤ 0.1.7 | 1.3.x | 尚未加入通配地址限制 |
1.4.0 是针对 dsh 0.2.1 收紧 webserver 的版本。从 1.3.x 升级请先看为什么 1.4.0 必须改架构。
问题
远程浏览器要正常工作,中间隔着三件事:
1. 监听只绑回环。 dsh web 默认绑 127.0.0.1,而从 0.2.1 起 CLI 直接拒绝通配地址:
error: --host 0.0.0.0 is an unspecified (wildcard) address, which is not supported:
binding every interface would expose remote code execution to the network
2. /api 围栏拒绝未知权威。
展开完整文档(README 剩余 1 节)
dsh-web-lan-access
DeepSeek Harness Web UI 的局域网/远程访问支持插件。
一条命令绑定所有网口,从局域网 IP、Tailscale IP 或 VPN 地址访问界面,同时保持远程页面上的宿主设置可用。
兼容性
| dsh | 插件 | 说明 |
| 0.2.1-rc.2 | 1.4.x | 当前版本,已端到端验证 |
| 0.2.0-rc.x | 1.3.x | 当时的 webserver 仍接受 0.0.0.0 |
| ≤ 0.1.7 | 1.3.x | 尚未加入通配地址限制 |
1.4.0 是针对 dsh 0.2.1 收紧 webserver 的版本。从 1.3.x 升级请先看为什么 1.4.0 必须改架构。
问题
远程浏览器要正常工作,中间隔着三件事:
1. 监听只绑回环。 dsh web 默认绑 127.0.0.1,而从 0.2.1 起 CLI 直接拒绝通配地址:
error: --host 0.0.0.0 is an unspecified (wildcard) address, which is not supported:
binding every interface would expose remote code execution to the network
2. /api 围栏拒绝未知权威。 每个请求的 Host 必须是回环、监听器自身的绑定字面量,或已声明的 trustedHosts 条目。通配绑定没有自己的字面量——0.0.0.0 匹配不上任何请求 Host——于是页面壳能加载,但所有 /api 请求返回 403,会话永远出不来。
3. 宿主设置受 isLoopback 门控。 client-connection 由 isLoopback: transport?.ownsHost === true 推导该标志,客户端插件据此决定能否访问宿主面。从局域网或 Tailscale 地址打开的页面按主机名不是回环,所以即使认证成功,模型页和插件设置页仍然是空的。
原理
两块小改动,都可逆。
替换 webserver 行
lib/webserver.js 继承 @deepseek-ai/dsh-host-webserver,只改两处:
- Config 委托给原版 schema,仅豁免通配地址那一条拒绝。非字面量 host、端口越界、缺端口仍然照原样失败——放宽范围只有一条错误信息那么宽。
- getOrigin() 绝不返回通配 origin。父类用绑定地址拼 URL,0.0.0.0 会拼出 http://0.0.0.0:3080——浏览器根本拨不通。通配监听改为报告回环地址,而 --public-url 仍会在上层覆盖对外宣告的根地址。
其余全部原样继承:服务名、路由、index tap、TLS、gzip、监听生命周期。
从实时网卡列表扩宽 /api 围栏
bundle patch 从本机当前所有非内部 IPv4 推导 trustedHosts,局域网、Tailscale(100.x)、VPN 地址全部接受,无需逐 IP 配置。
注入宿主所有权 bootstrap
通过 webserver 官方 index-tap 扩展点(webServer.tapIndex),在 的第一个脚本位置注入,早于启动清单和 shell 入口。它声明 ownsHost: true 并保留普通 HTTP fetch transport;如果其他 shell 已提供 transport,则不会替换。
1.4.0 移除了什么: crypto.randomUUID polyfill。从 0.2.1 起 DSH 通过 @deepseek-ai/dsh-util-crypto 生成 UUID,它基于 crypto.getRandomValues(非安全上下文可用),所以纯 HTTP 的局域网页面已无需补丁即可渲染。旧 polyfill 所绕过的 bug 已不存在。
为什么 1.4.0 必须改架构
1.3.x 及更早版本的做法是把 host: '0.0.0.0' 写进原版 webserver 行的 config。0.2.1 让这个做法因两个独立原因失效:
1. webserver 自己的 schema 现在拒绝通配地址,该行校验失败,启动直接中止并报 3 required plugins did not activate。
2. patch 无法改目标的 name——app-boot 会跳过任何 name 与目标不符的补丁——所以无法原地把该行换成自定义模块。
因此 1.4.0 禁用原版行(disabled: true,启动审计会跳过),并用新 id 挂载子类。同一轮升级还带来第二处损坏:web-app 不再提供 webRuntime 服务,旧表达式 ctx.webRuntime?.trustedHosts 抛 cannot get property "webRuntime" without inject。现在围栏列表直接由 os.networkInterfaces() 推导。
安装
方式一:直接发给你的 DSH(最省心 🤖)
直接在 DSH 网页对话框中把本仓库链接发给 AI,并附上指令: “帮我安装这个插件:https://github.com/AcidGr/dsh-web-lan-access”
DSH Agent 会自动在后台执行安装命令并完成配置。
方式二:CLI 命令行安装(推荐)
从 npm 安装:
dsh plugin --profile web add dsh-web-lan-access
不走 npm / 本地开发,用仓库地址:
dsh plugin --profile web add github:AcidGr/dsh-web-lan-access
重启 dsh web,浏览器硬刷新。
方式三:手动安装(无 pnpm / 离线)
PROFILE="$DSH_HOME/profiles/web" # 按实际修改 DSH_HOME 和 profile 名
mkdir -p "$PROFILE/plugins"
cp -r dsh-web-lan-access "$PROFILE/plugins/lan-access"
ln -sfn ../../plugins/lan-access "$PROFILE/node_modules/dsh-web-lan-access"
然后在 profile 的 package.json 里把 dsh-web-lan-access 加入 dsh.profile.bundles。bundle patch 会自行注册所需行,无需手改 cordis.patch.yml。
使用
插件是自包含的:bundle patch 已提供绑定 host,所以你不要传 --host(也不能传——CLI 依然拒绝 0.0.0.0)。--port、--tls-cert、--tls-key、--public-url 全部照常可用。
1. 安装插件后正常启动即可:
dsh --profile web --port 3080
patch 会从本机当前所有非内部 IPv4(局域网 192.168.x、Tailscale 100.x、VPN 接口)推导 /api 信任围栏。只要远程接口在 dsh web 启动时已就绪,局域网 / Tailscale IP 访问零额外配置:打开 http://<服务器IP>:3080 或 http://<tailscaleIP>:3080 即可正常加载会话和模型。
如果你不想让插件接管绑定(例如想保持 127.0.0.1 + 端口转发),把 dsh-web-lan-access 从 bundles 里去掉,改用 socat / rinetd / tailscale serve 从 127.0.0.1:3080 转发端口,并把转发入口地址手动加入 trustedHosts。
2. MagicDNS 主机名(如 xxx.tailXXXX.ts.net)——围栏只能自动发现 IP 字面量,无法发现主机名。想按名字访问时用可重复的 CLI 参数补上:
dsh --profile web --trusted-host myhost --trusted-host myhost.tailXXXX.ts.net
或者把 connection 行的 trustedHosts 换成字面量列表,并保留你需要的网卡地址:
- id: connection
config:
trustedHosts:
- <短名> # 如 myhost —— 必须单独列出!
- <名称>.tailXXXX.ts.net # 完整域名
- 192.168.1.10 # 保留你的 IP:字面量列表会完全替换
- 100.64.0.5 # 掉推导表达式
⚠️ 围栏逐字比对 Host 头:MagicDNS 短名(http://myhost:3080)≠ 完整域名,短名必须单独列一行,否则所有 /api 请求返回 403(页面壳能开、会话/模型全无)。
⚠️ 往 connection.config.trustedHosts 写纯列表是替换而非合并 bundle 的推导表达式。要么保留推导表达式并用 --trusted-host 追加名字,要么把你需要的每个 IP 都写全。不要混用。
宿主所有权范围
该 transport 信号会启用 DSH 当前归入“拥有宿主”的全部客户端界面,并非只启用模型页。其中包括宿主持久化设置,以及打开生成文件等宿主原生操作。仅应在已认证的远程浏览器确实用于操作 agent 主机时使用本插件。DSH 的 Host/Origin 围栏和浏览器认证仍然生效;此信号改变的是客户端能力投影,不是请求认证。
旧版 harness 如果仍在服务端把特权方法限制为仅回环,这些方法仍会返回 403。客户端 bootstrap 不会削弱服务端围栏。
验证
1. bootstrap 已注入
curl -s http://127.0.0.1:3080/ -b <cookie> | grep lan-access-bootstrap
2. 所有网口都在监听(地址列为 0.0.0.0) ss -ltnp | grep 3080
3. 围栏放行你的网卡 IP、拒绝其他
curl -s -o /dev/null -w '%{http_code}\n' -H "Host: 100.64.0.5:3080" http://127.0.0.1:3080/api # 401
curl -s -o /dev/null -w '%{http_code}\n' -H "Host: evil.example:3080" http://127.0.0.1:3080/api # 403
401 表示围栏放行了该权威、只缺会话 cookie——对没有浏览器会话的可信 IP 而言这是预期结果。403 表示权威被拒绝。再从另一台设备打开 http://<服务器IP>:3080——会话和模型应正常加载。
安全警告
绑定 0.0.0.0 会把 DSH 认证入口暴露到所有可达接口,包括你未必考虑过的地址——容器网桥、VPN 隧道,以及主机连接的任何其他网络。trustedHosts 是 Origin/Host 围栏而非身份认证;DSH 会另外认证浏览器。
本插件是在有意放宽 DSH 维护者刻意加入的限制:
binding every interface would expose remote code execution to the network
请只在可信网络使用;用防火墙限制网段(如 ufw allow from 192.168.0.0/16),或走 Tailscale / 带鉴权的反向代理。如果单个网口就够用,优先用原生的 dsh web --host <ip>——它不需要任何插件,而且围栏会自动信任绑定字面量。
由于本插件依赖 webserver 的 schema 与 URL 构造内部实现,未来 DSH 版本可能再次破坏它。升级前请核对兼容性表。
回滚
- bundle 安装:dsh plugin --profile web remove dsh-web-lan-access
- 手动安装:从 dsh.profile.bundles 移除 dsh-web-lan-access;bundle patch 的行随之消失,原版仅回环的 webserver 重新接管。
开发
node --test # 9 项测试,除已链接的 dsh 包外无其他依赖
lib/webserver.js 需要能从包根解析到 @deepseek-ai/dsh-host-webserver。在 profile 外开发时链接一次:
mkdir -p node_modules/@deepseek-ai
ln -sfn "$(npm root -g)/@deepseek-ai/dsh/node_modules/@deepseek-ai/dsh-host-webserver" \
node_modules/@deepseek-ai/dsh-host-webserver
许可证
MIT预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
AcidGr/dsh-web-lan-access
DeepSeek Harness(dsh)Web 插件
相关插件 · 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,344已汉化DSH
71.5
终端编码代理esengine/DeepSeek-Reasonix
· 指南 · ACP · 扩展开发 · 规格 · 官方网站 · Discord · QQ
★ 36,045已汉化DSH
71.2
工作状态行动态ccch1mneyyy/working-activity
作者:chimney@ccch1mneyyy。社区项目,非 DeepSeek 官方项目。
★ 664已汉化DSH
71.2
多模型配置管家farion1231/cc-switch
跨平台桌面一体化助手,支持 Claude Code、Codex、OpenCode、DeepSeek Harness 等工具,唯一官网 ccswitch.io
★ 151,202已汉化DSH
71.1
这是你的仓库?认领条目