ARTICLE · 1054223
DSH 插件 kid-security 技术解读:把电脑安全讲成一座小城堡
核心结论:我们把电脑安全讲成"守护一座小城堡":防火墙是门卫、磁盘加密是保险箱、锁屏密码是锁门、远程端口是暗门、登录记录是登记簿,做成五个小工具加一张常驻安检卡,每 15 秒巡一次城,小朋友一眼能看出哪道防线在偷懒,结论统一交给大人处理。

1. 背景:给小朋友讲"安全"为什么难
kidlab 电脑启蒙系列已经覆盖了存储(大仓库)、内存(工作台)、网络(数据信旅行),这一篇补上最难讲的一块:安全。防火墙、磁盘加密、远程端口这些词,对八岁的小朋友来说太抽象。
我们选择的方案还是隐喻:电脑 = 一座小城堡,安全措施 = 城堡守卫。每一项系统安全设置都对应城堡里的一位角色,检查电脑安全就变成"点名守卫有没有在岗"。
这篇文档记录 @kidlab/dsh-kid-security 插件的完整实现:五个采集工具、一张常驻安检卡,以及系列里反复翻车的一个前端老坑的最终解法。
2. 五道守卫:把安全设置讲成城堡防线
插件提供 5 个工具,全部是真执行命令型(B 型):免 sudo、命令硬编码、单命令超时容错。
sec_wall | |||
sec_locker | fdesetup status | ||
sec_lock | |||
sec_door | netstat | ||
sec_login | last -5 |
这张表的精髓在于"每道守卫只回答一个是非题"。防火墙状态 0 是关门、1/2 是开门;暗门检查只看端口有没有人监听;登记簿只看最近五条记录。模型拿到结构化结果后,翻译成小朋友听得懂的守卫报到,而不是输出一段安全术语。
3. 工程实现的四个关键坑
真机调试时我们踩了四个坑,都和"macOS 命令的真实脾气"有关:
systemsetup -getremotelogin | netstat 探测端口,免 sudo 达成同样目标 | |
last -n 5illegal option -- n | last 是 BSD 语法,写 last -5 | |
grep | || true,空结果不算失败 | |
askForPassword |
四个坑指向同一条设计原则:B 型工具的每条命令都要假设它会失败、会超时、会输出空。单条命令失败只报一行,不中断整体采集——安检卡宁可少报一道守卫,也不能整卡崩溃。
4. 常驻安检卡:从"问一句答一句"到"一直看着"
系列插件分两种范式:静态插件是模型问一句答一句;动态插件(cordis 包)能在聊天输入条上方常驻一张卡片。安检卡走的是后者。
cordis/host.js | |
cordis/client.js | |
cordis/precheck.mjs | |
cordis/activate.md |
展开后的卡片自上而下是:安全分仪表 → 五道守卫逐一报到(状态圆点 + 一句话解读 + 「找大人」提示)→ 登记簿最近 5 条记录。状态用四档颜色:绿(在岗)、橙(有小缺口)、红(要补一补)、灰(看不清)。
版本管理上,cordis_define 追加的是不可变包:每次修改都追加新包再激活,旧包保留可随时回滚。安检卡迭代了三版(pkg-1 首跑 → pkg-2 内滚初版 → pkg-3 预算公式修正),全部验证通过。
5. 家族老坑的最终解:展开高度预算
这个问题系列里翻过两次车(kid-coder 时代两次):卡片展开后顶部看不见、卡片内划不动。根因是输入条上方的卡片区属于粘性页脚(sticky footer),展开是向上生长的;如果展开高度只按视口比例算、不扣除页脚的固定件,小窗口下预留不足,标题行就被顶出屏幕。
最终解沿用 kid-coder 沉淀的公式,真机验证通过:
.ks-detail{
max-height: min(calc(100vh - 450px), 480px); /* 视口 − 页脚全部固定件,另设绝对上限 */
overflow-y: auto; /* 守卫列表在卡片内部滚动 */
overscroll-behavior: contain; /* 滚到底不带动会话窗口 */
}450px 的推导:输入框、卡片区、其余四张折叠卡加上本卡标题行约 430px,再留 20px 余量。
关键洞察:这个预算是"家族规模"的函数——家族每多一张常驻卡,所有卡的预留都要跟着加一档。余量加大只影响卡片内滚长度,没有副作用,宁多勿少;预留不足则老毛病必然复发。

最终效果
6. 结论与行动建议
kid-security 补齐了"认识这台电脑"的启蒙拼图:kid-storage 管大仓库、kid-memory 管工作台、kid-security 管城堡守卫。安检的口径是启发式的——端口在监听不等于一定有入侵,登记簿出现陌生名字不等于一定是坏人,所以卡片文案统一用「找大人」收尾,结论交还家长,不吓唬小朋友。
发布前还有四件事要办:
1. package.json的files补上lib/config.js/lib/tools.js,否则npm pack出来的包是坏的。2. 静态工具 sec_wall同步区分防火墙最严格档(globalstate = 2),与安检卡口径对齐。3. 补 README、LICENSE、.gitignore 与最小测试集。 4. 本机沙箱里 tsc对 kidlab 插件 segfault(环境问题非代码缺陷),构建必须在沙箱外复核。