AWK & Bash: Verificando se a casa de um usuário é de propriedade do usuário

2

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
    
por Doug 09.04.2015 / 17:36

3 respostas

2

Ou o seu awk poderia ser:

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
    
por 09.04.2015 / 18:37
3
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
    
por 09.04.2015 / 18:10
2

com

perl -F: -anE 'if( (stat $F[5])[4] != $F[2] )
                   { say "$F[0]($F[2]) not own $F[5]" }' /etc/passwd 

você obtém quase o que queria. Em / etc / passwd:

  • F0 = nome de usuário
  • F5 = casa
  • F2 = uid
  • stat FileOrDir [4] é o uid de FileOrDir

Adicione mais algumas condições para ajustá-lo. Exemplo:

perl -F: -anE 'if( -d $F[5]  and               # F5 is a directory and
                   (stat $F[5])[4] != $F[2]    # owner(home) isNot uid
                 ) { say ...
    
por 09.04.2015 / 18:50