it-swarm.com.de

Wie kann ich überprüfen, ob ein Benutzer auf eine bestimmte Datei zugreifen kann?

* nix Benutzerberechtigungen sind wirklich einfach, aber es kann chaotisch werden, wenn Sie den gesamten Zugriff auf das übergeordnete Verzeichnis berücksichtigen müssen, bevor Sie eine bestimmte Datei erreichen. Wie kann ich überprüfen, ob der Benutzer über genügend Berechtigungen verfügt? Wenn nicht, welches Verzeichnis verweigert dann den Zugriff?

Angenommen, ein Benutzer joe und die Datei /long/path/to/file.txt. Selbst wenn file.txt Auf 777 geändert wurde, muss Joe immer noch auf /long/ Und dann auf /long/path/ Und dann auf /long/path/to/ Vorher zugreifen können. Was ich brauche, ist eine Möglichkeit, dies automatisch zu überprüfen. Wenn joe keinen Zugriff hat, würde ich auch gerne wissen, wo er abgelehnt wurde. Vielleicht kann er auf /long/ Zugreifen, aber nicht auf /long/path/.

66
Metalcoder

Sie können verwenden

namei -m /path/to/really/long/directory/with/file/in

dadurch werden alle Berechtigungen im Pfad in einer vertikalen Liste ausgegeben.

oder

namei -l /path/to/really/long/directory/with/file/in

um alle Eigentümer und die Berechtigungen aufzulisten

78
exussum

Sie können Bash verwenden, um dies zu tun.

$ 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

Um dies für einen bestimmten Benutzer zu überprüfen, können Sie Sudo verwenden.

Sudo -u joe ./check-permissions.sh /long/path/to/file.txt
16
user26112

Wie ich aus Ihrer Frage erhalten habe, sollten Sie sie für verschiedene Benutzer überprüfen (nicht nur für Joe). In diesem Fall ist es am einfachsten, sie rekursiv über Sudo wie folgt zu überprüfen:

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

verwendungszweck:

./script.sh /long/path/to/file.txt joe
4
rush

Wenn Sie Root-Zugriff haben, geben Sie sich als Benutzer aus und führen Sie test -r (lesen), test -w (schreiben oder test -x (Ausführen), um zu überprüfen, ob der Benutzer die angegebene Datei lesen/schreiben/ausführen kann.

Sudo -u otheruser test -w /file/to/test
2
Kevin Burke

Hier ist mein Versuch, diese Funktionalität bereitzustellen. Ich habe mich für stat, eine while Schleife und dirname entschieden.

Ich habe dieses Skript erstellt, 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

Sie führen es so aus:

$ 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