Wie überprüfe ich Berechtigungen rekursiv in umgekehrter Reihenfolge?

25

Ich glaube, es gibt einen Befehl, der mit Apache zusammenhängt oder irgendwie damit zusammenhängt und der die Berechtigungen überprüft. Also , wenn ich /home/foo/bar/bazwerde es mir sagen , was die Berechtigungen sind für baz, bar, foo, und home. Weiß jemand, was dieser Befehl ist oder eine andere Möglichkeit, dies zu tun? Der Befehl beginnt im Wesentlichen mit dem Argument und setzt sich so fort, /dass Sie wissen, welche Berechtigungen sich auf dem Weg befinden, damit Sie feststellen können, ob ein Berechtigungsproblem vorliegt.

Xenoterracid
quelle

Antworten:

28

Das Dienstprogramm, an das Sie vielleicht denken, ist der nameiBefehl. Laut Handbuchseite:

Namei verwendet seine Argumente als Pfadnamen für alle Arten von Unix-Dateien (Symlinks, Dateien, Verzeichnisse usw.). Namei folgt dann jedem Pfadnamen, bis ein Endpunkt gefunden wurde (eine Datei, ein Verzeichnis, ein Zeichengerät usw.). Wenn eine symbolische Verknüpfung gefunden wird, zeigen wir die Verknüpfung an und folgen ihr, wobei die Ausgabe eingerückt wird, um den Kontext anzuzeigen.

Die gewünschte Ausgabe kann wie folgt empfangen werden:

$ namei -l /usr/src/linux-headers-2.6.35-22/include/
f: /usr/src/linux-headers-2.6.35-22/include/
drwxr-xr-x root root /
drwxr-xr-x root root usr
drwxrwsr-x root src  src
drwxr-xr-x root root linux-headers-2.6.35-22
drwxr-xr-x root root include

Der nameiBefehl ist Teil des Software-Pakets linux-util-ng . Weitere Informationen finden Sie auf der Handbuchseite .

Steven D
quelle
Es könnte sein, scheint, dass es nur für Symlinks funktioniert, obwohl ich mich nicht erinnere, was ich verwendet habe und ob es auf einem Symlink war.
Xenoterracide
Während ich ältere Handbuchseiten sah, in denen nur Symlinks erwähnt wurden, wie sowohl in meinem Beispiel als auch in der Manpage zu sehen ist, stehen die Wörter für alle Arten von Dateien und Verzeichnissen.
Steven D
nicht für mich :( es gibt lange eine lange
auflistung
welche version benutzt du Ich benutze 2.18
Xenoterracide
2
Ein weiterer nützlicher Weg, Namei für diejenigen zu verwenden, die faul sind. namei -l $PWD/public_html/Von Ihrem aktuellen Verzeichnis rufen Sie $ PWD auf, um die Liste der Dauerwellen bis zu Ihrem aktuellen Verzeichnis abzurufen.
Nelaaro
7

Ich kenne keine Befehle, aber es ist ganz einfach, ein Skript zu schreiben:

#!/bin/bash    
ARG=$1
while [[ "$ARG" != "." && "$ARG" != "/" ]]
do
        ls -ld -- "$ARG"
        ARG=`dirname -- "$ARG"`      
done

Beispiel:

$ perms.sh /tmp/1/2/3/hello.txt

-rw-rw-r--    1 user    group          0 Jan 14 16:59 /tmp/1/2/3/hello.txt
drwxrwxr-x    2 user    group       4096 Jan 14 16:59 /tmp/1/2/3
drwxrwxr-x    3 user    group       4096 Jan 14 16:43 /tmp/1/2
drwxrwxr-x    3 user    group       4096 Jan 14 16:43 /tmp/1
drwxrwxrwt   12 root     root       4096 Jan 14 17:02 /tmp
Dogbane
quelle
2

Wie wäre es mit einer rekursiven Bash-Funktion für eine unterhaltsame Lösung:

[bash#] function uptree { ( \ls -ld -- "$PWD"; [ "$PWD" = '/' ] && return; cd ..; uptree ) | column -t ; } 

[bash#] pwd
/home/frielp/bin/dev

[bash#] uptree
drwxrwxr-x.  2   frielp  frielp  4096  Dec  14  14:50  /home/frielp/bin/dev
drwxr-xr-x.  15  frielp  frielp  4096  Aug  23  10:48  /home/frielp/bin
drwxr-xr-x.  60  frielp  frielp  4096  Jan  14  16:48  /home/frielp
drwxr-xr-x.  4   root    root    4096  Dec  1   09:14  /home
dr-xr-xr-x.  23  root    root    4096  Jan  14  08:18  /

[bash#] pwd
/home/frielp/bin/dev
[bash#] 
frielp
quelle
Dies ist mein Favorit, weil es keine Abhängigkeiten erfordert. Könnte es cd .. >/dev/nullaber für diejenigen von uns mit einem $CDPATHSet machen wollen (was dazu führt, dass cd das aktuelle
Verzeichnis
2

Ich denke, der Befehl, nach dem Sie suchen, lautet:

namei -l `pwd`

Wenn es in / tmp / foo / bar ausgeführt wird, erhalten Sie eine Auflistung wie:

drwxr-xr-x root   root   /
drwxrwxrwt root   root   tmp
drwxr-xr-x user   group  foo
drwxr-xr-x user   group  bar
Christian
quelle
1

Dies könnte leicht zu einem Einzeiler gemacht werden. Dies ist nicht rekursiv und sollte ein relativ schneller Weg sein, dies in bash zu tun. Das Aufrufen von pwd in jeder Schleife ist nicht besonders schnell. Vermeiden Sie es also, wenn Sie können.

#!/bin/bash
if [ -n "$1" ]; then
    echo "Usage: $0 [FILE]"
    exit 1
fi
cd -P -- "$1"
IFS="/"
set -f # turn off globbing for the expansion of $PWD below
for dir in $PWD; do
    stat -c "$PWD %A" .
    cd ..
done

Alternativ ein Einzeiler für das aktuelle Verzeichnis.

(IFS="/"; set -f; for dir in $PWD; do stat -c "$PWD %A" .; cd ..; done)
ewindisch
quelle
Ist das ein Einzeiler? Habe ich etwas verpasst?
Phunehehe
Als Einzeiler für das pwd: pushd $ (pwd)> / dev / null; OIFS = $ IFS; IFS = "/"; für dir in $ (pwd); do stat -c "$ (pwd)% A".; cd ..; getan; IFS = $ OIFS; popd> / dev / null
ewindisch
Ihr Skript funktioniert nicht mit Dateinamen, die Leerzeichen oder Umlaufzeichen enthalten.
Gilles 'SO - hör auf böse zu sein'
Gilles, ich denke nicht. Es hatte ursprünglich, aber ich habe es in der Bearbeitung vermasselt. Ich habe die Xargs entfernt und es sollte wieder richtig funktionieren.
ewindisch
Warum Pushd und Popd verwenden? Oder eval überhaupt? Sie können eine Unterschale (Klammern) verwenden, um alle Änderungen lokal zu halten. Sie benötigen doppelte Anführungszeichen, um Verzeichnisnamen mit Leerzeichen zu schützen und set -fdas Globbing zu deaktivieren. cd -Pfolgt allen symlinks.
Gilles 'SO- hör auf böse zu sein'
1

Alternativ können Sie auch findmittac

find /path -printf '%M %u %g %p\n' | tac
Luca Filipozzi
quelle