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 directory
sollten); Schreibberechtigung bedeutet, dass Sie Dateien im Verzeichnis erstellen, ändern oder löschen können (dh , touch directory/newfile
oder 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 directory
es sollte funktionieren)
Aber das finde ich nicht.
Wenn ich mich r--
in einem Verzeichnis befinde, erhalte ich wie erwartet Fehler beim Versuch cd directory
oder . touch directory/newfile
Aber 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, ls
ist erfolgreich gelaufen, aber ohne Daten zur Standardausgabe. Warum nicht?
Wenn ich -w-
ein Verzeichnis habe, erhalte ich wie erwartet Fehler bei cd
und . ls
Aber 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 cd
in Verzeichnisse mit --x
, aber sonst nichts. Ich kann cd
in Verzeichnisse mit -wx
, Dateien erstellen und löschen, ls
gibt aber einen Fehler zurück. Und ich kann cd
in r-x
Verzeichnisse 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-
?
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 directory
dann die "Dateien" darin auflisten directory
sollten, aber wenn Sie ls -l
which-Aufrufe verwenden, schlägt stat(2)
die Operation stillschweigend fehl, da stat
ein 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 touch
den 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.
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 ls
Befehl 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
, cp
etc. 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 cd
in 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 directory
sollten);
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/newfile
odervi directory/fileimade
, oderrm 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/newfile
vi directory/fileimade
rm directory/fileihate
und Ausführungsberechtigung bedeutet, dass Sie das Verzeichnis zu Ihrem Arbeitsverzeichnis machen können (dh
cd directory
es sollte funktionieren)
Absolut korrekt.
Wenn ich mich
r--
in einem Verzeichnis befinde, erhalte ich wie erwartet Fehler beim Versuchcd directory
oder .touch directory/newfile
Aber wenn ich es ausführels 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,ls
ist 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 beicd
und .ls
Aber 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
cd
in Verzeichnisse mit--x
, aber sonst nichts. Ich kanncd
in Verzeichnisse mit-wx
, Dateien erstellen und löschen,ls
gibt aber einen Fehler zurück. Und ich kanncd
inr-x
Verzeichnisse 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.
CASmnl42
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?Jörg W Mittag
CASmnl42
readwrite
withrw-
permission und zwei Dateien innerhalb von namedrwtoedit
undrwtodelete
, beide mitrw-
Genehmigung (Berechtigungen sind ich als Eigentümer). Der Befehlrm -f readwrite/rwtodelete
schlägt mit Fehler fehlPermission denied
. Der Befehlvi readwrite/rwtoedit
lädt den Editor, aber nicht die Datei, wieder mitPermission denied
Fehler. 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?BowlOfRed