Bash

用於遞歸獲取文件和目錄權限的 Bash 腳本,將它們與所需的權限進行比較,如果正確則返回

  • February 15, 2017

我正在嘗試編寫一個腳本來檢索一組文件和目錄的權限。然後檢查每個權限,看看它們是否設置正確。

如果權限設置不正確,那麼我希望它回顯哪個目錄或文件組權限設置不正確。

到目前為止,我已經使用“查找”遞歸地查找某個目錄中的所有文件和目錄,然後執行 stat 返回目前權限。然後,從返回的權限列表中,我使用 if-then 語句來檢查是否有任何文件或目錄具有與預期不同的權限。這是通過 != 運算符並使用模式匹配來完成的。因此,所有文件都應將權限設置為 444,將目錄設置為 555,如果沒有返回權限錯誤。

for site in $(echo /var/www/*)
do
   permcheckfile=$(find $site -type f -exec stat -c '%a' '{}' +)
   permcheckdir=$(find $site -type d -exec stat -c '%a' '{}' +)

   if [[ $permcheckfile != *444 ]]
   then
       echo "$site file permissions are wrong"
   else
       echo "$site file permissions are correct"
   fi

   if [[ $permcheckdir != *555 ]]
   then 
       echo "$site directory permissions are wrong"
   else
       echo "$site directory permissions are correct"
   fi
done

上面腳本發現的問題是有時它會返回誤報,我不知道為什麼。

有誰知道我哪裡出錯了?有沒有更好的方法來完成我想要實現的目標?任何幫助或建議將不勝感激。感謝您的時間和幫助

您需要循環 permcheckfile 和 permcheckdir 數組。

for site in $(echo /var/www/*)
do 
   for file in $(find $site -type f -exec stat -c '%a' '{}' +)
   do
       if [[ $file != *444 ]]
       then
           echo "$site/$file permissions are wrong"
       else
           echo "$site/$file permissions are correct"
       fi
   done

   for dir in $(find $site -type d -exec stat -c '%a' '{}' +)
   do
       if [[ $dir != *555 ]]
       then
           echo "$site directory permissions are wrong"
       else
           echo "$site directory permissions are correct"
       fi
   done
done

您可以通過一次呼叫“find”來實現您所需要的一切,如下所示。它可以進一步優化,但要以清晰為代價。

#!/bin/sh
p=$(type -P printf)
site='/var/www'
cd "$site" && \
find . \
  \( -type f             -perm 444 -exec $p "$site/%s file permissions are correct.\n"      {} + \) -o \
  \( -type f           ! -perm 444 -exec $p "$site/%s file permissions are wrong.\n"        {} + \) -o \
  \( -type d ! -name . ! -perm 555 -exec $p "$site/%s directory permissions are wrong.\n"   {} + \) -o \
  \( -type d ! -name .   -perm 555 -exec $p "$site/%s directory permissions are correct.\n" {} + \)

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