Bash 脚本递归获取文件和目录权限,将它们与所需权限进行比较,如果正确则返回

Bash 脚本递归获取文件和目录权限,将它们与所需权限进行比较,如果正确则返回

我正在尝试编写一个脚本来检索一组文件和目录的权限。然后检查各个权限是否设置正确。

如果权限设置不正确,那么我希望它能够回显哪个目录或文件组权限设置不正确。

到目前为止,我已经使用“find”递归查找某个目录内的所有文件和目录,然后执行 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

上面的脚本发现的问题是有时它会返回误报,我不知道为什么。

有谁知道我哪里出错了?有没有更好的方法来实现我想要实现的目标?任何帮助或建议将不胜感激。感谢您的时间和帮助

答案1

您需要循环 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

答案2

您只需调用一次“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" {} + \)

相关内容