解压后权限全变了
发布时间:2026-02-03 17:12       
更新时间:2026-02-04 13:35
zip 包里本来就不保存 Linux 权限信息,解压出来的脚本没有执行位属于正常现象;tar 则相反,权限是否保留取决于解压时的参数。
## tar:参数对了权限就在
解压时加 -p(--preserve-permissions,按归档恢复权限位):
tar -xzpf backup.tar.gz -C /restore
root 身份下这本来就是默认行为,普通用户则需要显式加。解压前先看归档里存了什么权限:tar -tvf backup.tar.gz,列表直接显示 rwx 位,还原前心里有底。解压到全新目录也比原地覆盖稳:覆盖时权限不一致的旧文件保留旧属性,容易留尾巴。
两点说明:属主和属组只有 root 解压时才保留,普通用户解出来一律变成自己;特殊权限位(setuid 之类)的还原不做保证,关键部署包建议解压后逐项核对。
## zip:天生无权限,靠手工补
zip 格式设计上主要保存文件内容和基本的读写标记,Linux 的执行位、属主这些元数据不在保存范围。unzip 出来的 shell 脚本没有执行位,chmod 补上即可:
chmod +x deploy.sh
批量恢复可以借用参考目录,目录里留一个权限正确的样例:
chmod --reference=参考目录 -R 目标目录
需要完整带走权限时,打包前先存一份清单:find . -exec stat -c '%a %n' {} \; > perms.txt,还原后照清单写个脚本恢复,工程上很实用。所以跨系统传包优先 tar,zip 用在"只需要文件内容"的场景,比如文档分发。两个工具的分工可以记成一句话:tar 管权限,zip 管内容,打包前先想清楚这次还原要不要原样恢复权限。
## 解压结果还受 umask 影响
新文件的默认权限由 umask 决定,常见值 022 对应文件 644、目录 755。即便 tar 带了 -p,以普通用户身份解压系统包时权限也可能被 umask 收紧。排查前先看当前值:
umask
需要临时放宽就 shell 里先执行 umask 022 再解压,别改全局配置,影响面能小则小。备份还原类操作给一套固定配方:root 身份执行、tar 解压带 -p、还原后核对关键文件的属主与执行位。服务起不来时,先看日志报的是 Permission denied 还是配置错误,对症下药,别一上来就重装环境。