如何恢复 /etc 中丢失的权限元数据?

如何恢复 /etc 中丢失的权限元数据?

错误地执行了命令:

sudo chmod -R 777 /etc/

有什么方法可以返回正确状态的权限吗?

答案1

此答案假设您没有备份。

由于信息(权限元数据)在您的系统中丢失,因此如果没有外部来源,就无法恢复。

它可能是另一个 Linux,最好与您的发行版相同。

首先,将权限设置回,所有目录为 755,所有文件为 644。您可以/etc使用以下脚本执行此操作:

find -type d -print0|xargs -n 500 -P 1 -0 chmod 755
find -type f -print0|xargs -n 500 -P 1 -0 chmod 644

其次,将权限数据转储到文本文件中在另一个系统上用命令

find -print 0|xargs -0 -P 1 -n 500 ls -ld|sort -k +9 > permdata_ok.txt

您将permdata.txt在远程系统上获得一个。需要排序,稍后我会解释为什么。将此文件从远程系统移动到本地系统。

在本地系统上也执行相同的脚本,但permdata_ok.txt使用permdata_bad.txt.

现在窍门来了。将这些文件放在一起比较!

命令是:diff -urNw permdata_bad.txt permdata_ok.txt。如果您不是开发人员,它的输出语法对您来说不会很漂亮,但您可以习惯它。

您将看到文件模式和文件中的差异。如果差异太大,请手动设置回来。

由于并非所有文件都存在于两个系统上,因此您需要一些理性的思考。

如果您的系统对安全敏感,最好在第一步中设置为700/ everything 。600那么以后你会遇到更多与权限相关的问题,但不会造成安全漏洞。

答案2

如果您有备份,即使它是旧的 - 使用star

cd /
star -xpU -meta pat=etc* < backup.tar

这不会恢复内容,而只会恢复文件的元数据,例如权限所有者......)。

如果您有相同操作系统版本的第二个安装,请使用以下命令从该系统进行元数据备份:

cd /
star -c -meta etc > /tmp/backup.tar

然后使用以下命令提取损坏系统上的元数据:

cd /
star -xpU -meta < backup.tar

如果这不适用于您,则需要重新安装...

请参阅手册页http://schilytools.sourceforge.net/man/man1/star.1.html了解更多信息。

正如 @dsstorefile1 所提到的,如果损坏的系统上没有参考系统上丢失的文件,则从另一个系统复制元数据才是完整的解决方案,但您可以在元数据恢复后检查 /etc/ 中的文件与损坏一样年轻但比恢复更旧的文件仍然有 777。

BTW:star还可以用于比较权限,因为star -diff允许比较文件内容和所有元数据,更重要的是,star允许使用该diffopts=选项配置比较的内容。

因此,如果您有来自另一个类似系统的备份,您可以运行:

cd /
star -diff -v diffopts=perm pat=etc* < backup.tar

仅比较权限。如果该备份是使用创建的star -c -dump ...

cd /
star -diff -vv diffopts=perm,dir pat=etc* < backup.tar

还将列出本地系统上但在备份中丢失的文件。

相关内容