任何人都知道腳本、程序等…來檢查文件夾/文件權限和修復/恢復?
我不是新手。我是一名專業人士,向其他專業人士懇求他們發現了一個常見問題的快速解決方案,我知道是什麼
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: <--
沒有找到理想的解決方案,我已著手修改上述腳本並使其有助於我想要的解決方案:
#!/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 私鑰。出於謹慎考慮,請考慮更改這些憑據。
關於其餘的使用者數據,很難說。使用者通常(但不總是)在他們的主目錄中擁有文件。多個使用者共享目錄可能會變得棘手,因為可能不再知道正確的所有者和模式。
如果備份存在,則應使用正確的權限進行恢復。
繁瑣的工作才能正確修復。通過編寫修復數據目錄權限的自動化腳本來記錄。希望下次備份能解決問題,但最好有關於權限應該是什麼的策略。