Script Bash para obter recursivamente permissões de arquivos e diretórios, compará-los com as permissões desejadas e retornar se correto ou não

0

Estou tentando escrever um script que recupere as permissões de um grupo de arquivos e diretórios. Em seguida, verifique cada permissão para ver se estão definidas corretamente.

Se as permissões não estiverem configuradas corretamente, eu gostaria que ele ecoasse quais permissões de diretório ou grupo de arquivos estavam incorretamente configuradas.

Até agora, o que tenho é que usei 'find' para encontrar recursivamente todos os arquivos e diretórios dentro de um determinado diretório e, em seguida, execute stat para retornar as permissões atuais. Da lista de permissões retornada, uso uma declaração if-then para verificar se algum arquivo ou diretório tem permissões diferentes do esperado. Isso é realizado pelo operador! = E usando a correspondência de padrões. Portanto, todos os arquivos devem ter permissões definidas para 444 e diretórios para 555 e, se não retornar, as permissões estão erradas.

for site in $(echo /var/www/*)
do
    permcheckfile=$(find $site -type f -exec stat -c '%a' '{}' +)
    permcheckdir=$(find $site -type d -exec stat -c '%a' '{}' +)

    if [[ $permcheckfile != *444 ]]
    then
        echo "$site file permissions are wrong"
    else
        echo "$site file permissions are correct"
    fi

    if [[ $permcheckdir != *555 ]]
    then 
        echo "$site directory permissions are wrong"
    else
        echo "$site directory permissions are correct"
    fi
 done

O problema encontrado com o script acima é, por vezes, que ele retornará falsos positivos e não tenho idéia do motivo.

Alguém tem uma ideia de onde estou indo errado? Existe uma maneira melhor de realizar o que estou tentando alcançar? Qualquer ajuda ou sugestão seria muito apreciada. Obrigado pelo seu tempo e ajuda

    
por SamuelR 14.02.2017 / 21:05

2 respostas

0

Você precisa fazer o loop dos arrays permcheckfile e permcheckdir.

for site in $(echo /var/www/*)
do 
    for file in $(find $site -type f -exec stat -c '%a' '{}' +)
    do
        if [[ $file != *444 ]]
        then
            echo "$site/$file permissions are wrong"
        else
            echo "$site/$file permissions are correct"
        fi
    done

    for dir in $(find $site -type d -exec stat -c '%a' '{}' +)
    do
        if [[ $dir != *555 ]]
        then
            echo "$site directory permissions are wrong"
        else
            echo "$site directory permissions are correct"
        fi
    done
 done
    
por 14.02.2017 / 22:09
0

Você pode conseguir tudo o que precisa com uma única invocação de 'find', conforme mostrado abaixo. Pode ser ainda mais otimizado, mas ao custo da clareza.

#!/bin/sh
p=$(type -P printf)
site='/var/www'
cd "$site" && \
find . \
   \( -type f             -perm 444 -exec $p "$site/%s file permissions are correct.\n"      {} + \) -o \
   \( -type f           ! -perm 444 -exec $p "$site/%s file permissions are wrong.\n"        {} + \) -o \
   \( -type d ! -name . ! -perm 555 -exec $p "$site/%s directory permissions are wrong.\n"   {} + \) -o \
   \( -type d ! -name .   -perm 555 -exec $p "$site/%s directory permissions are correct.\n" {} + \)
    
por 15.02.2017 / 09:34