修复 /var(或任何其他系统目录)上损坏的权限

jay*_*ica 7 permissions debian system-recovery

长话短说,我/var从备份中销毁并恢复了它 - 但备份没有设置正确的权限,现在所有/var内容都归 root 所有。这似乎让一些程序不高兴。

我已经/var/cache/man按照此处的建议修复了 apt 失败 fopen以及 apache2 无法启动(通过赋予/var/lib/apache2to所有权www-data)。但是,现在解决所有问题的唯一方法似乎是在出现问题时手动处理权限 - 这似乎非常困难,因为我必须等待程序开始出现问题,确定问题与权限有关一些文件,/var然后自己设置它们。

有没有简单的方法来纠正这个问题?我已经尝试重新安装 (plain aptitude reinstall x) 中列出的每个包dpkg -S /var,但这没有用。

Bra*_*iam 9

实际上apt-get --reinstall install package应该工作,至少有文件:

?  ~  ls -l /usr/share/lintian/checks/version-substvars.desc        
-rw-r--r-- 1 root root 2441 Jun 22 14:19 /usr/share/lintian/checks/version-substvars.desc
?  ~  sudo chmod +x /usr/share/lintian/checks/version-substvars.desc
?  ~  ls -l /usr/share/lintian/checks/version-substvars.desc        
-rwxr-xr-x 1 root root 2441 Jun 22 14:19 /usr/share/lintian/checks/version-substvars.desc
?  ~  sudo apt-get --reinstall install lintian  
(Reading database ... 291736 files and directories currently installed.)
Preparing to unpack .../lintian_2.5.27_all.deb ...
Unpacking lintian (2.5.27) over (2.5.27) ...
Processing triggers for man-db (2.6.7.1-1) ...
Setting up lintian (2.5.27) ...
?  ~  ls -l /usr/share/lintian/checks/version-substvars.desc
-rw-r--r-- 1 root root 2441 Jun 22 14:19 /usr/share/lintian/checks/version-substvars.desc
Run Code Online (Sandbox Code Playgroud)

现在,您可能没有获得/var目录中包含文件的所有软件包,因此最好全部找到它们

?  ~ find /var -exec dpkg -S {} + 2> /dev/null | grep -v "no path found" | wc -l 
460
Run Code Online (Sandbox Code Playgroud)

在我的例子中,它占了 460 个有一个包的路径,如果你考虑到同一个包可以有多个路径,这实际上更少,通过一些后期处理我们可以发现大约 122 个:

?  ~  find /var -exec dpkg -S {} + 2> /dev/null | grep -v "no path found" | cut -d : -f 1 | sort | uniq | wc -l
122
Run Code Online (Sandbox Code Playgroud)

这当然会计算具有相同路径的几个包,例如wamerican, aspell-en, ispanish, wspanish, aspell-es, myspell-es. 这很容易修复:

?  ~  find /var -exec dpkg -S {} + 2> /dev/null | grep -v "no path found" | cut -d : -f 1 | sed 's/, /\n/g' | sort | uniq | wc -l
107
Run Code Online (Sandbox Code Playgroud)

所以,我有 107 个包,它们在/var或子目录中有任何类型的文件。您可以使用以下方法重新安装它们:

sudo apt-get --reinstall install $(find /var -exec dpkg -S {} + 2> /dev/null | grep -v "no path found" | cut -d : -f 1 | sed 's/, /\n/g')
Run Code Online (Sandbox Code Playgroud)

这应该修复权限。

现在,还有另一种选择,找到一个好的安装并通过以下命令复制文件权限:

chmod --recursive --reference good/var bad/var
Run Code Online (Sandbox Code Playgroud)

  • 特别赞赏。最后一点适用于大多数(如果不是全部)unix:*找到一个好的安装并使用 chmod 复制安装的文件权限* (2认同)