발견된 각 파일이 지정된 테스트 조건을 충족하는 경우에만 에코되도록 bash 스크립트의 테스트를 수정했습니다.

발견된 각 파일이 지정된 테스트 조건을 충족하는 경우에만 에코되도록 bash 스크립트의 테스트를 수정했습니다.
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"

관련 정보