一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

权限管理中备份恢复如何在tar解压时使用-p参数保留原始文件所有权限

时间:2026-09-02 19:30:49 编辑:袖梨 来源:一聚教程网

必须用root执行sudo tar -xpf并加--acls --xattrs --selinux才能真正还原全部权限;普通用户下-p仅改权限数字、丢属主和特殊位,且ACL、capability、SELinux等深层属性需显式参数支持。

tar -xp 解压时加 -p 确实能保留基础权限,但“保留所有权限”不等于“解压后一切正常”——它只管传统权限位(rwx、setuid、sticky、时间戳等),且效果高度依赖执行身份和目标环境。真正起作用的关键不是“有没有 -p”,而是“谁在运行、在哪解、归档里有没有、系统认不认”。

必须用 root 执行,否则 -p 形同虚设

-p 在普通用户下仅保留权限数字(如 755),但会强制把属主/属组改成当前用户,setuid(s)、sticky(t)位静默丢失,比如 /usr/bin/passwd 解压后没了 -rwsr-xr-x 中的 s,直接导致提权失效。只有 root 运行时,-p 才自动启用 --same-owner,还原 UID/GID 和特殊权限位。

  1. ✅ 正确: sudo tar -xpf app.tar.gz -C /opt/app
  2. ❌ 错误: tar -xpf app.tar.gz -C /opt/app(即使加了 -p,属主也变成你,setuid 被丢)

-p 只保基础层,ACL/capability/SELinux 需额外参数

很多报错(如 ping: Operation not permittedavc denied、目录被 chattr +i 锁死)根源不在 rwx,而在扩展属性:-p 完全不处理这些。

  1. --acls:还原 getfacl/setfacl 设置的访问控制列表
  2. --xattrs:还原扩展属性,包括 security.capability(如 cap_net_raw)和 user.* 自定义键
  3. --selinux:还原 SELinux 上下文(如 system_u:object_r:bin_t:s0),缺它 audit 日志满屏 avc

典型完整命令:sudo tar --acls --xattrs --selinux -xpf app.tar.gz -C /opt/app

别直接解压到运行中的服务目录

即使 -p 全生效,直接覆盖 /etc/usr/local 或正在运行的 /opt/myapp,也会引发隐性冲突:旧配置覆盖新配置、日志目录属主重置、服务因无法写入而崩溃。

  1. 先解压到空目录,例如:sudo tar -xpf app.tar.gz -C /tmp/restore
  2. 再用 cp -arsync -aHAX 同步关键路径(它们比 tar 更稳,且默认含 -p + 扩展属性)
  3. 覆盖前务必备份原目录:mv /opt/myapp /opt/myapp.bak.$(date +%s)

验证是否真生效,不能只看 ls -l

光看 ls -l 不够,得查底层元数据:

  1. 检查 setuid/sticky:ls -l /usr/bin/passwd(应有 s),ls -ld /tmp(应有 t
  2. 查完整权限位:stat /path/to/file | grep "Access:",确认是否含 04000(setuid)、1000(sticky)
  3. 查 ACL:getfacl /path/to/dir(非空输出才说明 --acls 生效)
  4. 查 capability:getcap /bin/ping(应显示 cap_net_raw+ep

热门栏目