そのユーザーが所有していないホームディレクトリを持つユーザーを見つけるために/etc/passwdを繰り返す1行のコマンドを使用しようとしています。
次の内容には文法エラーが含まれていますが、概念を説明するのに役立つことを願っています。
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
別の解決策ですが、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
ベストアンサー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