web-dev-qa-db-fra.com

Comment vérifier si un utilisateur peut accéder à un fichier donné?

* 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/.

66
Metalcoder

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

78
exussum

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
16
user26112

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
4
rush

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
2
Kevin Burke

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
1
slm