记一次系统文件权限被误改后的恢复(Fedora)

系统:Fedora 37

最近为了方便做实验,自己构造了一套 Linux 系统,过程中原本想把镜像里的 /usr 目录权限改掉的,但不小心在宿主机环境中对 /usr 目录执行了 chmod,导致 /usr 目录权限错乱。因为 su 和 sudo 都在 /usr/bin 下,结果是 root 帐号也没法登录了。

我先用 U 盘启动 LiveCD,挂载原系统的分区,再把原系统中 sudo 和 su 的文件权限给修复了,剩下的就依靠 RPM 数据库的信息来逐个恢复了,RPM 数据库中记录了软件包中每个文件的默认权限。

1、先找出哪些软件包在 /usr/sbin、/usr/bin 中产生了文件,并输出包名(–qf 参数控制输出格式):

for i in /usr/bin/* /usr/sbin/*;do rpm -qf --qf '%{NAME}\n' $i;done | sort  | uniq > /tmp/check_ret.txt

2、用 rpm –verify 验证每个包的更改情况:

for i in `fgrep -v 不属于任何软件包 /tmp/check_ret.txt`;do rpm --verify $i;done > /tmp/verify_ret.txt

如果验证结果出现“.M”,表示文件权限被修改过,如:

.M.......    /usr/bin/crontab

每个字母含义可以看 man rpm 的“VERIFY OPTIONS”章节。

3、剩下的就是人工活了,看哪些文件的权限、所属组要调整。

尤其是缺少 s 位权限的一定要恢复,否则使用某些软件会遇到“Effective UID is not root”之类的错误。

比如上面提到的 /usr/bin/crontab 文件权限被改过,通过以下命令查出原始权限:

rpm -qf /usr/bin/crontab --dump

输出:

/usr/bin/crontab 57864 1658361704 169c7f65a02ff0357be733484de8840f0f45ebb8972b98f950dcfcd9eb0f6bd6 0104755 root root 0 0 0 X

注意到 0104755,这个字段记录的是文件类型+模式,01 表示普通文件,4755 才是文件权限,将文件权限改回来:

chmod 4755 /usr/bin/crontab

最后再次用 –verify 验证下确定是否改回来:

rpm -qf /usr/bin/crontab --verify