¿Cómo verifico los permisos de forma recursiva a la inversa?

25

Hay un comando, creo que viene con apache, o está relacionado de alguna manera con él, que verifica los permisos, hasta el final. Así que si tengo /home/foo/bar/bazque me va a decir lo que los permisos son para baz, bar, foo, y home. ¿Alguien sabe qué es este comando u otra forma de hacerlo? Básicamente, el comando comienza en el argumento y funciona hasta hacerle /saber cuáles son los permisos en el camino para que pueda ver si tiene un problema de permiso.

xenoterracida
fuente

Respuestas:

28

La utilidad en la que puede estar pensando es el nameicomando. De acuerdo con la página del manual:

Namei utiliza sus argumentos como nombres de ruta para cualquier tipo de archivo Unix (enlaces simbólicos, archivos, directorios, etc.). Namei sigue cada ruta hasta que se encuentra un punto terminal (un archivo, directorio, dispositivo char, etc.). Si encuentra un enlace simbólico, mostramos el enlace y comenzamos a seguirlo, sangrando la salida para mostrar el contexto.

La salida que desea se puede recibir de la siguiente manera:

$ 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

El nameicomando es parte del paquete de software linux-util-ng . Vea la página del manual para más detalles.

Steven D
fuente
puede ser, parece que solo lo hace para enlaces simbólicos, aunque no recuerdo lo que estaba usando y si estaba en un enlace simbólico.
xenoterracide
Si bien vi páginas de manuales más antiguas que solo mencionaban enlaces simbólicos, como lo muestran mi ejemplo y la página de manual, significa palabras para todo tipo de archivos y directorios.
Steven D
No es para mí :( lo largo da una larga lista de esa manera, para mí, con enlaces simbólicos.
xenoterracide
¿Qué versión estás usando? Estoy usando 2.18
xenoterracide
2
Otra forma útil de usar namei para aquellos que son flojos. namei -l $PWD/public_html/Desde su directorio actual us $ PWD para obtener la lista de permisos hasta su directorio actual.
nelaaro
7

No conozco ningún comando, pero es bastante fácil escribir un script:

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

Ejemplo:

$ 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
fuente
2

¿Qué tal una función bash recursiva para una solución 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
fuente
Este es mi favorito porque no requiere dependencias. Puede que desee hacerlo cd .. >/dev/nullaunque para aquellos de nosotros con un $CDPATHconjunto (que causa cd a la salida del directorio actual cuando se usa y que interfiere con la salida de su función.)
beporter
2

Creo que el comando que estabas buscando es:

namei -l `pwd`

que, cuando se ejecuta en / tmp / foo / bar, le ofrece una lista como:

drwxr-xr-x root   root   /
drwxrwxrwt root   root   tmp
drwxr-xr-x user   group  foo
drwxr-xr-x user   group  bar
cristiano
fuente
1

Esto podría convertirse fácilmente en una frase. Esto no es recursivo y debería ser una forma relativamente rápida de hacerlo en bash. Llamar a pwd en cada ciclo no es particularmente rápido, así que evítalo si puedes.

#!/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, una línea para el directorio actual.

(IFS="/"; set -f; for dir in $PWD; do stat -c "$PWD %A" .; cd ..; done)
ewindisch
fuente
¿Es eso una frase? ¿Me he perdido algo?
phunehehe
Como una línea para el pwd: pushd $ (pwd)> / dev / null; OIFS = $ IFS; IFS = "/"; para dir en $ (pwd); do stat -c "$ (pwd)% A"; discos compactos ..; hecho; IFS = $ OIFS; popd> / dev / null
ewindisch
Su script no funcionará con nombres de archivos que contengan espacios o caracteres globales.
Gilles 'SO- deja de ser malvado'
Gilles, supongo que no. Originalmente, pero lo arruiné en la edición. Eliminé los xargs y debería funcionar correctamente nuevamente.
ewindisch
¿Por qué usar pushd y popd? O eval, para el caso? Puede usar un subshell (paréntesis) para mantener todos los cambios locales. Necesita comillas dobles para proteger los nombres de directorio con espacios y set -fpara desactivar el globbing. cd -Psigue todos los enlaces simbólicos.
Gilles 'SO- deja de ser malvado'
1

alternativamente, considere usar findcontac

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