Estou tentando percorrer o / etc / passwd com um comando de linha única para encontrar os usuários que têm um diretório inicial que não pertence ao usuário, mas sou muito novo para programar a programação e Eu acho que estou sendo mais eficaz no BASHing my head, do que escrever código válido: - (.
A seguir, há erros de sintaxe, mas espero ilustrar o conceito.
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
Isto está associado a escritas para o item 9.1.13 do Benchmark do CIS RHEL6 para alguns testes internos.
Solução provavelmente usarei, o que ajudou a corrigir o que fiz de errado:
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
Outra solução, mas fazendo com que ela se encaixe nos requisitos, colocando-a em uma linha:
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