rsync 报 permission denied (13) 通常是目标目录写权限不足、执行用户身份不匹配或 SELinux 安全策略拦截。快速排查应优先检查目标路径权限,确认执行用户身份,最后验证安全上下文设置,避免直接使用 chmod 777 带来安全风险。
先说结论:rsync 权限错误核心在于文件系统权限与安全策略的匹配,需按顺序排查权限、用户和 SELinux。
- 先确认目标目录是否具备写权限及所有者是否匹配
- 先处理 SSH 用户身份与密码文件权限配置
- 再验证 SELinux 状态是否拦截了 rsync 操作
命令速用版
以下命令用于快速检查权限和 SELinux 状态,可在本地或远程服务器执行:
# 检查目标目录权限
ls -ld /path/to/target
# 检查 SELinux 状态
getenforce
# 临时关闭 SELinux 验证是否为策略问题
setenforce 0
# 测试手动写入权限
ssh user@remote "touch /path/to/target/testfile"
为什么会这样
权限拒绝错误 (13) 本质是系统内核返回的 EACCES 错误,意味着 rsync 进程没有足够的权限访问目标文件或目录。
常见原因包括文件系统权限不匹配,例如目标目录权限为 700 且属主非当前用户;用户身份切换问题,rsync 在传输过程中可能改变执行身份导致权限降级;以及 SELinux 安全上下文限制,即使 POSIX 权限正确,安全标签不对也会被拦截。
分步处理
1. 检查目标目录权限:执行 ls -ld 查看目标路径,确认当前用户是否有写权限。若属主不匹配,使用 chown 修改所有者或 chmod 调整权限,但避免设置为 777。
2. 验证用户身份与 SSH 配置:确认远程登录用户具备足够权限,尝试手动登录远程主机执行 touch 测试。若使用密码文件认证,确保 /etc/rsync.password 权限为 600,且文件中只输入密码信息,不要输入虚拟认证用户名称。
3. 检查 SELinux 状态:执行 getenforce 查看状态,若为 Enforcing 且怀疑拦截,可临时 setenforce 0 测试。若问题解决,需修改 /etc/sysconfig/selinux 配置文件以避免重启后设置回退。
4. 调整 rsync 参数:当源和目标权限模型存在差异时,可使用 `--no-perms` 不同步文件权限信息,或使用 `--chmod`=ugo=rwx 强制设置统一权限模式。
怎么验证是否生效
执行 touch 命令测试目标路径写入是否成功,若手动写入无误,再次运行 rsync 命令观察是否仍报错。检查日志文件如 /var/log/syslog 或 /var/log/secure,查找与 rsync 相关的错误信息是否消失。
常见坑
1. 盲目使用 chmod 777:虽然有时能解决问题,但在生产环境存在严重安全风险,不推荐作为常规解决方案。
2. 密码文件权限错误:/etc/rsync.password 文件权限必须为 600,否则 rsync 会拒绝使用并报错认证失败。
3. 模块语法错误:rsync 命令中远程路径应为 ::module_name 而非 ::/path,例如 ::backup 正确,::/backup 错误。
4. 防火墙拦截:若报错 No route to host,需检查服务端防火墙设置,确保允许 rsync 和 ssh 连接。
常见问题
SELinux 一定会导致 rsync 权限错误吗?
不一定,但当 SELinux 处于 Enforcing 模式且安全上下文不匹配时,会覆盖 POSIX 权限导致拒绝访问。
rsync 密码文件权限为什么必须是 600?
这是 rsync 的安全机制,防止其他用户读取密码文件,权限不对会导致认证失败错误。
如何避免同步过程中权限被修改?
使用 `--no-perms` 参数可不同步文件权限信息,保留目标系统原有权限设置。
参考来源
- 深入解析 rsync 权限拒绝错误 (13):从根源到解决方案
- rsync 错误排查手册:10 个常见问题及快速解决方案大全
- rsync 同步时提示 Permission Denied 如何解决?
- rsync 安装配置常见问题:如何解决权限错误?_编程语言-CSDN 问答
- Linux 下 rsync 错误处理及解决方法
- rsync failed: Permission denied (13)
- Rsync 服务故障排除指南-CSDN 博客
- Rsync 服务故障排查整理