Warum kann ich kein Verzeichnis mit Leseberechtigungen auflisten?

14

Ich habe ein Verzeichnis dund eine Datei fdarin erstellt. Ich habe mir dann nur Leserechte für dieses Verzeichnis gegeben. Ich verstehe, dass dies bedeuten sollte, dass ich die Dateien auflisten kann (z. B. hier ), aber ich kann nicht.

will@wrmpb /p/t/permissions> ls -al
total 0
drwxr-xr-x   3 will  wheel  102  4 Oct 08:30 .
drwxrwxrwt  16 root  wheel  544  4 Oct 08:30 ..
dr--------   3 will  wheel  102  4 Oct 08:42 d
will@wrmpb /p/t/permissions> ls d
will@wrmpb /p/t/permissions>

Wenn ich die Berechtigungen zum Schreiben und Ausführen ändere, kann ich die Datei sehen.

will@wrmpb /p/t/permissions> chmod 500 d
will@wrmpb /p/t/permissions> ls d
f
will@wrmpb /p/t/permissions> 

Warum ist das? Ich benutze MacOS.

Bearbeiten: In Bezug auf die Antwort von @ ccorn ist es wichtig, dass ich Fisch benutze, und type lsgibt Folgendes an:

will@wrmpb /p/t/permissions> type ls
ls is a function with definition
function ls --description 'List contents of directory'
    command ls -G $argv
end
wrgrs
quelle
Das Duplikat beantwortet die Frage nicht. Das bedeutet, dass Sie das tun können, was ich demonstriere, dass Sie nicht können. @ ccorns Antwort ist perfekt.
Wrgrs
Wow, das Fisch-Ding ist ein ziemlich wichtiges Stück (anfangs) fehlender Information.
Stephen Kitt
Ja, du hast recht, ich hätte es hinzufügen sollen, aber es sieht so aus, als würde dasselbe in bash passieren, wenn du alias ls='ls -G', was meiner Meinung nach viele Leute tun.
Wrgrs
Tut für mich. Bist du auf MacOS? Vielleicht gibt es hier eine andere Frage. Edit: yep, ich bekomme unter Linux ein anderes Verhalten.
Wrgrs

Antworten:

8

Einige Vorbereitungen, nur um sicherzustellen, dass lsnicht mehr Dinge ausprobiert werden, als es sollte:

$ unalias ls 2>/dev/null
$ unset -f ls
$ unset CLICOLOR

Demonstration der rVerzeichnisberechtigung:

$ ls -ld d
dr--------  3 ccorn  ccorn  102  4 Okt 14:35 d
$ ls d
f
$ ls -l d
ls: f: Permission denied
$ ls -F d
ls: f: Permission denied

In herkömmlichen Unix-Dateisystemen bestand ein Verzeichnis lediglich aus einer Liste von Paaren (Name, Inode-Nummer). Eine Inode-Nummer ist eine Ganzzahl, die als Index in der Inode-Tabelle des Dateisystems verwendet wird, in der die restlichen Dateimetadaten gespeichert sind.

Mit der rBerechtigung für ein Verzeichnis können Sie die Namen in diesem Verzeichnis auflisten, jedoch nicht auf die in der Inode-Tabelle gespeicherten Informationen zugreifen, dh Dateityp, Dateilänge, Dateiberechtigungen usw. abrufen oder die Datei öffnen. Dafür benötigen Sie die xBerechtigung für das Verzeichnis.

Aus diesem Grunde ls -l, ls -F, lsmit farbcodierten Ausgabe etc unfehlbar xErlaubnis, während ein bloßen lsgelingt.

Die xBerechtigung allein ermöglicht den Inode-Zugriff, dh bei einem expliziten Namen in diesem Verzeichnis xkann der Inode nachgeschlagen werden und auf die Metadaten dieses Verzeichniseintrags zugegriffen werden:

$ chmod 100 d
$ ls -l d/f
-rw-r--r--  1 ccorn  ccorn  0  4 Okt 14:35 d/f
$ ls d
ls: d: Permission denied

Deshalb, um eine Datei zu öffnen /a/b/c/foder seine Metadaten Liste, die Verzeichnisse /, /a, /a/b, und /a/b/cmuss gewährt werden , die xErlaubnis.

Es überrascht nicht, dass zum Erstellen von Verzeichniseinträgen sowohl wals auch xBerechtigungen erforderlich sind :

$ chmod 100 d
$ touch d/g
touch: d/g: Permission denied
$ chmod 200 d
$ touch d/g
touch: d/g: Permission denied
$ chmod 300 d
$ touch d/g
$

Einen kurzen Überblick bietet Wikipedia in einem Artikel zu Dateisystemberechtigungen .

ccorn
quelle
Tolle. /bin/ls dzeigt den inhalt für mich. Vielen Dank!
Wrgrs
OK, es handelte sich also um ein Redefinitionsproblem (bei -Gkolorierter Ausgabe, die Metadaten benötigt, also xDauerwellen). Deshalb meine Vorbereitungen mit unalias lsund unset CLICOLOR. Ich hätte hinzufügen sollen unset -f ls, um auch solche Funktionsdefinitionen zu entfernen. Bearbeitet
Ccorn
4

Um ein Verzeichnis zu lesen, müssen Sie auch in der Lage sein, dorthin zu gelangen (das x-Bit). Sie benötigen also mindestens rx, damit ein Verzeichnis auf irgendeine Weise darauf zugreifen kann.

Soruk
quelle
2
Nein, tust du nicht; lssollte noch in der Lage seiner Liste die Dateien in dem Verzeichnis, auch wenn das Verzeichnis nicht ausführbar ist.
Stephen Kitt
Sie können die Leseberechtigung auslassen. Sie können dann auf die Dateien zugreifen, aber den Inhalt des Verzeichnisses nicht auflisten.
Kusalananda
@ Kusalananda - guter Punkt, in der Tat benutze ich dies von Zeit zu Zeit.
Soruk
@ Stephen Kitt - Vielleicht sollte es, aber die Implementierung ist, dass es nicht.
Soruk
1
@ Soruk und so bleibt die Frage: warum nicht?
Stephen Kitt