web-dev-qa-db-fra.com

Comment vérifier récursivement les autorisations à l'envers?

Il y a une commande, je pense qu'il est livré avec Apache ou est en quelque sorte liée à celui-ci, qui vérifie les autorisations, jusqu'au bout. Donc, si j'ai /home/foo/bar/baz Cela me dira quelles sont les autorisations pour baz, bar, foo et home. Est-ce que quelqu'un sait ce que cette commande est ou une autre façon de faire cela? La commande commence fondamentalement à l'argument et fonctionne de la manière à / Vous permettant de savoir quelles sont les autorisations dans le chemin afin que vous puissiez voir si vous avez un problème d'autorisation.

25
xenoterracide

L'utilité que vous pouvez penser est la commande namei. Selon la page manuelle:

Namei utilise ses arguments comme des chemins de chemin sur tout type de fichier UNIX (liens symboliques, fichiers, répertoires, etc.). Namei suit ensuite chaque chemin de chemin jusqu'à ce qu'un point de terminal soit trouvé (un fichier, un répertoire, un périphérique de caractère, etc.). S'il trouve un lien symbolique, nous montrons le lien et commençons à la suivre, en indiquant la sortie pour afficher le contexte.

La sortie que vous désirez peut être reçue comme suit:

$ 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

La commande namei fait partie du package logiciel Linux-util-ng . Voir la page page manuelle pour plus de détails.

29
Steven D

Je ne suis au courant de commandes, mais il est assez facile d'écrire un script:

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

Exemple:

$ 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
7
dogbane

Je pense que la commande vous recherchez est:

namei -l `pwd`

ce qui, lorsqu'il est exécuté dans/tmp/foo/bar, vous donne une liste comme:

drwxr-xr-x root   root   /
drwxrwxrwt root   root   tmp
drwxr-xr-x user   group  foo
drwxr-xr-x user   group  bar
2
Christian

Que diriez-vous d'une fonction de bash récursive pour une solution amusante:

[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#] 
2
frielp

Cela pourrait facilement être fait un one-liner. Ce n'est pas récursif et devrait être un moyen relativement rapide de le faire dans Bash. Appeling PWD Dans chaque boucle n'est pas particulièrement rapide, évitez donc si vous le pouvez.

#!/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

Alternative, une doublure pour le répertoire actuel.

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

alternativement, envisagez d'utiliser find avec tac

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