Debian

修復 /var(或任何其他系統目錄)上的損壞權限

  • July 21, 2021

長話短說,我/var從備份中銷毀並恢復了它 - 但備份沒有設置正確的權限,現在所有/var內容都歸根使用者所有。這似乎讓一些程序不高興。

我已經按照此處/var/cache/man的建議修復了 apt 失敗 fopen以及 apache2 無法啟動(通過授予to的所有權)。但是,現在解決所有問題的唯一方法似乎是在出現問題時手動處理權限 - 這似乎非常困難,因為我必須等待程序開始給出問題,確定問題與權限有關一些文件,然後自己設置它們。/var/lib/apache2``www-data``/var

有沒有簡單的方法來糾正這個問題?我已經嘗試重新安裝 (plain aptitude reinstall x) 中列出的每個包dpkg -S /var,但這不起作用。

實際上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

現在,您可能沒有獲得/var目錄中包含文件的所有包,因此最好將它們全部找到

➜  ~ find /var -exec dpkg -S {} + 2> /dev/null | grep -v "no path found" | wc -l 
460

在我的例子中,它佔了 460 個有包的路徑,如果你認為同一個包可以有多個路徑,這實際上更少,通過一些後處理我們可以發現是 ~122:

➜  ~  find /var -exec dpkg -S {} + 2> /dev/null | grep -v "no path found" | cut -d : -f 1 | sort | uniq | wc -l
122

這當然會計算幾個具有相同路徑的包,例如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

所以,我有 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')

這應該修復權限。

現在,還有另一種選擇,找到一個好的安裝並複制您的安裝文件權限:

chmod --recursive --reference good/var bad/var

引用自:https://unix.stackexchange.com/questions/156568