Como recursivamente verifico as permissões ao contrário?

23

Existe um comando, acho que vem com o apache, ou está de alguma forma relacionado a ele, que verifica as permissões, até o fim. Então, se eu tiver /home/foo/bar/baz , ele me dirá quais são as permissões para baz , bar , foo e home . Alguém sabe o que este comando é ou outra maneira de fazer isso? O comando começa basicamente no argumento e funciona até / para que você saiba quais são as permissões ao longo do caminho para ver se tem um problema de permissão.

    
por xenoterracide 14.01.2011 / 17:39

6 respostas

25

O utilitário que você pode estar pensando é o comando namei . De acordo com a página do manual:

Namei uses its arguments as pathnames to any type of Unix file (symlinks, files, directories, and so forth). Namei then follows each pathname until a terminal point is found (a file, directory, char device, etc). If it finds a symbolic link, we show the link, and start following it, indenting the output to show the context.

A saída que você deseja pode ser recebida da seguinte forma:

$ namei -l /usr/src/linux-headers-2.6.35-22/include/
f: /usr/src/linux-headers-2.6.35-22/include/
drwxr-xr-x root root /
drwxr-xr-x root root usr
drwxrwsr-x root src  src
drwxr-xr-x root root linux-headers-2.6.35-22
drwxr-xr-x root root include

O comando namei faz parte do linux-util-ng pacote de software. Consulte a página de manual para obter mais detalhes.

    
por 15.01.2011 / 19:34
7

Não estou ciente de nenhum comando, mas é muito fácil escrever um script:

#!/bin/bash    
ARG=$1
while [[ "$ARG" != "." && "$ARG" != "/" ]]
do
        ls -ld -- "$ARG"
        ARG='dirname -- "$ARG"'      
done

Exemplo:

$ perms.sh /tmp/1/2/3/hello.txt

-rw-rw-r--    1 user    group          0 Jan 14 16:59 /tmp/1/2/3/hello.txt
drwxrwxr-x    2 user    group       4096 Jan 14 16:59 /tmp/1/2/3
drwxrwxr-x    3 user    group       4096 Jan 14 16:43 /tmp/1/2
drwxrwxr-x    3 user    group       4096 Jan 14 16:43 /tmp/1
drwxrwxrwt   12 root     root       4096 Jan 14 17:02 /tmp
    
por 14.01.2011 / 18:06
2

Que tal uma função recursiva bash para uma solução divertida:

[bash#] function uptree { ( \ls -ld -- "$PWD"; [ "$PWD" = '/' ] && return; cd ..; uptree ) | column -t ; } 

[bash#] pwd
/home/frielp/bin/dev

[bash#] uptree
drwxrwxr-x.  2   frielp  frielp  4096  Dec  14  14:50  /home/frielp/bin/dev
drwxr-xr-x.  15  frielp  frielp  4096  Aug  23  10:48  /home/frielp/bin
drwxr-xr-x.  60  frielp  frielp  4096  Jan  14  16:48  /home/frielp
drwxr-xr-x.  4   root    root    4096  Dec  1   09:14  /home
dr-xr-xr-x.  23  root    root    4096  Jan  14  08:18  /

[bash#] pwd
/home/frielp/bin/dev
[bash#] 
    
por 14.01.2011 / 18:25
2

Acho que o comando que você procura é:

namei -l 'pwd'

que, quando executado em / tmp / foo / bar, fornece uma listagem como:

drwxr-xr-x root   root   /
drwxrwxrwt root   root   tmp
drwxr-xr-x user   group  foo
drwxr-xr-x user   group  bar
    
por 09.02.2014 / 16:41
1

Isso poderia facilmente ser feito com uma única linha. Isso não é recursivo e deve ser uma maneira relativamente rápida de fazer isso no bash. Chamar pwd em cada loop não é particularmente rápido, então evite se puder.

#!/bin/bash
if [ -n "$1" ]; then
    echo "Usage: $0 [FILE]"
    exit 1
fi
cd -P -- "$1"
IFS="/"
set -f # turn off globbing for the expansion of $PWD below
for dir in $PWD; do
    stat -c "$PWD %A" .
    cd ..
done

Alternativa, uma linha única para o diretório atual.

(IFS="/"; set -f; for dir in $PWD; do stat -c "$PWD %A" .; cd ..; done)
    
por 15.01.2011 / 05:59
1

alternadamente, considere usar find com tac

find /path -printf '%M %u %g %p\n' | tac
    
por 08.06.2015 / 07:33