Verzeichnisberechtigungen in UNIX verstehen

Ich habe versucht, Unix und Terminal etwas besser zu lernen, und bin auf ein Verhalten gestoßen, das ich nicht verstehe. Ich hoffe, jemand kann mir erklären, was ich übersehe.

In letzter Zeit habe ich mit Berechtigungen für Verzeichnisse experimentiert. Von dem, was ich (glaube) verstanden habe, bedeutet Leseberechtigung, dass Sie den Inhalt eines Verzeichnisses anzeigen können (dh den Inhalt des Verzeichnisses auflisten ls directorysollten); Schreibberechtigung bedeutet, dass Sie Dateien im Verzeichnis erstellen, ändern oder löschen können (dh , touch directory/newfileoder vi directory/fileimade, oder rm directory/fileihate, alle sollten funktionieren); und Ausführungsberechtigung bedeutet, dass Sie das Verzeichnis zu Ihrem Arbeitsverzeichnis machen können (dh cd directoryes sollte funktionieren)

Aber das finde ich nicht.

Wenn ich mich r--in einem Verzeichnis befinde, erhalte ich wie erwartet Fehler beim Versuch cd directoryoder . touch directory/newfileAber wenn ich es ausführe ls directory- nun, ich erhalte keinen Fehler, aber es werden keine Dateien aufgelistet, selbst wenn ich weiß, dass es Dateien im Verzeichnis gibt, die mir gehören und/oder auf die ich Rechte habe. Also, lsist erfolgreich gelaufen, aber ohne Daten zur Standardausgabe. Warum nicht?

Wenn ich -w-ein Verzeichnis habe, erhalte ich wie erwartet Fehler bei cdund . lsAber wenn ich versuche, eine neue Datei zu erstellen - touch directory/newfile- erhalte ich auch eine Fehlermeldung. Warum?

Alle x -Kategorien funktionieren genau wie erwartet; Ich kann cdin Verzeichnisse mit --x, aber sonst nichts. Ich kann cdin Verzeichnisse mit -wx, Dateien erstellen und löschen, lsgibt aber einen Fehler zurück. Und ich kann cdin r-xVerzeichnisse wechseln, deren Inhalt auflisten und an Dateien arbeiten, für die ich vorhandene Berechtigungen habe, aber keine Dateien erstellen oder löschen kann. All dies ergibt für mich Sinn.

Also, was verstehe ich nicht richtig über r--und -w-?

Antworten (2)

Wenn ich r-- in einem Verzeichnis habe, erhalte ich wie erwartet Fehlermeldungen, wenn ich versuche, cd-Verzeichnis oder Verzeichnis/neueDatei zu berühren. Aber wenn ich ls directory ausführe – nun, ich erhalte keinen Fehler, aber es werden keine Dateien aufgelistet, selbst wenn ich weiß, dass es Dateien gibt, die ich besitze und/oder Rechte an ihnen innerhalb des Verzeichnisses habe. ls wurde also erfolgreich ausgeführt, aber ohne Daten zur Standardausgabe. Warum nicht?

Wenn Sie nur ls directorydann die "Dateien" darin auflisten directorysollten, aber wenn Sie ls -lwhich-Aufrufe verwenden, schlägt stat(2)die Operation stillschweigend fehl, da statein vollständig durchsuchbarer Pfad zum Dateisystemobjekt erforderlich ist.

Wenn ich -w- in einem Verzeichnis habe, erhalte ich wie erwartet Fehler auf cd und ls. Aber wenn ich versuche, eine neue Datei zu erstellen – berühren Sie Verzeichnis/neueDatei – erhalte ich auch eine Fehlermeldung. Warum?

Ruft erneut touchden Systemaufruf open(2)auf, der einen vollständig durchsuchbaren Pfad erfordert (alle Verzeichnisse im Pfad sind ausführbar/durchsuchbar), oder die Operation schlägt fehl.

Das sieht so aus, als würde es erklären, was ich erlebt habe - danke! Ich habe ls -lüber einen Alias ​​​​verwendet - als ich ihn entfernte, funktionierten schreibgeschützte Verzeichnisse wie erwartet. Eine Fortsetzung jedoch: Ein Nur-Schreiben-Verzeichnis scheint immer noch fehlzuschlagen, wenn versucht wird, eine Datei zu entfernen oder zu bearbeiten, von der ich weiß, dass sie existiert und für die ich Rechte habe. Warum sollte das sein? Sind schreibgeschützte Verzeichnisse ohne Ausführungs-/Suchberechtigung im Tandem einfach funktional nutzlos?
Für die Bearbeitung einer Datei sind die Berechtigungen des enthaltenden Verzeichnisses völlig irrelevant. Sie benötigen lediglich Lese- und Schreibrechte für die Datei. Das Bearbeiten einer Datei geschieht jedoch nicht isoliert. Sie müssen die Datei zuerst finden , und dafür benötigen Sie Leserechte für das enthaltende Verzeichnis. Ist das sinnvoll?
Nun, das Konzept macht absolut Sinn, aber es stimmt nicht ganz mit dem überein, was ich sehe. Im Moment habe ich ein Verzeichnis namens readwritewith rw-permission und zwei Dateien innerhalb von named rwtoeditund rwtodelete, beide mit rw-Genehmigung (Berechtigungen sind ich als Eigentümer). Der Befehl rm -f readwrite/rwtodeleteschlägt mit Fehler fehl Permission denied. Der Befehl vi readwrite/rwtoeditlädt den Editor, aber nicht die Datei, wieder mit Permission deniedFehler. Die Dateien sind da, die Shell lässt mich sie sehen, und ich kann sie spezifisch als Argumente für die Shell identifizieren. Warum also die Fehler?
@CASmnl42 r-- lässt Sie die Dateinamen im Verzeichnis lesen, nicht auf die Dateien zugreifen. Sie benötigen mindestens --x, um auf eine darin enthaltene Datei zugreifen zu können.

Sie haben eine ungefähre Vorstellung von den UNIX-Datei- und -Verzeichnisberechtigungen, was für den Anfang gut ist.

Es gibt drei Arten von Berechtigungen

  • r: Leseberechtigung

  • w: Schreibberechtigung

  • x: Ausführungsberechtigung

für drei Eigentumskategorien

  • u: Benutzer oder Eigentümer

  • g: Gruppenbesitzer

  • o: andere oder alle anderen

Im Großen und Ganzen gibt es zwei Arten von Entitäten im UNIX-Dateisystem:

  • Dateien

  • Verzeichnisse

Auf technischer Ebene ist ein Verzeichnis nichts anderes als eine spezielle Art von Datei, die einfach eine Liste von darin enthaltenen Dateien und Verzeichnissen enthält.

Lassen Sie uns nun klar darlegen, was die drei Berechtigungstypen (Lesen, Schreiben, Ausführen) für ein Verzeichnis bedeuten. Angenommen, der betreffende angemeldete Benutzer ist der Eigentümer des Verzeichnisses (um die Dinge einfach zu halten).

  • read : Das Verzeichnis (technisch die Verzeichnisdatei) kann gelesen werden , dh der Inhalt des Verzeichnisses kann zB mit dem lsBefehl aufgelistet werden.

  • schreiben : Das Verzeichnis (technisch die Verzeichnisdatei), kann geschrieben werden . Das bedeutet, dass eine neue Datei/ein neues Unterverzeichnis mit Befehlen wie touch, vim, cpetc. erstellt und gelöscht werden kann.

  • execute : Das Verzeichnis (technisch die Verzeichnisdatei), kann ausgeführt werden . Das bedeutet einfach, dass der Besitzer in dieses Verzeichnis, also cdin das Verzeichnis wechseln kann.

Denken Sie nun sorgfältig über jede der oben besprochenen Berechtigungen nach . Hier sind die verschiedenen Möglichkeiten der Berechtigungen und was der Eigentümer jeweils tun kann:

  • - - -: Keine Berechtigungen. Das Verzeichnis ist praktisch nutzlos.

  • - - x: Der Besitzer kann in das Verzeichnis wechseln, aber weder Dateien/Verzeichnisse darin erstellen/löschen, noch Verzeichnisinhalte auflisten.

  • - w -: Besitzer kann Datei/Verzeichnis innerhalb dieses Verzeichnisses erstellen/löschen, kann aber weder dessen Inhalt auflisten, noch kann sie darin wechseln.

  • - w x: Besitzer kann Datei/Verzeichnis in diesem Verzeichnis erstellen/löschen, dorthin wechseln, aber seinen Inhalt nicht auflisten.

  • r - -: Eigentümer kann nur Verzeichnisinhalte auflisten.

  • r - x: Eigentümer kann Datei/Verzeichnis in diesem Verzeichnis nicht erstellen/löschen.

  • r w -: Eigentümer kann nicht in dieses Verzeichnis wechseln.

  • r w x: Besitzer kann alle drei Aktionen im Verzeichnis ausführen.

Dies sollte nun helfen, ein klares Verständnis dafür zu bekommen, welche Aktionen mit welchen Verzeichnisberechtigungen möglich sind.

Sobald die obigen Konzepte für Sie sinnvoll sind, gehen wir Ihre Problemstellungen noch einmal durch:

Von dem, was ich (glaube) verstanden habe, bedeutet Leseberechtigung, dass Sie den Inhalt eines Verzeichnisses anzeigen können (dh den Inhalt des Verzeichnisses auflisten ls directorysollten);

Das ist absolut richtig und sollte aus der obigen Diskussion ersichtlich sein.

Schreibberechtigung bedeutet, dass Sie Dateien im Verzeichnis erstellen, ändern oder löschen können (dh , touch directory/newfileoder vi directory/fileimade, oder rm directory/fileihate, alle sollten funktionieren);

Teilweise richtig. Wenn im Verzeichnis eine Schreibberechtigung vorhanden ist, können Sie die Verzeichnisdatei schreiben , d. h . Inhalte zur Verzeichnisdatei hinzufügen und löschen . (Das sollte jetzt klar sein, aber ich werde es wiederholen, ein Verzeichnis ist einfach eine Datei, wenn auch eine spezielle, die einfach eine Liste aller enthaltenen Dateien und Unterverzeichnisse speichert.) Das bedeutet, dass Sie Dateien erstellen und löschen können ( oder Verzeichnisse) im Verzeichnis, können aber keine Dateien ändern, es sei denn, Sie verfügen über eine Schreibberechtigung für die Datei. Sie können eine Datei löschen, für die Sie keine Lese- oder Schreibberechtigung haben, da Sie über Schreibberechtigung für das enthaltende Verzeichnis verfügen. , oder , oder , alle sollten gut funktionieren.touch directory/newfilevi directory/fileimaderm directory/fileihate

und Ausführungsberechtigung bedeutet, dass Sie das Verzeichnis zu Ihrem Arbeitsverzeichnis machen können (dh cd directoryes sollte funktionieren)

Absolut korrekt.

Wenn ich mich r--in einem Verzeichnis befinde, erhalte ich wie erwartet Fehler beim Versuch cd directoryoder . touch directory/newfileAber wenn ich es ausführe ls directory- nun, ich erhalte keinen Fehler, aber es werden keine Dateien aufgelistet, selbst wenn ich weiß, dass es Dateien im Verzeichnis gibt, die mir gehören und/oder auf die ich Rechte habe. Also, lsist erfolgreich gelaufen, aber ohne Daten zur Standardausgabe. Warum nicht?

Du hast recht. Der Fall, dass keine Ausgabe angezeigt wird, tritt auf, wenn das Verzeichnis vollständig leer ist. Wenn Sie Leseberechtigung für ein Verzeichnis haben, sollte der Inhalt unabhängig von der Berechtigung für Dateien/Unterverzeichnisse aufgelistet werden. Eine andere Möglichkeit ist, dass die Dateien und Verzeichnisse versteckt sind. Versuchen Sie es mit Laufen ls -a directory. Sie können erneut überprüfen, ob Sie Leseberechtigung für das Verzeichnis haben, indem Sie ausführen ls -ld directory. Überprüfen Sie auch die Ausgabe von alias ls.

Wenn ich -w-ein Verzeichnis habe, erhalte ich wie erwartet Fehler bei cdund . lsAber wenn ich versuche, eine neue Datei zu erstellen - touch directory/newfile- erhalte ich auch eine Fehlermeldung. Warum?

Sie sollten in der Lage sein, eine Datei zu erstellen, es sei denn, es existiert bereits eine andere Datei/Verzeichnis mit demselben Namen. Was ist der Fehler, den Sie erhalten?

Alle x -Kategorien funktionieren genau wie erwartet; Ich kann cdin Verzeichnisse mit --x, aber sonst nichts. Ich kann cdin Verzeichnisse mit -wx, Dateien erstellen und löschen, lsgibt aber einen Fehler zurück. Und ich kann cdin r-xVerzeichnisse wechseln, deren Inhalt auflisten und an Dateien arbeiten, für die ich vorhandene Berechtigungen habe, aber keine Dateien erstellen oder löschen kann. All dies ergibt für mich Sinn.

Also, was verstehe ich nicht richtig über r--und -w-?

Bitte gehen Sie die obige Diskussion noch einmal durch und sehen Sie, ob das hilft.