科技 · 实用指南
rsync 以代码 23 退出?改权限前先定位失败对象
代码 23 只说明至少一次传输出错,不等于权限诊断。把早先错误映射到对象、进程侧、操作和账号,再证明目标集合已交付。

最后的代码 23 行只是汇总。修改权限、排除项或 rsync 参数前,先保存完整输出并找到第一条具体失败。
为失败对象、sender 或 receiver/generator、文件系统操作、errno 与有效账号建立账本。只修复这个边界,再重跑真实命令并核对预期集合。
保存精确命令和完整日志
记录两端、完整命令、rsync 版本、远端用户、工作目录与退出码。从开头保存 stdout 和 stderr,或启用客户端日志;末尾代码 23 只是汇总。
不要从 sudo、chmod -R 777、宽泛排除或忽略规则开始。它们会在确认失败对象前改变身份或范围。
分类第一条具体失败
对每条早先错误记录精确路径、sender/receiver/generator 标签、open/stat/mkdir/write/rename/元数据等操作及 errno 文本。
把远程认证、协议错误和代码 24 作为独立分支。权限行与 failed verification 行需要不同的测试和修复。
用同一账号复现对象
源端证明每级父目录可遍历、对象可查找、链接目标有效并可读;目标端用一次性名称证明遍历、创建、写入、关闭、重命名及必要元数据操作。
使用与 rsync 相同的本地或远端账号、挂载、容器或服务上下文。仅按已记录操作检查空间、inode、配额、只读挂载、ACL 与身份映射。
只修复已证明的边界
修正能复现失败的最窄所有者、ACL、挂载、容量、缺失路径或参数不匹配。只有遗漏本来就是意图时才排除,并明确修改传输契约。
若受控复现证明版本相关校验缺陷,只比较受支持的修复版本或有限参数变化;不要把例外泛化成权限方案。
证明预期集合已交付
修复后执行不改变意图的真实传输并要求退出码 0,再用 dry-run 和 itemized changes 找出意外剩余工作;只有需要更强内容证明时才承担 checksum 的额外 I/O。
dry-run 不发送文件数据,也可能遇不到同样的系统调用失败,所以不能替代真实运行。真实传输成功且清单无无法解释的遗漏才算关闭。
