for x in $(ls -ll <path to files> | awk '{ print $3,$4 }' | tail -n +2) ; do
if [ "${x}" != "root" ] ; then
echo "Fail"
break
else
echo "Pass"
fi
done
이제 찾은 모든 파일에 대해 "Pass"를 인쇄합니다. 다음과 같은 경우 "passed"를 인쇄하고 싶습니다.모두파일의 소유자는뿌리, 그리고 다음과 같은 경우 "실패"를 인쇄합니다.어느목록에 있는 사용자 또는 그룹이 아닙니다.뿌리.
답변1
모든 파일이 루트에 속하고 루트 그룹에 속하는지 확인하려면 find를 사용하십시오.
find <path to files> ! -user root -or ! -group root -print
아무것도 반환되지 않으면 파일은 루트에 속하지 않거나 그룹 루트에 속하지 않습니다. 그런 다음 이를 조건절에 넣어 "Pass" 또는 "Fail"을 인쇄할 수 있습니다.
[[ "$(find <path to files> ! -user root -or ! -group root -print)" == "" ]] && echo "Pass" || echo "Fail"
답변2
첫째, 출력 ls
과 그 변형을 구문 분석해서는 안 됩니다. 이 문제를 해결하려면 다음 방법을 사용할 수 있습니다 stat
.
$ stat -c%U-%G ./*
tomasz-tomasz
tomasz-tomasz
tomasz-tomasz
보시다시피 결과는 원하는 결과를 얻기 위해 조작할 수 있는 두 단어 연결의 견고한 목록입니다. 루프에 넣으면 좋습니다.
PASS=true
for i in $(stat -c%U-%G ./*); do
if ! [[ "$i" == root-root ]]; then
PASS=false; break
fi
done
if "$PASS"; then
echo Pass
else
echo Fail
fi
스위치를 변경하지 않고 루프가 끝점에 도달하려면 의 값이 i
필요합니다 .root-root
./*
다른 위치를 테스트하려면 로 바꾸세요 the_dir/*
.
-
Grump가 의견에서 지적한 것처럼 구분 기호가 필요합니다 .파일이 "roo"에 속하고 "troot" 그룹에 있는 경우 문자열 비교가 실패할 수 있으므로 구분 기호는 여전히 좋은 것입니다.
다음 사항에 익숙해지세요:`ls`가 구문 분석되지 않는 이유는 무엇입니까(대신 무엇을 해야 할까요)?
답변3
어때요?
[ 1 = $({ echo root:root; stat -c"%U:%G" *; } | sort -u | wc -l) ] && echo PASS || echo FAIL
편집하다: 또는
[ -z $(stat -c"%U:%G" * | grep -vm1 root:root) ] && echo PASS || echo FAIL
답변4
ls
명령줄의 출력은 위험합니다. find
이 목적으로 쉘스크립트를 사용하는 것이 좋습니다 .
- 매개변수가
find -printf
설명되어 있습니다man find
. - 표준 출력은 파이프로 연결
grep
되고 종료 상태는 에 저장됩니다norootfile
. - 출력은 임시 파일에도 기록되고 행 수가 계산되어
numfile
(발견된 파일 수)에 저장됩니다. - "verbose" 옵션을 사용하면
-v
쉘스크립트의 출력에서 더 자세한 정보를 얻을 수 있습니다.
숨겨진 파일도 검색하려면 find .
대신 사용하십시오.find *
하위 디렉터리에서 검색하지 않으려면 -maxdepth 1
명령줄에서 find를 사용하세요.
#!/bin/bash
if [ "$1" == "-h" ]
then
echo "Usage: $0 -h # this help text"
echo " $0 -v # verbose output"
exit
fi
tmpfil=$(mktemp)
find * -xtype f -printf "%u:%g %p\n" | tee "$tmpfil" | grep -v '^root:root' > /dev/null
norootsfile=$?
numfile=$(wc -l "$tmpfil")
#cat "$tmpfil"
if [ ${numfile%% *} -eq 0 ]
then
echo "No file found; check the current directory"
elif [ $norootsfile -eq 0 ]
then
echo "Fail"
if [ "$1" == "-v" ]
then
echo "----- Found some file(s) not owned or grouped by root"
echo "user:group file-name --------------------------------"
grep -v '^root:root' "$tmpfil"
fi
else
echo "Pass"
if [ "$1" == "-v" ]
then
echo "----- Found only files owned or grouped by root"
fi
fi
rm "$tmpfil"