Das Kom­man­do­zei­len­pro­gramm chmod, eine Kurzform für „Change Mode“, wurde Anfang der 1970er-Jahre mit der ersten Version des AT&T-Unix ein­ge­führt. In unixoiden Mehr­be­nut­zer-Be­triebs­sys­te­men dient es der Vergabe von Zu­griffs­rech­ten in Da­tei­sys­te­men, die die klas­si­schen Unix-Da­tei­rech­te un­ter­stüt­zen. Dies trifft in der Regel auf alle Standard-Da­tei­sys­te­me in gängigen Linux-Derivaten für den Ser­ver­be­trieb zu. Für Än­de­run­gen, die via chmod an Da­tei­at­tri­bu­ten vor­ge­nom­men werden sollen, muss man entweder Besitzer dieser Datei sein oder über Root-Rechte verfügen.

Auf einem Großteil der Webserver laufen Dis­tri­bu­tio­nen des unixoiden Be­triebs­sys­tems Linux wie bei­spiels­wei­se Ubuntu. Allen Unix-Derivaten ist gemein, dass Dateien und Ver­zeich­nis­sen bestimmte Zu­griffs­rech­te zu­ge­ord­net werden. Ändern kann man diese mithilfe von chmod, einem Kom­man­do­zei­len­pro­gramm, das im Terminal durch den gleich­na­mi­gen Befehl aktiviert wird.

Wie nutzt man chmod?

Grund­sätz­lich beruht das System der Unix-Da­tei­rech­te auf Be­nut­zer­klas­sen und in­di­vi­du­ell zu­ge­wie­se­nen Grund­rech­ten. Dabei un­ter­stützt chmod zwei un­ter­schied­li­che Modi: die sym­bo­li­sche Notation mittels Buch­sta­ben sowie die Zuweisung von Da­tei­rech­ten durch zif­fern­ba­sier­te Ok­tal­codes. Eine Änderung der Zu­griffs­rech­te über den Befehl chmod kann, wie bereits erwähnt, nur vom Ei­gen­tü­mer der Datei oder dem Root-Benutzer durch­ge­führt werden. Der Befehl in der Kom­man­do­zei­le ent­spricht dabei stets folgender Syntax:

$ chmod options mode file

Auf den Befehl chmod folgt das fa­kul­ta­ti­ve Element „options“. Mit diesem lassen sich weitere Optionen des chmod-Befehls de­fi­nie­ren. Das Element „mode“ re­prä­sen­tiert eine Rech­te­mas­ke, die auf das nach­fol­gen­de „file“, also eine Datei oder ein Ver­zeich­nis, an­ge­wen­det werden soll. Diese Maske be­inhal­tet die In­for­ma­ti­on, ob eine Be­nut­zer­klas­se neue Zu­griffs­rech­te erhalten soll oder ihr bereits vergebene Rechte entzogen werden.

Welche chmod-Modi gibt es?

Dem Unix-Da­tei­sys­tem ent­spre­chend hat jede Datei auf einem Linux-Server in­di­vi­du­el­le Zu­griffs­rech­te. Das Gleiche gilt für Ver­zeich­nis­se. Die Regelung des Zu­griffs­rechts erfolgt dabei immer auf Basis folgender drei Be­nut­zer­klas­sen:

Ei­gen­tü­mer (user) In der Regel wird ein Benutzer, der eine Datei in einem Unix-Da­tei­sys­tem erstellt, au­to­ma­tisch als „user“ der Datei definiert. Die Ei­gen­tü­mer­schaft kann durch den Befehl „chown“ nach­träg­lich geändert werden.
Gruppe (group) Die Be­nut­zer­klas­se „group“ fasst ver­schie­de­ne Be­nut­zer­kon­ten auf dem Server zusammen. In unixoiden Da­tei­sys­te­men wird jedes Be­nut­zer­kon­to au­to­ma­tisch einer Haupt­grup­pe zu­ge­ord­net, auch eine Zu­ge­hö­rig­keit zu weiteren Gruppen ist möglich. Die Grup­pen­zu­ord­nung von Dateien kann sowohl vom Ei­gen­tü­mer als auch vom Root-Benutzer über den Befehl „chgrp“ kon­fi­gu­riert werden.
Sonstige Benutzer (others) Die Be­nut­zer­klas­se „others“ umfasst alle Benutzer, die weder Ei­gen­tü­mer der Datei noch Mit­glie­der einer zu­griffs­be­rech­ti­gen Gruppe sind.

Für das Setzen der Rechte stehen, wie bereits an­ge­deu­tet, zwei ver­schie­de­ne Modi zur Verfügung: Der sym­bo­li­sche Modus und der Ok­tal­mo­dus, deren Grundzüge in den folgenden Ab­schnit­ten kurz zu­sam­men­ge­fasst werden sollen.

Sym­bo­li­scher Modus

Im sym­bo­li­schen Modus werden den ver­schie­de­nen Be­nut­zer­klas­sen und Zu­griffs­rech­ten Buch­sta­ben zu­ge­ord­net. Durch eine Kom­bi­na­ti­on dieser Buch­sta­ben lässt sich also bequem angeben, welche Rechte hin­zu­ge­fügt bzw. entfernt werden sollen. Die nach­fol­gen­de Tabelle fasst die Aus­zeich­nungs­buch­sta­ben für Nutzer und Rechte im Rahmen der sym­bo­li­schen Notation zusammen:

Buchstabe für Zu­griffs­recht Bedeutung
r Leserecht; auch als R-Bit be­zeich­net
w Schreib­recht; auch als W-Bit be­zeich­net
x Execute-Recht (Ausführen); auch als X-Bit be­zeich­net
Buchstabe für Be­nut­zer­klas­se Bedeutung
u Be­nut­zer­klas­se „user“, Ei­gen­tü­mer
g Be­nut­zer­klas­se „group“, Gruppe
o Be­nut­zer­klas­se „others“, sonstige Nutzer
a „alle“; Befehl bezieht sich auf alle Be­nut­zer­klas­sen

Erfolgt die Er­stel­lung der Rech­te­mas­ke ent­spre­chend der sym­bo­li­schen Notation, kommen folgende Ope­ra­to­ren zum Einsatz, die die je­wei­li­gen Be­nut­zer­klas­sen mit Da­tei­rech­ten ver­knüp­fen:

+ Mit dem Operator „+“ werden einer Be­nut­zer­klas­se neue Da­tei­rech­te zu­ge­ord­net. Dabei werden nur die be­trof­fe­nen Da­tei­rech­te über­schrie­ben.
- Der Operator „-“ entzieht einer Be­nut­zer­klas­se ein Da­tei­recht.
= Sollen Da­tei­rech­te für eine Be­nut­zer­klas­se un­ge­ach­tet ihrer vorigen Rechte neu gesetzt werden, kommt der Operator „=“ zum Einsatz.

Soll nun bei­spiels­wei­se eine gerade ein­ge­führ­te Datei „beispiel.txt“ so mo­di­fi­ziert werden, dass nicht nur der Ei­gen­tü­mer (user), sondern auch alle anderen Benutzer (group, other) Schreib- und Le­se­rech­te bekommen, sähe der chmod-Befehl fol­gen­der­ma­ßen aus:

$ chmod ugo+rw beispiel.txt

Al­ter­na­ti­ve wäre ein Verweis auf alle Be­nut­zer­klas­sen möglich:

$ chmod a+rw beispiel.txt

Im Terminal auf­ge­ru­fen würde die Datei „beispiel.txt“ nun statt der ur­sprüng­li­chen Zu­griffs­rech­te folgende Rech­te­ver­ga­be zeigen:

Zu­griffs­rech­te vor der Änderung aus­ge­führ­ter chmod-Befehl Zu­griffs­rech­te nach der Änderung
-rw------- a+rw -rw-rw-rw-
user: read, write group: keine Rechte other: keine Rechte a = all + = Zu­griffs­recht hin­zu­fü­gen r = read w = write user: read, write group: read, write other: read, write

Ok­tal­mo­dus

Die sym­bo­li­sche Notation ist an­schau­lich, bei häufiger Anwendung jedoch un­hand­lich. Viele Ad­mi­nis­tra­to­ren greifen bei der Zuweisung von Zu­griffs­rech­ten daher auf eine Ok­tal­no­ta­ti­on zurück. Dabei handelt es sich um eine drei­stel­li­ge Zif­fern­fol­ge, bei der jede Stelle für eine Be­nut­zer­klas­se des Servers steht. Die Ok­tal­no­ta­ti­on ori­en­tiert sich dabei an der Stan­dard­rei­hen­fol­ge:

Zif­fern­stel­le der Be­nut­zer­klas­se Bedeutung
1 Ent­spricht der Be­nut­zer­klas­se „Ei­gen­tü­mer“ (user)
2 Ent­spricht der Be­nut­zer­klas­se „Gruppe“ (group)
3 Ent­spricht der Be­nut­zer­klas­se „Sonstige (others)

Welche Zu­griffs­rech­te den einzelnen Be­nut­zer­klas­sen zu­ge­ord­net werden, ergibt sich aus dem Wert einer jeden Ziffer. Dieser errechnet sich aus der Summe der Ein­zel­wer­te, die den je­wei­li­gen Rechten zu­ge­ord­net sind:

Wert für Zu­griffs­recht Bedeutung
4 Lesen
2 Schreiben
1 Ausführen
0 Keine Rechte

Ent­spre­chend dieser Zuordnung ergeben sich folgende Wer­te­kom­bi­na­tio­nen für Zu­griffs­rech­te:

Wert Zu­griffs­recht(e)
0 Keine
1 Nur Ausführen
2 Nur Schreiben
3 Schreiben/Ausführen
4 Nur Lesen
5 Lesen/Ausführen
6 Lesen/Schreiben

Ver­an­schau­li­chen lässt sich die Ok­tal­no­ta­ti­on ebenfalls am besten an einem Beispiel. An­ge­nom­men der Ei­gen­tü­mer der ex­em­pla­ri­schen Datei „beispiel.txt“ be­ab­sich­tigt, der Gruppe „bei­spiel­group“ ebenfalls Le­se­rech­te zu gewähren, käme folgender Oktalcode zum Einsatz:

$ chmod 640 beispiel.txt

Der Ei­gen­tü­mer behält durch den Wert 6 an erster Stelle der Rech­te­mas­ke die maximalen Zu­griffs­rech­te: 4 (Lesen) + 2 (Schreiben). Der zweite Wert der Rech­te­mas­ke gibt die Zu­griffs­rech­te der Gruppe an: 4 (Lesen). Für sonstige Benutzer, die an dritter Stelle aus­ge­zeich­net werden, sind keine Rechte vor­ge­se­hen, was dem­entspre­chend mit einer 0 kodiert wird.

Optionen des chmod-Befehls

Un­ab­hän­gig davon, ob sich ein Benutzer für die sym­bo­li­sche oder die nu­me­ri­sche Notation ent­schei­det, stehen ihm bei der Vergabe von Zu­griffs­rech­ten ver­schie­de­ne Optionen zur Verfügung. Diese werde in der Kom­man­do­zei­le zwischen Befehl und Rech­te­mas­ke eingefügt.

Code Option Be­schrei­bung
-R recursive Die Änderung der Zu­griffs­rech­te bezieht sich auf alle Dateien und Un­ter­ver­zeich­nis­se innerhalb eines Ordners.
-v verbose Nach dem Kom­man­do­zei­len­be­fehl wird eine Diagnose für alle ver­ar­bei­te­ten Dateien aus­ge­ge­ben.
-c changes Nach dem Kom­man­do­zei­len­be­fehl wird eine Diagnose für alle Dateien aus­ge­ge­ben, die sich geändert haben.
-f silent Feh­ler­mel­dun­gen werden un­ter­drückt.

Folgendes Beispiel zeigt einen Kom­man­do­zei­len­be­fehl, bei dem sich die Änderung der Zu­griffs­rech­te rekursiv auf die Un­ter­ver­zeich­nis­se und Dateien innerhalb des Ordners bezieht:

$ chmod -R 744 beispielordner

Für alle Dateien und Un­ter­ord­ner im Ver­zeich­nis „bei­spiel­ord­ner“ gilt: Der Ei­gen­tü­mer bekommt volle Zu­griffs­rech­te (7), Grup­pen­mit­glie­der und sonstige Benutzer haben lediglich einen Le­se­zu­griff (4).

Anwendung von chmod an einem Beispiel de­mons­triert

Ab­schlie­ßend soll die Ver­wen­dung von chmod noch einmal an einem konkreten Beispiel ver­deut­licht werden.

Starten soll die De­mons­tra­ti­on aber zunächst mit einer ge­ne­rel­len In­spek­ti­on aktuell ver­ge­be­ner Rechte. Dies funk­tio­niert in Linux/Unix-Systemen mithilfe des Befehls „ls“, nach dessen Ausführen der Inhalt des auf­ge­ru­fe­nen Ver­zeich­nis­ses angezeigt wird. Wird der Parameter „-l“ an­ge­han­gen, erhält man die einzelnen Dateien in einem über­sicht­li­chen Lis­ten­for­mat:

ls -l

Eine mögliche Ausgabe für dieses Kommando, die in diesem Fall ex­em­pla­risch 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 ab­ge­frag­ten Pfad sind also zwei Dateien („Datei1.txt“ und „Datei2.txt“) und ein Ver­zeich­nis („Ver­zeich­nis“) zu finden. Jeder einzelne Eintrag beginnt dabei mit einem zehn­stel­li­gen Zei­chen­block, der in diesem Fall von be­son­de­rem Interesse ist, da er Auskunft über die Zu­griffs­be­rech­ti­gun­gen auf die Dateien bzw. das Ver­zeich­nis gibt:

Das Zeichen an erster Stelle gibt an, um was es sich genau handelt. Im Falle einer einfachen Datei steht dort das Mi­nus­zei­chen wie bei den ersten beiden Beiträgen. Ein „d“ (für directory dt. „Ver­zeich­nis“) kenn­zeich­net Ver­zeich­nis­se, bei Verweisen stünde dort ein „l“ (für link).

Es folgen die drei ent­schei­den­den Blöcke – mit jeweils drei Zeichen –, die über die aktuellen Zu­griffs­rech­te in­for­mie­ren. Hier gilt die bereits aus der Ok­tal­no­ta­ti­on bekannte Rei­hen­fol­ge: Block 1 steht für den Ei­gen­tü­mer, Block 2 für die Be­nut­zer­klas­se „Gruppe“, Block 3 für alle anderen Nutzer. Auch innerhalb der einzelnen Blocks ist die Rei­hen­fol­ge immer gleich:

  • Die erste Stelle zeigt an, ob Le­se­zu­griff (r) vorhanden ist,
  • Stelle 2 gibt Auskunft über den Schreib­zu­griff (w)
  • und anhand des dritten Zeichens eines Dreier-Blocks wird er­sicht­lich, ob die jeweilige Be­nut­zer­klas­se auch die Rechte zum Ausführen (x) besitzt.

Ist der Buchstabe gesetzt, sind die ent­spre­chen­den Rechte gegeben. An­dern­falls steht an der je­wei­li­gen Position ein Mi­nus­zei­chen. Für die beiden Dateien und das Ver­zeich­nis heißt das also Folgendes:

Datei1.txt

  Ei­gen­tü­mer Gruppe Sonstige Nutzer
Lesen x x
Schreiben x x
Ausführen x x

Datei2.txt

  Ei­gen­tü­mer Gruppe Sonstige Nutzer
Lesen
Schreiben x
Ausführen x x x

Ver­zeich­nis

  Ei­gen­tü­mer Gruppe Sonstige Nutzer
Lesen
Schreiben x x
Ausführen

chmod-Beispiel: Neue Rechte hin­zu­fü­gen

In einem ersten An­wen­dungs­bei­spiel für chmod sollen nun Lese- und Aus­füh­rungs­rech­te für Datei1.txt, die bis dato dem Ei­gen­tü­mer vor­be­hal­ten sind, für alle Nut­zer­klas­sen frei­ge­schal­tet werden. Das passende chmod-Kommando (sym­bo­li­sche Notation) lautet fol­gen­der­ma­ßen:

chmod a+rx Datei1.txt

Alle Nut­zer­klas­sen (a) erhalten also für das Dokument Datei1.txt neue Rechte (+) und zwar das Recht, diese Datei zu lesen (r) und aus­zu­füh­ren (x).

Lässt man sich in der Folge die Auf­lis­tung der ver­ge­be­nen 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 De­mons­tra­ti­ons­bei­spiel soll der Schreib­zu­griff auf Datei2.txt für alle Nutzer, also auch für den Ei­gen­tü­mer und für die Be­nut­zer­klas­se „Gruppe“, per chmod entzogen werden. Die dazu passende Eingabe (erneut sym­bo­li­sche Notation) sieht wie folgt aus:

chmod a-w Datei2.txt

Auch in diesem chmod-Beispiel bezieht sich das Kommando auf alle Nut­zer­klas­sen (a). Das Schreib­recht (w) für Datei2.txt wird allen Nutzern entzogen (-). Der neue Eintrag für die Datei sieht im Anschluss ent­spre­chend so aus:

-r--r--r--  1 det det    0 2020-02-02 10:41 Datei2.txt
Zum Hauptmenü