Bash
用於遞歸獲取文件和目錄權限的 Bash 腳本,將它們與所需的權限進行比較,如果正確則返回
我正在嘗試編寫一個腳本來檢索一組文件和目錄的權限。然後檢查每個權限,看看它們是否設置正確。
如果權限設置不正確,那麼我希望它回顯哪個目錄或文件組權限設置不正確。
到目前為止,我已經使用“查找”遞歸地查找某個目錄中的所有文件和目錄,然後執行 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" {} + \)