해당 사용자가 소유하지 않은 홈 디렉토리가 있는 사용자를 찾기 위해 /etc/passwd를 반복하는 한 줄 명령을 사용하려고 합니다.
다음 내용에는 문법 오류가 포함되어 있지만 개념을 설명하는 데 도움이 되기를 바랍니다.
awk -F: 'BEGIN{nores=1;} {if(system( "[ -d " $6 " ]") == 0 && $7 != "/sbin/nologin" && $(system( "ls -ld $6 | awk \'{print $3}\')" ) != $1 ) {print "The directory " $6 " exists for user " $1 " but is not owned by that user"; nores=0 }} END{if (nores) print "No results";}' /etc/passwd
이는 일부 내부 테스트를 위한 CIS RHEL6 벤치마크 프로젝트 9.1.13의 쓰기 확인과 관련이 있습니다.
내가 잘못하고 있는 것을 해결하는 데 도움이 되는 솔루션을 사용할 수 있습니다.
awk -F: 'BEGIN { FS = ":"; nores = 1; } { if ((system("[ -d " $6 " ]") == 0) && ($7 != "/sbin/nologin")) { "stat -c \"%U\" " $6 | getline s; if (s != $1) { print "The directory " $6 " exists for user " $1 " but is not owned by that user"; nores = 0 } } } END { if (nores) print "No results"; }' /etc/passwd
또 다른 솔루션이지만 한 줄에 입력하여 요구 사항을 충족시킵니다.
flag=0; testuser=$(stat "/home/testuser" -c %U); while IFS=':' read -r myuser a b c d mydir e; do if [ -d "$mydir" -a "$e" != "/sbin/nologin" ]; then if [ "$myuser" != "$testuser" -a "$myuser" != $(stat "$mydir" -c %U) ]; then echo "The directory $mydir exists for user $myuser but is not owned by that user"; flag=1; fi fi done </etc/passwd; if [ $flag -eq 0 ]; then echo "No results"; fi
답변1
flag=0
testuser=$(stat "/home/testuser" -c %U)
while IFS=':' read -r myuser a b c d mydir e
do
if [ -d "$mydir" -a "$e" != "/sbin/nologin" ]
then
if [ "$myuser" != "$testuser" -a \
"$myuser" != $(stat "$mydir" -c %U) ]
then
echo "The directory $mydir exists for user $myuser" \
"but is not owned by that user"
flag=1
fi
fi
done </etc/passwd
if [ $flag -eq 0 ]
then
echo "No results"
fi
답변2
아니면 다음과 awk
같을 수도 있습니다:
awk -F: 'BEGIN { FS = ":"; nores = 1; } { if ((system("[ -d " $6 " ]") == 0) && ($7 != "/sbin/nologin")) { "stat -c \"%U\" " $6 | getline s; if (s != $1) { print "The directory " $6 " exists for user " $1 " but is not owned by that user"; nores = 0 } } } END { if (nores) print "No results"; }' /etc/passwd
답변3
그리고
perl -F: -anE 'if( (stat $F[5])[4] != $F[2] )
{ say "$F[0]($F[2]) not own $F[5]" }' /etc/passwd
당신은 당신이 원하는 것을 거의 얻었습니다. /etc/passwd에서:
- F0 = 사용자 이름
- F5 = 홈 페이지
- F2=UID
stat FileOrDir [4]
FileOrDir의 UID입니까?
조정하려면 조건을 더 추가하세요. 예:
perl -F: -anE 'if( -d $F[5] and # F5 is a directory and
(stat $F[5])[4] != $F[2] # owner(home) isNot uid
) { say ...