84b388fae2
文件推送与文件管理对齐:非 root 默认 auto_sudo 时使用 sudo -n rsync; 新增批量 sudoers 补丁脚本以补全 rsync 白名单。
44 lines
1.8 KiB
Markdown
44 lines
1.8 KiB
Markdown
# Changelog — 2026-06-11 rsync 推送非 root 自动 sudo 提权
|
||
|
||
## 摘要
|
||
|
||
文件推送(rsync)与文件管理对齐:**非 root SSH 用户**在默认 `files_elevation=auto_sudo` 下,远程接收端自动使用 `sudo -n rsync`,不再裸连导致宝塔 `www:www` 站点目录 Permission denied。
|
||
|
||
## 动机
|
||
|
||
- 用户反馈:温胜夜两台子机推送失败,诊断 `touch` 权限被拒绝
|
||
- 产品设计已定:除 root 外默认 `auto_sudo` 自动提权;此前 rsync 推送未接入该策略
|
||
|
||
## 变更
|
||
|
||
| 文件 | 说明 |
|
||
|------|------|
|
||
| `server/utils/rsync_elevation.py` | 非 root 且非 `off` → `--rsync-path=sudo -n rsync` |
|
||
| `server/application/services/sync_engine_v2.py` | `_rsync_push` 接入提权;日志含 `rsync=sudo` |
|
||
| `server/api/sync_v2.py` | 诊断写入测试走 `exec_ssh_command_with_fallback` |
|
||
| `server/api/servers.py` | `setup-files-sudo` 模板增加 rsync |
|
||
| `docs/deploy/nexus-files-sudoers.example` | 增加 rsync |
|
||
| `server/infrastructure/ssh/files_capability.py` | 白名单探测含 rsync,提示推送 |
|
||
| `scripts/batch_patch_files_sudoers.py` | 批量补全 sudoers(含 rsync) |
|
||
| `scripts/batch_patch_files_sudoers.sh` | 包装入口 |
|
||
| `tests/test_nexus_files_sudoers.py` | 模板单测 |
|
||
|
||
## 迁移 / 重启
|
||
|
||
- 需重启 API / 重建 Docker 镜像
|
||
- **目标机**:已有 `nexus-files` sudoers 须补 `/usr/bin/rsync`(或重新点「一键配置 sudo」)
|
||
- 无 DB 迁移
|
||
|
||
## 验证
|
||
|
||
```bash
|
||
pytest tests/test_rsync_elevation.py tests/test_nexus_files_sudoers.py tests/test_rsync_push_permissions.py -q
|
||
bash scripts/batch_patch_files_sudoers.sh --name 温胜夜
|
||
```
|
||
|
||
部署后:非 root 服务器推送 → `sync_logs.push_permission` 含 `rsync=sudo`;诊断写入 ✓(或 `path_elevated=true`)。
|
||
|
||
## 回滚
|
||
|
||
Revert 上述文件;推送恢复为仅 root 可写 www 目录(或手动 chmod)。
|