错误地执行了命令:
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
还将列出本地系统上但在备份中丢失的文件。