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

25

Il y a une commande, je pense qu'elle vient avec apache, ou est en quelque sorte liée à elle, qui vérifie les autorisations, tout le long. Donc , si je /home/foo/bar/bazne me dira ce que les autorisations sont pour baz, bar, fooet home. Quelqu'un sait-il ce qu'est cette commande ou une autre façon de le faire? La commande commence essentiellement à l'argument et fonctionne jusqu'à /vous faire savoir quelles sont les autorisations en cours de route afin que vous puissiez voir si vous avez un problème d'autorisation.

xénoterracide
la source

Réponses:

28

L'utilitaire auquel vous pensez peut-être est la nameicommande. Selon la page de manuel:

Namei utilise ses arguments comme noms de chemin d'accès à tout type de fichier Unix (liens symboliques, fichiers, répertoires, etc.). Namei suit ensuite chaque chemin jusqu'à ce qu'un point terminal soit trouvé (un fichier, un répertoire, un périphérique char, etc.). S'il trouve un lien symbolique, nous affichons le lien et commençons à le suivre, en indentant la sortie pour afficher le contexte.

La sortie souhaitée 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 nameicommande fait partie du progiciel linux-util-ng . Voir la page de manuel pour plus de détails.

Steven D
la source
il se peut que cela ne semble le faire que pour les liens symboliques, bien que je ne me souvienne pas de ce que j'utilisais et si c'était sur un lien symbolique.
xenoterracide
Alors que j'ai vu des pages de manuel plus anciennes qui ne mentionnaient que des liens symboliques, comme le montrent mon exemple et la page de manuel, il contient des mots pour tous les types de fichiers et de répertoires.
Steven D
pas pour moi :( ça donne une longue liste comme ça, pour moi, avec des liens symboliques.
xenoterracide
quelle version utilisez-vous? J'utilise 2.18
xenoterracide
2
une autre façon utile d'utiliser namei pour ceux qui sont paresseux. namei -l $PWD/public_html/De votre répertoire actuel us $ PWD pour obtenir la liste des perms jusqu'à votre répertoire actuel.
nelaaro
7

Je ne connais aucune commande, 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
dogbane
la source
2

Que diriez-vous d'une fonction 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#] 
frielp
la source
C'est mon préféré car il ne nécessite aucune dépendance. Voudrez peut le faire cd .. >/dev/nullque pour ceux d' entre nous avec un $CDPATHensemble ( ce qui provoque la sortie du cd répertoire courant quand il est utilisé et qui interfère avec la sortie de votre fonction.)
beporter
2

Je pense que la commande que vous recherchez est:

namei -l `pwd`

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
Christian
la source
1

Cela pourrait facilement être réalisé en une doublure. Ce n'est pas récursif et devrait être un moyen relativement rapide de le faire en bash. Appeler pwd dans chaque boucle n'est pas particulièrement rapide, alors évitez 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 ligne pour le répertoire actuel.

(IFS="/"; set -f; for dir in $PWD; do stat -c "$PWD %A" .; cd ..; done)
ewindisch
la source
Est-ce que c'est une ligne? Ai-je manqué quelque chose?
phunehehe
Comme une ligne pour le pwd: pushd $ (pwd)> / dev / null; OIFS = $ IFS; IFS = "/"; pour dir en $ (pwd); faire stat -c "$ (pwd)% A".; cd ..; terminé; IFS = $ OIFS; popd> / dev / null
ewindisch
Votre script ne fonctionnera pas avec des noms de fichiers contenant des espaces ou des caractères globbing.
Gilles 'SO- arrête d'être méchant'
Gilles, je suppose que non. Il l'avait à l'origine, mais je l'ai mis de côté lors du montage. J'ai supprimé les xargs et cela devrait fonctionner à nouveau correctement.
ewindisch
Pourquoi utiliser pushd et popd? Ou eval, d'ailleurs? Vous pouvez utiliser un sous-shell (parenthèses) pour garder toutes les modifications locales. Vous avez besoin de guillemets doubles pour protéger les noms de répertoire avec des espaces et set -fdésactiver la globalisation. cd -Psuit tous les liens symboliques.
Gilles 'SO- arrête d'être méchant'
1

alternativement, envisagez d'utiliser findavectac

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