Was ist chmod?
Das Kommandozeilenprogramm chmod, eine Kurzform für „Change Mode“, wurde Anfang der 1970er-Jahre mit der ersten Version des AT&T-Unix eingeführt. In unixoiden Mehrbenutzer-Betriebssystemen dient es der Vergabe von Zugriffsrechten in Dateisystemen, die die klassischen Unix-Dateirechte unterstützen. Dies trifft in der Regel auf alle Standard-Dateisysteme in gängigen Linux-Derivaten für den Serverbetrieb zu. Für Änderungen, die via chmod an Dateiattributen vorgenommen werden sollen, muss man entweder Besitzer dieser Datei sein oder über Root-Rechte verfügen.
Auf einem Großteil der Webserver laufen Distributionen des unixoiden Betriebssystems Linux wie beispielsweise Ubuntu. Allen Unix-Derivaten ist gemein, dass Dateien und Verzeichnissen bestimmte Zugriffsrechte zugeordnet werden. Ändern kann man diese mithilfe von chmod, einem Kommandozeilenprogramm, das im Terminal durch den gleichnamigen Befehl aktiviert wird.
Wie nutzt man chmod?
Grundsätzlich beruht das System der Unix-Dateirechte auf Benutzerklassen und individuell zugewiesenen Grundrechten. Dabei unterstützt chmod zwei unterschiedliche Modi: die symbolische Notation mittels Buchstaben sowie die Zuweisung von Dateirechten durch ziffernbasierte Oktalcodes. Eine Änderung der Zugriffsrechte über den Befehl chmod kann, wie bereits erwähnt, nur vom Eigentümer der Datei oder dem Root-Benutzer durchgeführt werden. Der Befehl in der Kommandozeile entspricht dabei stets folgender Syntax:
$ chmod options mode file
Auf den Befehl chmod folgt das fakultative Element „options“. Mit diesem lassen sich weitere Optionen des chmod-Befehls definieren. Das Element „mode“ repräsentiert eine Rechtemaske, die auf das nachfolgende „file“, also eine Datei oder ein Verzeichnis, angewendet werden soll. Diese Maske beinhaltet die Information, ob eine Benutzerklasse neue Zugriffsrechte erhalten soll oder ihr bereits vergebene Rechte entzogen werden.
Welche chmod-Modi gibt es?
Dem Unix-Dateisystem entsprechend hat jede Datei auf einem Linux-Server individuelle Zugriffsrechte. Das Gleiche gilt für Verzeichnisse. Die Regelung des Zugriffsrechts erfolgt dabei immer auf Basis folgender drei Benutzerklassen:
Eigentümer (user) | In der Regel wird ein Benutzer, der eine Datei in einem Unix-Dateisystem erstellt, automatisch als „user“ der Datei definiert. Die Eigentümerschaft kann durch den Befehl „chown“ nachträglich geändert werden. |
Gruppe (group) | Die Benutzerklasse „group“ fasst verschiedene Benutzerkonten auf dem Server zusammen. In unixoiden Dateisystemen wird jedes Benutzerkonto automatisch einer Hauptgruppe zugeordnet, auch eine Zugehörigkeit zu weiteren Gruppen ist möglich. Die Gruppenzuordnung von Dateien kann sowohl vom Eigentümer als auch vom Root-Benutzer über den Befehl „chgrp“ konfiguriert werden. |
Sonstige Benutzer (others) | Die Benutzerklasse „others“ umfasst alle Benutzer, die weder Eigentümer der Datei noch Mitglieder einer zugriffsberechtigen Gruppe sind. |
Für das Setzen der Rechte stehen, wie bereits angedeutet, zwei verschiedene Modi zur Verfügung: Der symbolische Modus und der Oktalmodus, deren Grundzüge in den folgenden Abschnitten kurz zusammengefasst werden sollen.
Symbolischer Modus
Im symbolischen Modus werden den verschiedenen Benutzerklassen und Zugriffsrechten Buchstaben zugeordnet. Durch eine Kombination dieser Buchstaben lässt sich also bequem angeben, welche Rechte hinzugefügt bzw. entfernt werden sollen. Die nachfolgende Tabelle fasst die Auszeichnungsbuchstaben für Nutzer und Rechte im Rahmen der symbolischen Notation zusammen:
Buchstabe für Zugriffsrecht | Bedeutung |
r | Leserecht; auch als R-Bit bezeichnet |
w | Schreibrecht; auch als W-Bit bezeichnet |
x | Execute-Recht (Ausführen); auch als X-Bit bezeichnet |
Buchstabe für Benutzerklasse | Bedeutung |
u | Benutzerklasse „user“, Eigentümer |
g | Benutzerklasse „group“, Gruppe |
o | Benutzerklasse „others“, sonstige Nutzer |
a | „alle“; Befehl bezieht sich auf alle Benutzerklassen |
Erfolgt die Erstellung der Rechtemaske entsprechend der symbolischen Notation, kommen folgende Operatoren zum Einsatz, die die jeweiligen Benutzerklassen mit Dateirechten verknüpfen:
+ | Mit dem Operator „+“ werden einer Benutzerklasse neue Dateirechte zugeordnet. Dabei werden nur die betroffenen Dateirechte überschrieben. |
- | Der Operator „-“ entzieht einer Benutzerklasse ein Dateirecht. |
= | Sollen Dateirechte für eine Benutzerklasse ungeachtet ihrer vorigen Rechte neu gesetzt werden, kommt der Operator „=“ zum Einsatz. |
Soll nun beispielsweise eine gerade eingeführte Datei „beispiel.txt“ so modifiziert werden, dass nicht nur der Eigentümer (user), sondern auch alle anderen Benutzer (group, other) Schreib- und Leserechte bekommen, sähe der chmod-Befehl folgendermaßen aus:
$ chmod ugo+rw beispiel.txt
Alternative wäre ein Verweis auf alle Benutzerklassen möglich:
$ chmod a+rw beispiel.txt
Im Terminal aufgerufen würde die Datei „beispiel.txt“ nun statt der ursprünglichen Zugriffsrechte folgende Rechtevergabe zeigen:
Zugriffsrechte vor der Änderung | ausgeführter chmod-Befehl | Zugriffsrechte nach der Änderung |
-rw------- | a+rw | -rw-rw-rw- |
user: read, write group: keine Rechte other: keine Rechte | a = all + = Zugriffsrecht hinzufügen r = read w = write | user: read, write group: read, write other: read, write |
Oktalmodus
Die symbolische Notation ist anschaulich, bei häufiger Anwendung jedoch unhandlich. Viele Administratoren greifen bei der Zuweisung von Zugriffsrechten daher auf eine Oktalnotation zurück. Dabei handelt es sich um eine dreistellige Ziffernfolge, bei der jede Stelle für eine Benutzerklasse des Servers steht. Die Oktalnotation orientiert sich dabei an der Standardreihenfolge:
Ziffernstelle der Benutzerklasse | Bedeutung |
1 | Entspricht der Benutzerklasse „Eigentümer“ (user) |
2 | Entspricht der Benutzerklasse „Gruppe“ (group) |
3 | Entspricht der Benutzerklasse „Sonstige (others) |
Welche Zugriffsrechte den einzelnen Benutzerklassen zugeordnet werden, ergibt sich aus dem Wert einer jeden Ziffer. Dieser errechnet sich aus der Summe der Einzelwerte, die den jeweiligen Rechten zugeordnet sind:
Wert für Zugriffsrecht | Bedeutung |
4 | Lesen |
2 | Schreiben |
1 | Ausführen |
0 | Keine Rechte |
Entsprechend dieser Zuordnung ergeben sich folgende Wertekombinationen für Zugriffsrechte:
Wert | Zugriffsrecht(e) |
0 | Keine |
1 | Nur Ausführen |
2 | Nur Schreiben |
3 | Schreiben/Ausführen |
4 | Nur Lesen |
5 | Lesen/Ausführen |
6 | Lesen/Schreiben |
Veranschaulichen lässt sich die Oktalnotation ebenfalls am besten an einem Beispiel. Angenommen der Eigentümer der exemplarischen Datei „beispiel.txt“ beabsichtigt, der Gruppe „beispielgroup“ ebenfalls Leserechte zu gewähren, käme folgender Oktalcode zum Einsatz:
$ chmod 640 beispiel.txt
Der Eigentümer behält durch den Wert 6 an erster Stelle der Rechtemaske die maximalen Zugriffsrechte: 4 (Lesen) + 2 (Schreiben). Der zweite Wert der Rechtemaske gibt die Zugriffsrechte der Gruppe an: 4 (Lesen). Für sonstige Benutzer, die an dritter Stelle ausgezeichnet werden, sind keine Rechte vorgesehen, was dementsprechend mit einer 0 kodiert wird.
Optionen des chmod-Befehls
Unabhängig davon, ob sich ein Benutzer für die symbolische oder die numerische Notation entscheidet, stehen ihm bei der Vergabe von Zugriffsrechten verschiedene Optionen zur Verfügung. Diese werde in der Kommandozeile zwischen Befehl und Rechtemaske eingefügt.
Code | Option | Beschreibung |
-R | recursive | Die Änderung der Zugriffsrechte bezieht sich auf alle Dateien und Unterverzeichnisse innerhalb eines Ordners. |
-v | verbose | Nach dem Kommandozeilenbefehl wird eine Diagnose für alle verarbeiteten Dateien ausgegeben. |
-c | changes | Nach dem Kommandozeilenbefehl wird eine Diagnose für alle Dateien ausgegeben, die sich geändert haben. |
-f | silent | Fehlermeldungen werden unterdrückt. |
Folgendes Beispiel zeigt einen Kommandozeilenbefehl, bei dem sich die Änderung der Zugriffsrechte rekursiv auf die Unterverzeichnisse und Dateien innerhalb des Ordners bezieht:
$ chmod -R 744 beispielordner
Für alle Dateien und Unterordner im Verzeichnis „beispielordner“ gilt: Der Eigentümer bekommt volle Zugriffsrechte (7), Gruppenmitglieder und sonstige Benutzer haben lediglich einen Lesezugriff (4).
Anwendung von chmod an einem Beispiel demonstriert
Abschließend soll die Verwendung von chmod noch einmal an einem konkreten Beispiel verdeutlicht werden.
Starten soll die Demonstration aber zunächst mit einer generellen Inspektion aktuell vergebener Rechte. Dies funktioniert in Linux/Unix-Systemen mithilfe des Befehls „ls“, nach dessen Ausführen der Inhalt des aufgerufenen Verzeichnisses angezeigt wird. Wird der Parameter „-l“ angehangen, erhält man die einzelnen Dateien in einem übersichtlichen Listenformat:
ls -l
Eine mögliche Ausgabe für dieses Kommando, die in diesem Fall exemplarisch gewählt ist, könnte wie folgt aussehen:
insgesamt 3
-rwx------ 1 det det 0 2020-02-02 10:41 Datei1.txt
-rw-rw-r-- 1 det det 0 2020-02-02 10:41 Datei2.txt
drwxr-xr-x 2 det det 4096 2020-02-02 10:44 Verzeichnis
Unter dem abgefragten Pfad sind also zwei Dateien („Datei1.txt“ und „Datei2.txt“) und ein Verzeichnis („Verzeichnis“) zu finden. Jeder einzelne Eintrag beginnt dabei mit einem zehnstelligen Zeichenblock, der in diesem Fall von besonderem Interesse ist, da er Auskunft über die Zugriffsberechtigungen auf die Dateien bzw. das Verzeichnis gibt:
Das Zeichen an erster Stelle gibt an, um was es sich genau handelt. Im Falle einer einfachen Datei steht dort das Minuszeichen wie bei den ersten beiden Beiträgen. Ein „d“ (für directory dt. „Verzeichnis“) kennzeichnet Verzeichnisse, bei Verweisen stünde dort ein „l“ (für link).
Es folgen die drei entscheidenden Blöcke – mit jeweils drei Zeichen –, die über die aktuellen Zugriffsrechte informieren. Hier gilt die bereits aus der Oktalnotation bekannte Reihenfolge: Block 1 steht für den Eigentümer, Block 2 für die Benutzerklasse „Gruppe“, Block 3 für alle anderen Nutzer. Auch innerhalb der einzelnen Blocks ist die Reihenfolge immer gleich:
- Die erste Stelle zeigt an, ob Lesezugriff (r) vorhanden ist,
- Stelle 2 gibt Auskunft über den Schreibzugriff (w)
- und anhand des dritten Zeichens eines Dreier-Blocks wird ersichtlich, ob die jeweilige Benutzerklasse auch die Rechte zum Ausführen (x) besitzt.
Ist der Buchstabe gesetzt, sind die entsprechenden Rechte gegeben. Andernfalls steht an der jeweiligen Position ein Minuszeichen. Für die beiden Dateien und das Verzeichnis heißt das also Folgendes:
Datei1.txt
Eigentümer | Gruppe | Sonstige Nutzer | |
Lesen | x | x | |
Schreiben | x | x | |
Ausführen | x | x |
Datei2.txt
Eigentümer | Gruppe | Sonstige Nutzer | |
Lesen | |||
Schreiben | x | ||
Ausführen | x | x | x |
Verzeichnis
Eigentümer | Gruppe | Sonstige Nutzer | |
Lesen | |||
Schreiben | x | x | |
Ausführen |
chmod-Beispiel: Neue Rechte hinzufügen
In einem ersten Anwendungsbeispiel für chmod sollen nun Lese- und Ausführungsrechte für Datei1.txt, die bis dato dem Eigentümer vorbehalten sind, für alle Nutzerklassen freigeschaltet werden. Das passende chmod-Kommando (symbolische Notation) lautet folgendermaßen:
chmod a+rx Datei1.txt
Alle Nutzerklassen (a) erhalten also für das Dokument Datei1.txt neue Rechte (+) und zwar das Recht, diese Datei zu lesen (r) und auszuführen (x).
Lässt man sich in der Folge die Auflistung der vergebenen Rechte anzeigen, sieht der Eintrag für Datei1.txt nun so aus:
-rwxr-xr-x 1 det det 0 2020-02-02 10:41 Datei1.txt
chmod-Beispiel: Rechte entziehen
Im zweiten Demonstrationsbeispiel soll der Schreibzugriff auf Datei2.txt für alle Nutzer, also auch für den Eigentümer und für die Benutzerklasse „Gruppe“, per chmod entzogen werden. Die dazu passende Eingabe (erneut symbolische Notation) sieht wie folgt aus:
chmod a-w Datei2.txt
Auch in diesem chmod-Beispiel bezieht sich das Kommando auf alle Nutzerklassen (a). Das Schreibrecht (w) für Datei2.txt wird allen Nutzern entzogen (-). Der neue Eintrag für die Datei sieht im Anschluss entsprechend so aus:
-r--r--r-- 1 det det 0 2020-02-02 10:41 Datei2.txt