* Les autorisations utilisateur nix sont vraiment simples, mais les choses peuvent devenir compliquées lorsque vous devez prendre en compte tous les accès au répertoire parent avant d'atteindre un fichier donné. Comment puis-je vérifier si l'utilisateur a suffisamment de privilèges? Sinon, quel répertoire refuse l'accès?
Par exemple, supposons qu'un utilisateur joe
et le fichier /long/path/to/file.txt
. Même si file.txt
a été modifié en 777, joe doit toujours pouvoir accéder à /long/
, et alors /long/path/
et alors /long/path/to/
avant. J'ai besoin d'un moyen de vérifier automatiquement cela. Si joe
n'a pas accès, je voudrais aussi savoir où il a été refusé. Il peut peut-être accéder à /long/
, mais non /long/path/
.
Vous pouvez utiliser
namei -m /path/to/really/long/directory/with/file/in
qui affichera toutes les autorisations du chemin dans une liste verticale.
ou
namei -l /path/to/really/long/directory/with/file/in
pour répertorier tous les propriétaires et les autorisations
Vous pouvez utiliser bash pour ce faire.
$ cat check-permissions.sh
#!/bin/bash
file=$1
# Handle non-absolute paths
if ! [[ "$file" == /* ]] ; then
path=.
fi
dirname "$file" | tr '/' $'\n' | while read part ; do
path="$path/$part"
# Check for execute permissions
if ! [[ -x "$path" ]] ; then
echo "'$path' is blocking access."
fi
done
if ! [[ -r "$file" ]] ; then
echo "'$file' is not readable."
fi
$ ./check-permissions.sh /long/path/to/file.txt
Pour vérifier cela pour un utilisateur spécifique, vous pouvez utiliser Sudo
.
Sudo -u joe ./check-permissions.sh /long/path/to/file.txt
Comme je l'ai compris dans votre question, vous devez le vérifier pour différents utilisateurs (pas seulement joe), dans ce cas, le moyen le plus simple est de le vérifier récursivement via Sudo comme ceci:
FILE=$1 ; T_USER=$2 ;
if Sudo -u $T_USER [ -r "$FILE" ] ; then
echo "original file $1 is readable for $T_USER"
else
while Sudo -u $T_USER [ ! -x "$FILE" ] ; do FILE=$(dirname "$FILE") ; done
echo "only $FILE is readable for $T_USER"
fi
usage:
./script.sh /long/path/to/file.txt joe
Si vous disposez d'un accès root, empruntez l'identité de l'utilisateur, puis exécutez test -r
(lis), test -w
(écrire ou test -x
(exécuter) pour vérifier si l'utilisateur peut lire/écrire/exécuter le fichier donné.
Sudo -u otheruser test -w /file/to/test
Voici ma tentative de fournir cette fonctionnalité. J'ai choisi d'utiliser stat
, une boucle while
et dirname
.
J'ai créé ce script, walkdir.bash
:
#/bin/bash
cwd="$1"
while [ "x$cwd" != x/ ]; do
info=`stat "$cwd" |grep "Access: ("`
printf "%s : %s\n" "$info" "$cwd"
cwd=`dirname "$cwd"`;
done
Vous le faites comme ça:
$ walkdir.bash "/home/saml/blog/vmware_networking_tutorial/url.txt"
Access: (0664/-rw-rw-r--) Uid: ( 500/ saml) Gid: ( 501/ saml) : /home/saml/blog/vmware_networking_tutorial/url.txt
Access: (0775/drwxrwxr-x) Uid: ( 500/ saml) Gid: ( 501/ saml) : /home/saml/blog/vmware_networking_tutorial
Access: (0775/drwxrwxr-x) Uid: ( 500/ saml) Gid: ( 501/ saml) : /home/saml/blog
Access: (0700/drwx------) Uid: ( 500/ saml) Gid: ( 501/ saml) : /home/saml
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) : /home