setfacl --restore 是最接近“一键修复”的方案,但需同版本系统权限快照;否则须按依赖顺序分层抢救,因 chmod 硬编码会破坏 /tmp(1777)、/etc/shadow(000)、sudo(4755)等关键路径的特定权限规则。

没有真正意义上的“一键修复”,setfacl --restore 是最接近的方案,但前提是已有同版本系统的权限快照;否则必须分层抢救,且顺序错不得。
为什么不能直接用 chmod 重新设回常见权限?
因为系统中不同路径的权限规则差异极大,硬编码恢复会遗漏关键细节:
-
/tmp和/var/tmp必须是1777(带 sticky bit),否则systemd、dbus等服务启动失败 -
/etc/shadow正常权限是000,不是600;设成600仍可能被root组成员读取,违反安全契约 -
/usr/bin/sudo必须含 setuid 位(即4755),仅755无法提权,777则被内核拒绝加载 -
/dev下设备节点权限由udev动态管理,手动改权限后重启可能被重置,或导致内核拒绝访问硬件
getfacl + setfacl 恢复的前提和实操要点
这是目前唯一能批量还原原始权限模型的方法,但有三个硬性条件:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 必须有一台同发行版、同大版本(如 Ubuntu 22.04)、最好同内核的小版本的干净系统(虚拟机即可)
- 在干净系统上执行:
sudo getfacl -pR / > ubuntu-perms.acl—— 注意-p(保留绝对路径)不可省,否则setfacl会报路径不存在 - 故障机若已无法启动,需从 Live USB 进入,
mount /dev/sda1 /mnt后chroot /mnt再运行:sudo setfacl --restore=/path/to/ubuntu-perms.acl - 若故障机仍可登录但
sudo失效,先紧急修复:chmod 4755 /usr/bin/sudo和chmod 440 /etc/sudoers,否则后续命令无法执行
没备份时必须优先抢救的几类路径
按依赖关系排序,漏掉前一项,后一项大概率无效:
- 特权二进制文件:
/bin/su、/usr/bin/sudo、/usr/bin/passwd、/bin/ping→ 全部设为4755 - 敏感配置文件:
/etc/shadow→000,/etc/gshadow→000,/etc/sudoers→440,/etc/ssh/ssh_host_*_key→600 - 关键目录:
/tmp、/var/tmp→1777;/root→700;/root/.ssh→700;/etc→755 - 不要碰
/proc、/sys、/dev—— 它们是虚拟文件系统,强行chmod无效甚至触发 panic
最易被忽略的是:即使所有权限都“看起来”设对了,systemd 单元文件若因 /usr/lib/systemd/system 权限异常被拒载,服务仍不会启动——这时得查 journalctl -b | grep "Failed to load",再针对性修复对应目录权限。

















