staging.inyokaproject.org

cd in bash: Warum eXecutable flag?

Status: Gelöst | Ubuntu-Version: Ubuntu MATE 20.04 (Focal Fossa)
Antworten |

CDrewing

Avatar von CDrewing

Anmeldungsdatum:
6. November 2007

Beiträge: 558

Hallo,

ich habe hier ein Verzeichnis das und dessen Inhalte ich gerne gegen Schreibzugriff des Users schützen möchte. Eigentlich eine klare Sache: mit einer 440 sollte das klappen. Tut es aber nicht. Durch das Recht '440' also r-- r-- –- erhalte ich ein 'permission denied' wenn ich über bash cd in das Verzeichnis will. Erst bei einer 550 Berechtigung (r-x r-x –-) komme ich rein. Nutze ich eine GUI (caja) dann werden mir die Verzeichnisinhalte problemlos angezeigt.

Warum ist das so? Und wenn - offensichtlich - das x Flag notwendig ist, wie kann ich per Kommndozeile Verzeichnissen die 550 geben, Dateien aber nur die 440? Möglichst rekursiv und einmal durchlaufend.

Beste Grüße

MisterIgo

Anmeldungsdatum:
23. April 2009

Beiträge: 947

Du kannst dir auch auf im Terminal Verzeichnisinhalte (teilweise) z.B. mit ls von Verzeichnissen mit der Berechtigung 440 anschauen. Was weder in der GUI noch im Terminal geht, ist Unterverzeichnisse von Verzeichnissen mit der Berechtigung 440 anschauen.

Die Gründe dahinter liegen (meines Wissens) im Verzeichnismodell von UNIX. Verzeichnisse sind Inodes, die Listen an weiteren Inodes speichern (eben Verzeichnisse oder Dateien). Wenn dieser Verzeichnis-Inode nur eine Leseberechtigung hat, dann darf ich die Liste zwar lesen, aber eben nicht auf die Inodes dahinter zugreifen. Der Zugriff auf die Inodes wird gleichgesetzt mit "das Verzeichnis ausführen".

Das zeigt auch die Ausgabe von ls:

$ mkdir deep; cd deep
$ mkdir foo
$ touch bar
$ touch foo/bar
$ cd ..
$ chmod 400 deep
$ ls -l deep
ls: Zugriff auf 'deep/bar' nicht möglich: Keine Berechtigung
ls: Zugriff auf 'deep/foo' nicht möglich: Keine Berechtigung
insgesamt 0
-????????? ? ? ? ?             ? bar
d????????? ? ? ? ?             ? foo

Die Liste darf gelesen werden, aber die Inodes der Dateien und Verzeichnisse nicht, also auch nicht deren Attribute, wie Größe, Berechtigungen etc.

Ich ändere das immer mit:

$ find -type f -exec chmod ... {} \;
$ find -type d -exec chmod ... {} \;

Ansonsten kann chmod das auch, wenn du das Kommando relativ machst. Um z.B. die Schreibberechtigung zu entfernen funktioniert:

$ chmod -R a-w pfad

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

1
2
find base -type -f -exec chmod 440 {} +
find base -type -d -exec chmod 550 {} +

Oder Du entziehst einfach rekursiv das Schreibrecht:

1
chmod -cR a-w base
Antworten |