Debian

任何人都知道腳本、程序等…來檢查文件夾/文件權限和修復/恢復?

  • February 19, 2022

我不是新手。我是一名專業人士,向其他專業人士懇求他們發現了一個常見問題的快速解決方案,我知道是什麼chmod -R

這是對我的問題立即給予-1評級的回應,對於那些可能對我的調查的嚴肅性不屑一顧或否認其有效性的人來說。


在我的桌面和以 root 身份執行 Kali linux 的遠端伺服器之間試驗 sshfs(Kali 的預設設置)。設法破解系統上的所有文件和文件夾權限/所有權。我已經設法修復了一些,chmod -R 0755 在適當的地方用一個簡單的,但注意到很多仍然沒有修復。

想知道是否有 bash 腳本或其他腳本或程序可以幫助恢復正確的所有者和權限?

我找到了一個類似的腳本,但它主要用於修復主目錄。

腳本,如下:

#!/bin/bash
read -r -p "Correct file and folder permissions? [y/N] " chse
if [[ "$chse" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
 echo "Processing ..."
 find -H $(pwd) -type d -exec chmod 0755 {} \;
 # set dirs to 755
 find -H $(pwd) -type f \( -iname '*.so.*' -o -iname '*.so' \) -exec chmod 0644 {} \;
 # libs
 IFS=$'\n'
 for value in $(find -H $(pwd) -type f ! \( -iname '*.so.*' -o -iname '*.so' -o -iname '*.bak' \) -printf '%p\n'); do
   tstbin=$(readelf -l "$value" 2>/dev/null | grep -Pio 'executable|shared')
   if [ -z "$tstbin" ]; then
     tstbat=$(cat "$value" | head -c2 | grep -io '#!')
     if [ -n "$tstbat" ]; then
       perm=$(stat -c '%a' "$value")
       if [ "$perm" != "755" ]; then
         chmod 755 $value
         echo "Set script  755 $value"
         # set batch to 755
       fi
     else
       perm=$(stat -c '%a' "$value")
       if [ "$perm" != "644" ]; then
         chmod 644 $value
         echo "Set regular 644 $value"
         # set regular files to 644
       fi
     fi
     # above aren't elf binary
   else
     perm=$(stat -c '%a' "$value")
     if [ "$perm" != "755" ]; then
       chmod 755 $value
       echo "Set binary  755 $value"
       # set elf binaries to 755
     fi
   fi
 done
 unset IFS
 # process linux permissions for files and folders
else
 echo "Aborted."
fi

有沒有人發現任何更重要的東西可以修復文件系統的權限和所有權?


--> Update: <--

沒有找到理想的解決方案,我已著手修改上述腳本並使其有助於我想要的解決方案:

permafix.sh - github 上的要點

#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'


# ====================================================================
# --> Documentation <--
# ---------------------
#
# 0755 21 root root  .
# 0755 21 root root  ..
# 0755  2 root root  bin
# 0755  4 root root  boot
# 0755 15 root root  dev
# 0755 53 root root  etc
# 0755  4 root root  home
# 0755  7 root root  lib
# 0700  2 root root  lost+found
# 0755  6 root root  media
# 0755  2 root root  mnt
# 0755  4 root root  opt
# dr-xr-xr-x 87 root root  proc # Not touching this.
# 0744  8 root root  root
# 0755  2 root root  sbin
# 0755  3 root root  share
# 0755  4 root root  srv
# 0755 12 root root  sys
# 1777  7 root root  tmp
# 0755 12 root root  usr
# 0755 13 root root  var
#
# ========================================================================

read -r -p "Correct file and folder permissions? [y/N] " chse
if [[ "$chse" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
   echo "Processing ..."
   #################
   # Special Cases #
   #################
   
   SDIR=("/lost+found" "/root" "/tmp")
   for sd in ${SDIR[-1]}; do
       perm=$(stat -c '%a' "$sd")
       user=$(stat -c '%U' "$sd")
       group=$(stat -c '%G' "$sd")
       if [ $sd = "/tmp" ]; then
           if [ "$perm" != 1777 ]; then
               chmod 1777 $sd
               echo "Set directory to 177 $sd"
           fi
       elif [ $sd = "/lost+found" ]; then
           if [ "$perm" != 0700 ]; then
               chmod 0700 $sd
               echo "Set directory to 0700 $sd"
           fi
       elif [ $sd = "/root" ]; then
           if [ "$perm" != 744 ];then
               chmod 744 $sd
               echo "Set directory to 744 $sd"
           fi
       else
           echo "Abort!"
       fi
       # Do change in ownership
       if [ "$user" != root ]; then
           chown root $sd
           echo "Set user to root $sd"
       fi
       if [ "$group" != root ]; then
           chgrp root $sd
           echo "Set group to root $sd"
       fi
   done
   ###############
   # Directories #
   ###############
   DIR=("/bin" "/boot" "/dev" "/etc" "/home" "/lib" "/media" "/mnt" "/opt" "/sbin" "/share" "/srv" "/sys" "/usr" "/var")
   for pd in ${DIR[-1]}; do
       perm=$(stat -c '%a' "$pd")
       user=$(stat -c '%U' "$pd")
       group=$(stat -c '%G' "$pd")
       if [ "$perm" != 755 ]; then
           chmod 755 $pd
           echo "Set directory to 755 $pd"
       fi
       if [ "$user" != root ]; then
           chown root $pd
           echo "Set user to root $pd"
       fi
       if [ "$group" != root ]; then
           chgrp root $pd
           echo "Set group to root $pd"
       fi

       ############################
       # Subdirectories and files #
       ############################
       # chmod directories to 755
       find -H $pd -type d -exec chmod 0755 {} \;
       # Check library files
       find -H $pd -type f \( -iname '*.so.*' -o -iname '*.so' \) -exec chmod 0644 {} \;
   done
       
   #------#
   # libs #
   #------#
   # Assign Variables
   LIBFILES=$(find -H "$(pwd)" -type f ! \( -iname '*.so.*' -o -iname '*.so' -o -iname '*.bak' \) -printf '%p\n')
   # Now do the hustle
   for PLF in $LIBFILES; do
       tstbin=$(readelf -l "$PLF" 2>/dev/null | grep -Pio 'executable|shared')
       if [ -z "$tstbin" ]; then
           tstbat=$(cat "$PLF" | head -c2 | grep -io '#!')
           if [ -n "$tstbat" ]; then
               perm=$(stat -c '%a' "$PLF")
               if [ "$perm" != "755" ]; then
                   chmod 755 $PLF
                   echo "Set script 755 $PLF"
                   # set batch to 755
               fi
           else
               perm=$(stat -c '%a' "$PLF")
               if [ "$perm" != "644" ]; then
                   chmod 644 $PLF
                   echo "Set regular 644 $PLF"
                   # set regular files to 644
               fi
           fi
           # above aren't elf binary
       else
           perm=$(stat -c '%a' "$PLF")
           if [ "$perm" != "755" ]; then
               chmod 755 $PLF
               echo "Set binary 755 $PLF"
               # set elf binaries to 755
           fi
       fi
   done
   unset IFS
   # process linux permissions for files and folders
else
   # When shit goes pear shaped
   echo "Aborted."
fi

還有其他方法可以做到這一點,也有更好的方法來編寫程式碼。但是,它現在有效。

--->Yet another update<---

我修復了腳本中的一個粗心錯誤,正確地重新定位了以前由於腳本結構而無法訪問的幾個變數的位置。

請使用此連結獲取此腳本的最新版本。

不存在用於修復通用系統上任意損壞權限的簡單腳本。您、您的使用者和您使用的軟體可以設置您喜歡的任何權限以滿足您的要求。過於廣泛的權限更改會失去該元數據。

首先,確定權限是如何被破壞的,例如chmod chown setfacl命令chcon。如果所有權錯誤,您需要修復它,例如將主目錄中的文件還給其所有者。注意這裡有一些微妙的東西,比如chown 會清除 setuid flags。例如,如果 /usr/bin/ping 失去 setuid root,它可能無法工作。您知道您的哪些其他程序需要 setuid 嗎?更複雜的 ACL 或 selinux 標籤不在您的解決方案中,但如果它們也是錯誤的,可能會使事情複雜化。

您可以嘗試修復它們在軟體包安裝時的權限。在基於 Debian 的系統上,您可以將dpkg --contents輸出輸入 chmod chown script。為所有已安裝的軟體包下載 .debs 以供 dpkg 查詢是讀者的練習。這對使用者數據或未通過 deb 安裝的軟體沒有任何作用。

辨識以前受文件權限保護的敏感資訊。包括但不限於 ssh 和 gpg 私鑰。出於謹慎考慮,請考慮更改這些憑據。

關於其餘的使用者數據,很難說。使用者通常(但不總是)在他們的主目錄中擁有文件。多個使用者共享目錄可能會變得棘手,因為可能不再知道正確的所有者和模式。

如果備份存在,則應使用正確的權限進行恢復。

繁瑣的工作才能正確修復。通過編寫修復數據目錄權限的自動化腳本來記錄。希望下次備份能解決問題,但最好有關於權限應該是什麼的策略。

引用自:https://serverfault.com/questions/1065180