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

服务器面板 lsl1931/dsh-server-panel

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

在浏览器里管理本机服务、文件与软件包

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

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

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

状态速览

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

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 47 处,展示前 36 条)
  • 读取本地文件
    lib/index.js:33
    return JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8")).version ?? "0.0.0";
  • 发起网络请求
    lib/client.js:300
    const response = await fetch(url, init);
  • 发起网络请求
    lib/client.js:1140
    fetch(`${BASE}/files/upload?${query}`, { method: "PUT", body: file, cache: "no-store", credentials: "same-origin" }).then(async (response) => {
  • 执行外部命令来自配置/变量
    lib/exec.js:35
    child = execFile(
  • 读取本地文件
    lib/files.js:75
    real = await realpath(abs);
  • 读取本地文件
    lib/files.js:93
    realDir = await realpath(path.dirname(abs));
  • 读取本地文件
    lib/files.js:103
    const st = await lstat(target);
  • 读取本地文件
    lib/files.js:105
    const linkReal = await realpath(target);
  • 读取本地文件
    lib/files.js:124
    st = await stat(resolved.path);
  • 读取本地文件
    lib/files.js:131
    names = await readdir(resolved.path);
  • 写入本地文件
    lib/files.js:224
    await writeFile(resolved.path, text, "utf8");
  • 写入本地文件
    lib/files.js:268
    await pipeline(readable, createWriteStream(temp, { flags: "wx", mode: 0o644 }));
  • 写入本地文件
    lib/files.js:269
    await rename(temp, target);
  • 删除本地文件
    lib/files.js:271
    await rm(temp, { force: true }).catch(() => {});
  • 写入本地文件
    lib/files.js:282
    await mkdir(resolved.path);
  • 写入本地文件
    lib/files.js:299
    await rename(from.path, dest.path);
  • 删除本地文件递归
    lib/files.js:329
    if (recursive) await rm(resolved.path, { recursive: true, force: false });
  • 删除本地文件
    lib/files.js:330
    else await rmdir(resolved.path);
  • 删除本地文件
    lib/files.js:332
    await rm(resolved.path, { force: false });
  • 写入本地文件
    lib/fsroot.js:184
    await writeFile(stage, text, { mode: 0o600 });
  • 删除本地文件
    lib/fsroot.js:195
    await rm(stage, { force: true }).catch(() => {});
  • 写入本地文件
    lib/fsroot.js:252
    await pipeline(readable, createWriteStream(stage, { mode: 0o600 }));
  • 删除本地文件
    lib/fsroot.js:265
    await rm(stage, { force: true }).catch(() => {});
  • 读取本地文件
    lib/metrics.js:37
    return readFileSync(path, "utf8");
  • 读取本地文件
    lib/metrics.js:298
    export function countProcesses(listDir = () => readdirSync("/proc")) {
  • 读取本地文件
    lib/packages.js:72
    indexUpdatedAt = statSync("/var/lib/apt/lists").mtimeMs;
  • 执行外部命令固定命令
    lib/sudo.js:123
    return spawn("sudo", ["-n", ...argv], { stdio: ["ignore", "pipe", "pipe"] });
  • 删除本地文件递归
    build.mjs:19
    rmSync(libDir, { recursive: true, force: true });
  • 写入本地文件
    build.mjs:20
    mkdirSync(libDir, { recursive: true });
  • 读取本地文件
    build.mjs:22
    const pkg = JSON.parse(readFileSync(join(root, "package.json"), "utf8"));
  • 读取本地文件
    build.mjs:26
    const hostModules = readdirSync(srcDir, { withFileTypes: true })
  • 写入本地文件
    build.mjs:36
    copyFileSync(join(srcDir, name), join(libDir, name));
  • 读取本地文件
    build.mjs:41
    const body = readFileSync(join(srcDir, "client", "index.js"), "utf8");
  • 写入本地文件
    build.mjs:55
    writeFileSync(join(libDir, "client.js"), wrapped);
  • 读取本地文件
    build.mjs:59
    const entry = readFileSync(join(libDir, "index.js"), "utf8");
  • 读取本地文件
    build.mjs:64
    readFileSync(target);
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 资源总览
  • systemd服务管理
  • 文件管理器

README

由 DeepSeek 最新模型翻译生成
dsh-server-panel 把 DSH WebUI 变成本机服务器运维控制台:侧栏一枚「服务器」图标,点开是整页面板。 不新开端口、不引 nginx、不需要图形界面——插件挂在 dsh 自己的 Web 服务与 UI 上,自动继承它的认证、主题、暗色模式与语言。 浏览器(经你的 SSH 隧道) └── 127.0.0.1:3080 dsh web ├── DSH 原有 UI └── dsh-server-panel ├── Client 半:左导航面板(总览/服务/文件/日志/软件包/网络)+ 命令面板 └── Host 半:26 条 /dsh-server-panel/* 路由 + 采样器 + root 通道 界面(v2) 顶栏:主机名 · 发行版/负载/内存摘要 · 命令面板(⌘K / Ctrl+K)· 自动刷新开关 · root 身份胶囊。 左导航:总览 / 服务 / 文件 / 日志 / 软件包 / 网络。
展开完整文档(README 剩余 1 节)
dsh-server-panel

把 DSH WebUI 变成本机服务器运维控制台:侧栏一枚「服务器」图标,点开是整页面板。
不新开端口、不引 nginx、不需要图形界面——插件挂在 dsh 自己的 Web 服务与 UI 上,自动继承它的认证、主题、暗色模式与语言。

浏览器(经你的 SSH 隧道) └── 127.0.0.1:3080 dsh web ├── DSH 原有 UI └── dsh-server-panel ├── Client 半:左导航面板(总览/服务/文件/日志/软件包/网络)+ 命令面板 └── Host 半:26 条 /dsh-server-panel/* 路由 + 采样器 + root 通道

界面(v2)

顶栏:主机名 · 发行版/负载/内存摘要 · 命令面板(⌘K / Ctrl+K)· 自动刷新开关 · root 身份胶囊。
左导航:总览 / 服务 / 文件 / 日志 / 软件包 / 网络。

| 页面 | 能力 |
| 总览 | 异常横幅(failed 单元、磁盘 ≥85%、内存 ≥90%、负载超核数、可升级包)→ CPU/内存/磁盘/系统四张 KPI 卡 → 常用服务快启(可收藏)→ 本次会话操作事件流 |
| 服务 | 分组(失败/运行中/开机自启/全部)+ 搜索;行内启停重启;右侧抽屉看状态与实时跟随的 journalctl 日志 |
| 文件 | 面包屑 + 常用位置书签;列表(名称/大小/时间/权限/属主);覆盖层大编辑器(mtime 冲突检测);上传/下载/新建/重命名/删除/chmod/chown |
| 日志 | 按单元 + 关键字过滤,实时跟随,行数可选(100–1000) |
| 软件包 | apt 模拟升级得出的可升级列表(当前 → 候选)、单包/全部升级、刷新索引、已安装查询 |
| 网络 | 网卡卡片(IP + 实时速率)、监听端口(root 时含全部进程名)、已建立连接 Top、防火墙现状 |

命令面板覆盖:跳页、解锁/锁定 root、刷新、暂停轮询、打开 /etc、打开 /var/log、刷新 apt 索引、升级全部。

权限模型

未解锁 ──[面板里输入 sudo 密码]──▶ 已解锁(root 身份,可一键锁定) ├ 文件:白名单(~、/etc、/var/log…) ├ 文件:全盘可读可写 ├ 日志:仅本用户可见 ├ 日志:全量 ├ 服务:只读 ├ 服务:启停/重启/自启 └ 软件包:只读 └ 软件包:更新/升级

- 解锁后所有模块的请求自动带 root=1,不再逐模块判断;未解锁时点到需要权限的操作会直接弹解锁框,解锁后自动重试。
- 写系统目录(/etc /boot /usr /lib /bin /sbin /var/lib)必须二次确认;关键目录(/、/etc、/usr、/home …)拒绝删除。
- 密码只写进 sudo -S 的 stdin,只存 dsh 进程内存;锁定、空闲 10 分钟、插件卸载即清除并 sudo -k。错误信息归一化,不回传 PAM 细节。
- 端口仍只监听 127.0.0.1,走你的隧道;不要把 3080 暴露到局域网。

路由

| 方法 | 路径 | 说明 |
| GET | /health /overview | 插件自述 / 资源快照 |
| GET | /services /services/logs | 单元列表 / journalctl |
| POST | /services/action | start/stop/restart/reload/enable/disable(需 root) |
| GET/POST | /sudo/state /sudo/unlock /sudo/lock | 身份通道 |
| GET/PUT/POST | /files/list /read /write /download /upload /mkdir /rename /delete /chmod /chown /roots | 文件管理(root=1 走 root;confirm=1 过系统目录闸门) |
| GET | /packages/upgradable /packages/installed | apt 查询 |
| POST | /packages/update-index /packages/upgrade | 需 root |
| GET | /network/overview /network/listeners /network/connections | 网卡/端口/连接 |

目录

src/index.js Host 入口:配置、采样器、sudo 会话、路由注册 src/routes.js 26 条路由:root 切换 + 系统目录闸门 + 错误码映射 src/fsroot.js root 文件传输层(sudo -n find/cat/cp/mv/rm/chmod/chown) src/files.js 普通身份文件服务(白名单 + realpath + mtime 乐观锁) src/metrics.js /proc 采样(CPU/内存/磁盘/网络/进程) src/services.js systemctl / journalctl 封装 src/packages.js apt 模拟升级解析、索引刷新、升级 src/network.js ip -j addr / ss 解析 src/sudo.js 内存态 sudo 会话(unlock/runRoot/spawnRoot/lock/dispose) build.mjs 零依赖构建:src/.js → lib/.js,客户端包进模块加载器工厂

安装与迭代

node build.mjs # 构建
node test/run.mjs # 10 个测试文件、90+ 断言
安装:plugin_manager → install_bundle,target = 本目录绝对路径

重要:Host 半是 Node 模块,同一路径的模块在同一进程里只会求值一次——改了 src/.js 之后必须重启 dsh(电源按钮)才会加载新世代;只改 cordis.patch.yml 的 config 会即时生效。客户端半由页面加载,重启后一并刷新。

License

MIT © 2026 lsl1931 — 仓库:<https://github.com/lsl1931/dsh-server-panel>

这个插件能在解锁后以 root 操作本机(改系统配置、启停服务、开 root 终端)。
请只在本机或可信隧道后面运行它,不要把端口直接暴露到公网。
预览分享卡片长什么样 ↓lsl1931/dsh-server-panel
分享 · DeepSeek Harness Hub
lsl1931/dsh-server-panel

在浏览器里管理本机服务、文件与软件包

这是你的仓库?认领条目

回到顶部