rsync提示“Permission denied”指向源文件,说明本地读取权限不足。需检查源文件及所有父目录的r/x权限,确认运行用户身份、SELinux/AppArmor限制、挂载选项及不可变属性,并可选择性排除不可读文件。

遇到 rsync 同步时提示 Permission denied 且明确指向源端某个文件(如 rsync: open "/path/to/source/file": Permission denied (13)),说明问题出在本地源文件的读取权限上,而非目标端写入权限。解决核心是确认并修复源文件对当前运行 rsync 的用户是否可读。
检查源文件及父目录的读执行权限
Linux 中读取一个文件,不仅要求文件本身有读权限(r),还要求其所在**所有上级目录**具备执行权限(x)——因为目录的 x 权限控制“能否进入该目录并访问其中内容”。
- 运行
ls -l /path/to/source/file查看文件权限,确认当前用户是否有r - 运行
namei -l /path/to/source/file逐级检查每一层父目录权限,重点看是否有某一级目录缺少x(比如显示为drw-r--r--) - 常见陷阱:备份脚本用 root 运行,但源目录属主是普通用户且未开放组/其他读权限;或挂载的 NFS/CIFS 目录服务端限制了客户端权限
确认实际运行用户身份与上下文
尤其在定时任务(crontab)、systemd 服务或 sudo 场景下,环境与交互式登录不同:
- crontab 默认不加载用户 shell 配置(如
~/.bashrc),可能缺失 umask 或 PATH,导致权限继承异常;建议在 crontab 中显式设置umask 022 - 若用
sudo rsync ...,确保 sudoers 中未限制env_reset或禁止读取某些路径;也可尝试sudo -i rsync ...模拟完整登录环境 - 检查是否被 SELinux/AppArmor 限制:执行
ausearch -m avc -ts recent | grep rsync或dmesg | tail -20 | grep avc,若有拒绝日志,需调整策略或临时设为 permissive 模式验证
绕过不可读文件(非关键场景适用)
若部分文件确实无法授权(如加密密钥、敏感配置),又不想中断整个同步,可用以下方式跳过:
-
--exclude='pattern'显式排除特定路径或通配符(如--exclude='*.key') -
--skip-noop(rsync ≥ 3.2.7)跳过无法 stat 的条目,避免报错中断 -
--filter='hide, protect *.secret'隐藏匹配项,使其不参与传输逻辑 - 注意:不推荐对整个目录加
--ignore-errors,它会掩盖真实问题且可能造成数据不一致
修复文件系统级限制
极少数情况源于底层挂载选项或属性:
- 检查源路径所在分区是否为只读挂载:
findmnt -T /path/to/source,若显示ro,需先修复磁盘错误或重新挂载为rw - 确认文件未被设置不可变属性:
lsattr /path/to/source/file,若输出含i(immutable),需用chattr -i解除(需 root) - Windows 共享(Samba/CIFS)挂载时,若服务端未启用
unix extensions = yes,可能导致权限映射失败;可加挂载参数uid=youruser,gid=yourgroup,forceuid,forcegid统一身份

















