Comment puis-je répertorier les autorisations de chaque composant dans un chemin de fichier?

10

Il est parfois nécessaire de déterminer sur quel répertoire d'un chemin les droits d'accès sont limités. Voici un exemple:

$ ls /sys/kernel/debug/usb/devices
ls: cannot access /sys/kernel/debug/usb/devices: Permission denied
$ cat /sys/kernel/debug/usb/devices
cat: /sys/kernel/debug/usb/devices: Permission denied

Ni montre lsni catoù les droits des utilisateurs étaient limités.

Quelle est la manière la plus simple d'afficher les droits d'accès pour chaque composant (répertoire et fichier) du chemin? Je m'intéresse principalement aux solutions pour les systèmes de type Unix.

pabouk
la source

Réponses:

17

Pour les autorisations UNIX de base (propriétaire / groupe / autre), utilisez nameice qui fait partie de util-linux :

# namei -l / sys / kernel / debug / usb / devices
f: / sys / kernel / debug / usb / devices
racine racine de drwxr-xr-x /
dr-xr-xr-x root sys racine
drwxr-xr-x noyau racine racine
drwx ------ root debug racine
drwxr-xr-x root root usb
-r - r - r-- root root périphériques
user1686
la source
1

Voici un simple script Bourne-like-shell. Il parcourt le chemin en supprimant progressivement les derniers composants à l'aide de la dirnamecommande jusqu'à ce que le chemin cesse de changer. Vous obtenez soit /ou .à la fin.

#!/bin/sh

f="$1"
p=
while test "$f" != "$p" ; do
    ls -ld "$f"
    p="$f"
    f="$(dirname "$f")"
done

En une seule ligne avec sudopour pouvoir voir les composants avec des droits d'accès limités:

f=/sys/kernel/debug/usb/devices p= ; while test "$f" != "$p" ; do sudo ls -ld "$f" ; p="$f" ; f="$(dirname "$f")" ; done

Exemple de sortie

-r--r--r-- 1 root root 0 Dec  5 10:36 /sys/kernel/debug/usb/devices
drwxr-xr-x 3 root root 0 Dec  5 10:36 /sys/kernel/debug/usb
drwx------ 19 root root 0 Dec  5 10:36 /sys/kernel/debug
drwxr-xr-x 7 root root 0 Dec  5 10:37 /sys/kernel
drwxr-xr-x 13 root root 0 Dec  5 10:37 /sys
drwxr-xr-x 27 root root 4096 Dec  3 09:39 /

POSIX ACL

Si la chaîne d'autorisation de ls -ls'affiche +à la fin, vous devez répertorier ACL en utilisant getfaclpour voir les droits d'accès complets:

#!/bin/sh

f="$1"
p=
while test "$f" != "$p" ; do
    getfacl "$f"
    p="$f"
    f="$(dirname "$f")"
done
pabouk
la source