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

局域网密码门禁 startGalway/dsh-lan-auth

DeepSeek Harness
startGalway8 天前有提交已提供中文文档扫描:含敏感能力

给 Web 界面加共享密码,让局域网设备安全访问

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

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add startGalway/dsh-lan-auth
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · tool
暂无时间戳·判据 →
装得上吗[实装验证]—
本站尚未做安装检查
暂无时间戳·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 8 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

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

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

可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 11 处,展示前 11 条)
  • 写入本地文件
    packages/lan-auth/server.js:83
    fs.mkdirSync(STATE_DIR, { recursive: true, mode: 0o700 });
  • 读取本地文件
    packages/lan-auth/server.js:89
    const value = fs.readFileSync(SECRET_FILE, 'utf8').trim();
  • 写入本地文件
    packages/lan-auth/server.js:94
    fs.writeFileSync(SECRET_FILE, created.toString('base64url'), { mode: 0o600 });
  • 读取本地文件
    packages/lan-auth/server.js:172
    const text = fs.readFileSync(PASSWORD_FILE, 'utf8').trim();
  • 写入本地文件
    packages/lan-auth/server.js:206
    fs.writeFileSync(PASSWORD_FILE, hashPassword(password), { mode: 0o600 });
  • 执行外部命令固定命令
    packages/lan-auth/server.js:213
    const out = execFileSync('journalctl', ['--user', '-u', HARNESS_UNIT, '-n', '400', '--no-pager'], {
  • 发起网络请求
    packages/lan-auth/server.js:227
    const req = http.request(
  • 写入本地文件
    packages/lan-auth/server.js:260
    fs.writeFileSync(HARNESS_COOKIE_FILE, cookie, { mode: 0o600 });
  • 读取本地文件
    packages/lan-auth/server.js:272
    const cached = fs.readFileSync(HARNESS_COOKIE_FILE, 'utf8').trim();
  • 发起网络请求
    packages/lan-auth/server.js:442
    const upstream = http.request(
  • 读取密钥环境变量
    packages/lan-auth/server.js:655
    const value = process.argv[3] ?? process.env.DSH_LAN_PASSWORD;
扫描于 2026/11/4(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

二次开发:给 DeepSeek Harness 的 Web GUI 加共享密码门禁,局域网或 Tailscale 设备输密码即可使用

README

由 DeepSeek 最新模型翻译生成
dsh-lan-auth 给 DeepSeek Harness 的 Web GUI 加一道「共享密码」门禁:局域网 / Tailscale 里的设备输一次密码就能用,登录状态记住一年。 基于 DeepSeek Harness(DSH)的二次开发项目:自研的独立密码门禁进程 + 对第三方配对插件 @linxin666/dsh-remote-web-ui 的一处运行时改造。 不修改、也不重新分发 DSH 本体。 为什么需要它 DSH 的 Web GUI 只监听 127.0.0.1,而且它的 webserver 会直接拒绝 0.0.0.0(webserver: host "0.0.0.0" is an unspecified (wildcard) address)。 这是有意的安全设计,但也意味着: - 手机、平板、另一台电脑默认完全访问不到这个 GUI; - 生态里的配对插件走的是「一次性配对链接 + 二维码」路线 —— 适合自己给自己配对,不适合「家里/团队里几台设备都想用」的场景; - 想改 --host 绑到 LAN,既会打断 127.0.0.1 上的内部链路(配对插件自己要用),又会把整个 GUI 暴露给同网段的所有人。 所以这个项目把「认证」放到 GUI 前面一层可替换的进程里:共享密码 + 长期会话 cookie。
展开完整文档(README 剩余 1 节)
dsh-lan-auth

给 DeepSeek Harness 的 Web GUI 加一道「共享密码」门禁:局域网 / Tailscale 里的设备输一次密码就能用,登录状态记住一年。

基于 DeepSeek Harness(DSH)的二次开发项目:自研的独立密码门禁进程 + 对第三方配对插件 @linxin666/dsh-remote-web-ui 的一处运行时改造。
不修改、也不重新分发 DSH 本体。

为什么需要它

DSH 的 Web GUI 只监听 127.0.0.1,而且它的 webserver 会直接拒绝 0.0.0.0(webserver: host "0.0.0.0" is an unspecified (wildcard) address)。
这是有意的安全设计,但也意味着:

- 手机、平板、另一台电脑默认完全访问不到这个 GUI;
- 生态里的配对插件走的是「一次性配对链接 + 二维码」路线 —— 适合自己给自己配对,不适合「家里/团队里几台设备都想用」的场景;
- 想改 --host 绑到 LAN,既会打断 127.0.0.1 上的内部链路(配对插件自己要用),又会把整个 GUI 暴露给同网段的所有人。

所以这个项目把「认证」放到 GUI 前面一层可替换的进程里:共享密码 + 长期会话 cookie。

它做什么

手机 / 平板 / 另一台电脑 │ http://<lan-ip>:3080 或 http://<tailscale-ip>:3080 ▼ ┌──────────────────────────┐ │ dsh-lan-auth(本项目) │ │ · 密码页 / 验证码限速 │ │ · 一年期签名 cookie │ │ · Host/Origin 改写 │ │ · 注入 harness 会话 cookie│ └────────────┬─────────────┘ │ 127.0.0.1:3080(只有本机可达) ▼ DeepSeek Harness Web GUI

关键点:

1. 不改 harness 的监听。它继续只绑 127.0.0.1,外部一律经过门禁。
2. 设备只持有门禁 cookie(HttpOnly,默认 365 天)。harness 自己的浏览器会话 cookie 由门禁进程在服务端持有并注入;需要时它从 journalctl --user -u dsh-web 里取当前进程的启动 token 重新兑换,所以 dsh web 重启后门禁自动恢复。
3. 监听地址自动跟随网卡。每 60 秒枚举一次非回环 IPv4(跳过 lo / docker / br- / veth*),路由器重新分配 IP、Tailscale 重连都不需要改配置。
4. 顺手去掉配对遮罩。已经用密码认证了,再弹「此设备未配对,无法访问工作区数据」就是多余的 —— scripts/patch-remote-web-ui.js 对插件做一处最小改造,让客户端不再强制走配对通道。

特性

- 零依赖(只用 Node 内置模块),单文件服务
- 密码用 scrypt(N=16384, r=8, p=1,随机盐)存储,文件 0600
- 会话 cookie HMAC-SHA256 签名、常量时间校验、可设置有效期
- 失败限速:同一来源 IP 10 分钟内最多 8 次
- 完整代理:普通 HTTP、流式响应、WebSocket upgrade(GUI 的实时通道)
- 深链接:未登录访问 /settings?tab=x → 登录后回到原地址
- 改密码即时生效(每次登录重读密码文件)
- systemd 用户单元,开机自启

快速开始

git clone <this repo> dsh-lan-auth
cd dsh-lan-auth

安装 + 设置访问密码 + 起服务(systemd user) ./install.sh

去掉配对插件那层「未配对」遮罩(改动 lib/client.js,插件升级后需重跑)
node scripts/patch-remote-web-ui.js

看状态
systemctl --user status dsh-lan-auth.service
ss -tln | grep 3080

然后在同一网络(或同一 Tailscale 网络)的设备上打开 http://<本机地址>:3080,输入密码即可。

不想用 systemd:

./install.sh --no-systemd
DSH_LAN_AUTH_UNIT=dsh-web node ~/.local/share/dsh-lan-auth/server.js

配置

全部通过环境变量(systemd 单元里用 Environment= 或 drop-in 覆盖):

| 变量 | 默认值 | 说明 |
| DSH_LAN_AUTH_PORT | 3080 | 对外监听端口(与 harness 的端口相同,不同地址) |
| DSH_LAN_AUTH_UPSTREAM | 127.0.0.1:3080 | 被代理的 harness 地址,必须是回环权威 |
| DSH_LAN_AUTH_UNIT | dsh-web | systemd 用户单元名,用于取启动 token |
| DSH_LAN_AUTH_EXTRA_HOSTS | 空 | 额外监听的地址,逗号分隔,例如固定 IP |
| DSH_LAN_AUTH_STATE_DIR | ~/.config/dsh-lan-auth | 密钥 / 密码记录 / cookie 缓存目录 |
| DSH_LAN_AUTH_COOKIE | dsh_lan_auth | cookie 名 |
| DSH_LAN_AUTH_MAX_AGE_DAYS | 365 | 登录有效期(天) |

改密码:

node ~/.local/share/dsh-lan-auth/server.js --set-password '<new-password>'

想让所有已登录设备立即失效(重新输密码),轮换签名密钥:
rm ~/.config/dsh-lan-auth/secret
systemctl --user restart dsh-lan-auth.service

关于「二开」

这个仓库里的两部分性质不同,这里说清楚:

1. packages/lan-auth:原创代码,MIT。
2. scripts/patch-remote-web-ui.js:针对第三方插件 @linxin666/dsh-remote-web-ui(Apache-2.0)已构建产物的一处运行时补丁,作用是让 remoteChannelRequired() 直接返回 false。本仓库不包含也不分发该插件的任何源码或产物,脚本只在你本机已安装的副本上做字符串替换,并保留 client.js.orig-<时间戳> 备份。
插件升级会覆盖补丁,重跑脚本即可。

配对插件本身是个很完整的实现(二维码配对、设备名册、Cloudflare 隧道、移动端适配层等),本项目的改造只关掉它的「配对闸门」,其余能力(尤其是手机竖屏适配)保持不变。如果你需要的是「一对一授权」,直接用上游插件即可。

安全模型与边界

- 密码是共享的:知道密码的任何人都能拿到完整 GUI 控制权,包括工作区文件与终端。请按此评估风险。
- 局域网这一跳是明文 HTTP;Tailscale 链路本身加密。需要端到端 TLS 时,给 harness 配证书或在门禁前再套一层 HTTPS 反代。
- 门禁进程以你的用户身份运行,能读 ~/.dsh、journalctl,也就能拿到 harness 的启动 token —— 这是设计使然(它必须代表你完成认证)。
- 失败限速按来源 IP,重启服务会清零;没有做账号体系,也没有做 2FA。
- 本项目与 DeepSeek 官方无关,也未被打包进任何官方发行版。

目录结构

packages/lan-auth/server.js 门禁 + 反向代理(单文件,零依赖) scripts/patch-remote-web-ui.js 配对插件运行时补丁 deploy/dsh-lan-auth.service systemd 用户单元模板 install.sh 安装脚本

故障排查

| 现象 | 检查 |
| 502 / harness 认证不可用 | journalctl --user -u dsh-web \| grep 'dsh web:' 是否有启动 token;门禁重启后会自动重新兑换 |
| 打不开 | ss -tln \| grep 3080 应看到 127.0.0.1:3080 与 LAN/Tailscale 地址上的 3080 |
| 登录后又回到密码页 | 检查浏览器是否禁用 cookie;cookie 名是否与 DSH_LAN_AUTH_COOKIE 一致 |
| 仍然弹「此设备未配对」 | 没跑 scripts/patch-remote-web-ui.js,或浏览器缓存了旧 bundle(强制刷新) |
| 换网后访问不了 | 等 60 秒让门禁重新枚举网卡,或 systemctl --user restart dsh-lan-auth |
| 忘记密码 | 删除 ~/.config/dsh-lan-auth/password 后重新 --set-password |

许可

本项目代码以 MIT 发布。第三方组件的许可与归属见 NOTICE。

不提供任何担保,使用前请自行评估暴露面。
预览分享卡片长什么样 ↓startGalway/dsh-lan-auth
分享 · DeepSeek Harness Hub
startGalway/dsh-lan-auth

给 Web 界面加共享密码,让局域网设备安全访问

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