Automaticamente encontra problemas de permissão de um diretório

1

Muitas vezes tenho o problema de um programa - por exemplo, apache - não pode acessar um determinado arquivo ou diretório.

Resolver o problema significa verificar manualmente o arquivo e todos os diretórios no caminho até a raiz e ver se o usuário ou grupo do programa pode acessá-lo. Isso é tedioso.

Qual programa é capaz de me dizer automaticamente onde está o problema?

Eu imagino que eu diga ao programa o caminho, o usuário e o grupo - e ele mostra onde está o problema. Note que estou ciente de problemas como links simbólicos versus a diretiva -FollowSymLinks do Apache que não pode ser detectada dessa maneira.

    
por cweiske 02.01.2012 / 18:59

3 respostas

4

Supondo que você tenha as permissões de root no sistema, você pode usar isso

sudo -u USER -g GROUP find ROOTDIR -exec test \! -r {} \; -ls

onde USER e GROUP devem ser substituídos pelo username e groupname cujo acesso deve ser avaliado e ROOTDIR é o diretório superior da árvore de diretórios sob a qual realizar a avaliação.

Advertências

Observe que sudo deve ser configurado apropriadamente, o que significa que a raiz deve ter permissão para atuar como qualquer usuário, bem como qualquer grupo.

Como funciona

O comando funciona executando o utilitário test para todos os arquivos e diretórios em ROOTDIR. As opções passadas para o utilitário fazem com que ele retorne o código de saída de sucesso (zero) sempre que puder não acessar um determinado arquivo ou diretório. Este código de saída é usado por find para determinar se deve imprimir o nome do arquivo ou diretório ( -ls ).

Saída

Output é a lista de arquivos e diretórios aos quais o USER: GROUP não tem acesso, com informações extras sobre cada arquivo e diretório, semelhante à saída de ls -l (ou seja, com permissões, propriedade, tempo de modificação etc).

Coisas úteis que você pode ajustar

Você pode testar diferentes tipos de permissões substituindo -r por uma opção diferente, consulte teste do homem . Você pode substituir -ls por -print se não quiser as informações extras sobre cada arquivo e diretório, mas apenas o nome delas. Note que se o comando encontrar diretórios que ele não pode atravessar, ele também irá reclamar no stderr. Dependendo do que você passar para test , isso pode ser superficial e pode ser descartado por redirecionamento.

    
por 03.01.2012 / 21:38
1

Eu montei este script shell simples [*]. Funciona melhor quando é root:

my_path=/home/me/Documents/a/b/c/file.txt               
while [[ "$my_path" != "/" ]] ; do 
   ls -lLd "$my_path"
   my_path="'dirname \"$my_path\"'" 
done

Ele ainda requer algum pós-processamento humano, mas não conheço nenhuma maneira elegante de verificar se um usuário específico tem permissão x em um diretório (seria necessário su -c "test -x" ou análise tediosa de stat -t ).

[*] funciona tanto no bash quanto no ksh

    
por 02.01.2012 / 21:25
0

O comando tree irá ajudá-lo com esta tarefa.

De man tree :

Tree is a recursive directory listing program that produces a depth indented listing of files.

Eu criei um exemplo simples para demonstrar esse uso:

$ mkdir {a,b,c}/{1,2,3}
$ ls *
a:
1  2  3

b:
1  2  3

c:
1  2  3
$ 
$ tree
.
|-- a
|   |-- 1
|   |-- 2
|   '-- 3
|-- b
|   |-- 1
|   |-- 2
|   '-- 3
'-- c
    |-- 1
    |-- 2
    '-- 3

12 directories, 0 files
$ sudo chown root b && sudo chmod go-rwx b
$ tree
.
|-- a
|   |-- 1
|   |-- 2
|   '-- 3
|-- b [error opening dir]
'-- c
    |-- 1
    |-- 2
    '-- 3

9 directories, 0 files

Você pode executar tree como o usuário em questão para ver onde o problema é iniciado. Você teria que corrigir o problema encontrado e executar novamente o programa até que não houvesse erros para usar isso como uma ferramenta de reparo, mas como você pode usar tree -if para remover o recuo e imprimir caminhos completos, você pode hackear um script que executa tree, greps para "error opening dir", concede apache acesso a esse diretório e reinicia a si mesmo.

    
por 03.01.2012 / 19:41