diff --git a/skills/synchronet-bbs-admin/CONTRIBUTORS b/skills/synchronet-bbs-admin/CONTRIBUTORS new file mode 100644 index 0000000..d8649da --- /dev/null +++ b/skills/synchronet-bbs-admin/CONTRIBUTORS @@ -0,0 +1 @@ +root diff --git a/skills/synchronet-bbs-admin/SKILL.md b/skills/synchronet-bbs-admin/SKILL.md new file mode 100644 index 0000000..395bf13 --- /dev/null +++ b/skills/synchronet-bbs-admin/SKILL.md @@ -0,0 +1,51 @@ +--- +name: "synchronet-bbs-admin" +description: "修 Synchronet BBS(bbsio/synchronet docker) 的 sysop 注册/系统密码/远程访问/临时IP封禁。触发词:BBS 注册失败、Login/SY 卡住、system password、被 ban、sysop 登不上。" +--- + +# Synchronet BBS sysop / 系统密码 排错修复 + +针对已部署的 `bbsio/synchronet` 容器(`sbbs`,端口 2323→23 / 2222→2222,数据卷 `/root/docker/sbbs-data`)。用户问"BBS 注册不了/Login 卡住/SY 输密码不对/被 ban"时用。 + +## 第一步先分清:3.19 读 main.cnf,不读 sbbs.ini + +这个镜像跑的是 **Synchronet 3.19**(banner 会打 `Version 3.19`)。3.19 的系统密码是从 `ctrl/main.cnf` ——一个**二进制定长字段文件**——顺序读取的(`read_main_cfg()` 里 `get_str(cfg->sys_pass, instream)`),而 **`sbbs.ini` 的根层级 `password`/`settings` 键是 3.20+(master)才支持的**。所以改 `sbbs.ini` 对 SY 密码**完全无效**(这是最容易白费的弯路)。 + +## 关键事实(源自源码验证) + +- main.cnf 字符串字段顺序:`sys_name, sys_id, sys_location, sys_phonefmt, sys_op, sys_guru, sys_pass, sys_nodes, ...` → 系统密码是**第 7 个字符串字段**,镜像默认值是 `SYSPASS`。 +- `chksyspass()` 用 `getstr(...K_UPPER | K_NOECHO)` 提示输入(输入被转大写、不回显),用 `stricmp` 比较(**不区分大小写**)。所以在 `SY:` 处输入密码即可,大小写无所谓。 +- 远程 sysop 需要 `sys_misc` 里 `SM_R_SYSOP` 位(1<<15 = 32768)。 + +## 修复步骤 + +1. **定位文件**:宿主机 `/root/docker/sbbs-data/ctrl/main.cnf`(容器内 `/sbbs-data/ctrl/main.cnf`,`/sbbs/ctrl` 是软链)。 + +2. **改密码**(保持 7 字节同长,原地替换默认 `SYSPASS`): + ```bash + python3 -c "d=open('/root/docker/sbbs-data/ctrl/main.cnf','rb').read(); \ + assert d.count(b'SYSPASS')==1; d2=d.replace(b'SYSPASS', b'123456', 1); \ + assert len(d2)==len(d); open('/root/docker/sbbs-data/ctrl/main.cnf','wb').write(d2)" + ``` + ⚠️ 长度必须一致(7 字符对 7 字符)。若要更长/更短的密码,用 `scfg` 交互改(`docker exec -it sbbs /sbbs/exec/scfg`),别硬改破坏定长字段。 + 想开远程 sysop:把对应 `sys_misc` 字段(4 字节 little-endian int)设为 32768;默认镜像可能已带 SM_R_SYSOP(日志见下)。 + +3. **重启容器**:`docker restart sbbs`。 + +4. **验证**:`telnet 127.0.0.1 2323` → `Login:` 输 `New` → `SY:` 输密码 → 应进入 "Creating sysop account...",之后能正常建号登录。 + +## 日志判读(docker logs sbbs) + +- `System password attempt: 'XXX'` → 已过远程权限检查(SM_R_SYSOP 满足),只是 XXX 跟当前 `cfg.sys_pass` 不匹配 → 改密码或用正确的。 +- `Remote sysop access disabled` → `SM_R_SYSOP` 位没设,需设置 `sys_misc` 位或改回 main.cnf。 +- `!TEMPORARY BAN of (N login attempts...)` → 连续失败或被当成高危用户名触发封禁。 + +## 防封踩坑(重要) + +- 千万别在 `Login:` 输 `Sysop`/`Admin` 这类**高危用户名**——Synchronet 把它列入 blocked user name,**1 次尝试就临时封 IP 10 分钟**(`LoginAttemptTempBanThreshold` 是 20 只对普通错密码,高危名是特例)。 +- 临时封禁是**运行时内存态**:`docker restart sbbs` 立即清掉。 +- 用户终端可能"首字母自动大写"(如输入 nightstar 变 NIGHTSTAR)——没关系,比较是 `stricmp` 不区分大小写,且 SY 输入被 K_UPPER 转大写,所以输入大写或小写都过。 + +## 完成判据 + +`Login:`→`New`→`SY:`→密码后能创建 sysop 账户,之后正常 `Login:` 登入。日志里不再出现 `password verification failure` / `Remote sysop access disabled`。