파일 및 디렉터리 집합의 권한을 검색하는 스크립트를 작성하려고 합니다. 그런 다음 각 권한이 올바르게 설정되었는지 확인하세요.
권한이 잘못 설정된 경우 권한이 잘못 설정된 디렉터리나 파일 그룹을 에코할 수 있기를 원합니다.
지금까지는 "find"를 사용하여 디렉터리 내의 모든 파일과 디렉터리를 재귀적으로 찾은 다음 통계를 실행하여 현재 권한을 반환했습니다. 그런 다음 반환된 권한 목록에서 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" {} + \)