Files
teamai-global/skills/synchronet-bbs-admin/SKILL.md
T

52 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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 <IP> (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`。