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

25

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

xenoterracida
fonte

Respostas:

28

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

Namei usa seus argumentos como nomes de caminho para qualquer tipo de arquivo Unix (links simbólicos, arquivos, diretórios etc.). Namei segue cada nome de caminho até que um ponto terminal seja encontrado (um arquivo, diretório, dispositivo char, etc.). Se encontrar um link simbólico, mostramos o link e começamos a segui-lo, recuando a saída para mostrar o contexto.

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

$ 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 nameicomando faz parte do pacote de software linux-util-ng . Veja a página do manual para mais detalhes.

Steven D
fonte
pode ser, parece que o faz apenas para links simbólicos, embora eu não me lembre do que estava usando e se estava em um link simbólico.
Xenoterracide
Enquanto eu vi páginas de manual mais antigas que mencionavam apenas links simbólicos, como mostram meu exemplo e a página do manual, são palavras para todos os tipos de arquivos e diretórios.
Steven D
Não é para mim :(-lo o tempo dá uma longa lista como essa, para mim, com links simbólicos.
xenoterracide
qual versão você está usando? Estou usando o 2.18
xenoterracide
2
outra maneira útil de usar o namei para quem é preguiçoso. namei -l $PWD/public_html/Do seu diretório atual, us $ PWD para obter a lista de permissões até o seu diretório atual.
nelaaro
7

Não conheço 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
dogbane
fonte
2

Que tal uma função bash recursiva 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#] 
frielp
fonte
Este é o meu favorito porque não requer dependências. Pode querer torná-lo cd .. >/dev/nullembora para aqueles de nós com um $CDPATHconjunto (que causa cd para a saída do dir atual quando ele é usado e que interfere com a saída de sua função.)
beporter
2

Eu 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
cristão
fonte
1

Isso poderia ser facilmente transformado em uma 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, portanto 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 para o diretório atual.

(IFS="/"; set -f; for dir in $PWD; do stat -c "$PWD %A" .; cd ..; done)
ewindisch
fonte
Isso é uma frase? Perdi alguma coisa?
phunehehe
Como uma linha única para o pwd: pushd $ (pwd)> / dev / null; OIFS = $ IFS; IFS = "/"; para dir em $ (pwd); faça stat -c "$ (pwd)% A".; cd ..; feito; IFS = $ OIFS; popd> / dev / null
ewindisch
Seu script não funcionará com nomes de arquivos que contenham espaços ou caracteres brilhantes.
Gilles 'SO- stop be evil'
Gilles, acho que não. Tinha originalmente, mas eu estraguei tudo na edição. Eu removi o xargs e ele deve funcionar corretamente novamente.
ewindisch
Por que usar pushd e popd? Ou eval, para esse assunto? Você pode usar um subshell (parênteses) para manter todas as alterações locais. Você precisa de aspas duplas para proteger os nomes de diretórios com espaços e set -fdesativar o globbing. cd -Psegue todos os links simbólicos.
Gilles 'SO- stop be evil'
1

alternativamente, considere usar findcomtac

find /path -printf '%M %u %g %p\n' | tac
Luca Filipozzi
fonte