tar 不具备打包前自动校验读取权限的功能,需通过 find + test 脚本预检可读性、权限合规性及文件占用状态,确保备份一致性与安全性。

tar 本身不提供“打包前自动校验读取权限合规性”的内置功能。它不会主动检查源文件是否可读、是否被进程占用、或是否符合某种策略(如仅允许属主可读的配置文件)。但你可以通过 Shell 脚本在调用 tar 前完成这一校验,且逻辑清晰、执行可靠。
用 find + test 批量验证可读性
核心思路是:对每个待归档路径,用 test -r 判断是否对当前用户(或 root)可读。若任一文件不可读,立即中止流程。
- 若以 root 打包(推荐),运行:find /path/to/backup -type f ! -readable -print —— 输出所有不可读文件,可用于诊断
- 脚本中可这样断言:find /opt/app -type f ! -readable | grep -q '^' && { echo "ERROR: unreadable files found"; exit 1; }
- 注意:-readable 是 bash 内置 test 的扩展,依赖 shell 版本;更兼容写法是 [ -r "$file" ] 配合循环
检查关键权限位与敏感路径
仅“可读”不够,还需确认是否符合安全策略,比如配置文件不应全局可写、密钥文件应严格限制权限。
- 查 world-writable 普通文件:find /etc -type f -perm -o+w 2>/dev/null
- 查私钥文件权限过宽:find /etc/ssl /root/.ssh -name "*.key" ! -perm 600 2>/dev/null
- 建议将这类检查写入预检函数,失败时打印具体路径并退出,不继续打包
规避运行时权限冲突的前置动作
真正影响备份质量的,不是“能不能读”,而是“读出来的内容是否一致”。以下情况会导致静默损坏:
- 数据库文件或日志正在被写入 → 用 lsof +FILE 或 fuser -v 检查是否被进程占用
- 文件被 chattr +i 锁定 → lsattr -d /path 可发现,需先解除锁定(需 root)
- SELinux 上下文异常导致 read denied → 临时用 cd /opt && [ -d app ] || { echo "source missing"; exit 1; }
- 第二步:运行上述 find -readable 和权限检查,任一失败则 exit 1
- 第三步:确认目标路径可写、磁盘空间充足(df -h /backup)、inode 足够(df -i)
- 第四步:执行 tar -C /opt -czf /backup/app_$(date +%Y%m%d).tar.gz app/











