Wie prüfe ich, ob ein Benutzer auf eine bestimmte Datei zugreifen kann?

60

* nix-Benutzerberechtigungen sind wirklich einfach, aber es kann problematisch 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 ausreichende Berechtigungen verfügt? Wenn nicht, welches Verzeichnis verweigert dann den Zugriff?

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

Metalcoder
quelle

Antworten:

71

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 Besitzer und die Berechtigungen aufzulisten

exussum
quelle
2
Dies sollte die richtige Antwort sein. Tatsächlich namei <path> || exit 1können Sie mithilfe von ein Berechtigungsproblem in einem Skript auf einfache Weise erkennen.
Lorenzog
5
Es antwortet nicht direkt, ob Joe Zugriff auf die Datei hat.
jfs
15

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 verwenden sudo.

sudo -u joe ./check-permissions.sh /long/path/to/file.txt

quelle
sudo -u joe script. Hier Skript ist der Name der Skriptdatei richtig? Also hast du sudo gesagt, er solle sich wie Joe verhalten, und das Drehbuch aufgerufen?
tgkprog
Genau. Ich habe meine Antwort geändert, um dies zu verdeutlichen.
Ich habe mein Skript geringfügig geändert, um nicht absolute Pfade zu verarbeiten.
@EvanTeitelman Wollten Sie mit einem absoluten Pfad initialisieren path, um leer zu sein? oder /?
Gilles 'SO- hör auf böse zu sein'
@Gilles: Ich wollte, dass es leer ist. Im Beispiel pathwird zum /longersten Mal um die Schleife gesetzt, was richtig ist. Soll ich pathexplizit auf nichts setzen ( path=)? Vielen Dank auch für die Vereinfachung meiner Verwendung von tr.
3

Wie ich aus Ihrer Frage erfahren habe, sollten Sie es für verschiedene Benutzer überprüfen (nicht nur für Joe). In diesem Fall ist es am einfachsten, es rekursiv über sudo 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
eilen
quelle
Joe benötigt Ausführungsberechtigungen für die Verzeichnisse, keine Leseberechtigungen.
@EvanTeitelman ja, du hast recht. Fest.
Ansturm
@rush Ich habe versucht , es zu testen verwenden Sie die folgende Datei: /root/test/test.txt (Berechtigungen sind 0755, 0700und 0777). Ich gab aus ./script.sh /root/test/test.txt joeund es hallte wider original file /root/test/test.txt is readable for joe. Während ich dies versuchte, habe ich das Testverzeichnis falsch eingegeben ./script.sh /root/tst/test.txt joeund es hallte wider original file /root/tst/test.txt is readable for joe. Habe ich etwas verpasst
Metalcoder
@Metalcoder Entschuldigung, es ist meine Schuld. Es gab einen zusätzlichen Ausruf. Es ist jetzt entfernt, Sie können es noch einmal versuchen, es sollte jetzt gut funktionieren.
Ansturm
@ Ansturm es hat funktioniert! Dieser zusätzliche Ausruf negiert das Ergebnis von -r $FILE, richtig?
Metalcoder
1

Hier ist mein Versuch, diese Funktionalität bereitzustellen. Ich habe mich für stateine whileSchleife entschieden und dirname.

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