[[Vorlage(getestet, general)]] {{{#!vorlage Wissen [:Terminal:Ein Terminal öffnen] }}} {{{#!vorlage Warnung Man sollte außerhalb des Benutzerverzeichnisses (und '''/tmp''') keine Zugriffsrechte ändern, sofern man nicht genau weiß, was man tut! }}} [[Inhaltsverzeichnis(2)]] Mit '''chmod''' verändert man die [:Rechte:Zugriffsrechte] von Dateien. Dies funktioniert jedoch nur bei Dateisystemen, welche die Linux-Rechteverwaltung unterstützen (z. B. ext*, reiser, xfs, nicht aber FAT und NTFS). Verwandte Befehle sind: * [:chown:] legt den Besitzer und die Gruppenzugehörigkeit von Dateien fest. * [:chgrp:] legt die Gruppenzugehörigkeit von Dateien fest. * [:chattr:] verändert Datei-Attribute und Rechte auf ext2- und ext3-Dateisystemen . = Installation = Das Programm '''chmod''' ist im essentiellen Paket * '''coreutils''' von Ubuntu enthalten und ist deshalb auf jedem System installiert. = Aufruf = Die allgemeine Syntax lautet [1]: {{{#!vorlage Befehl chmod [Optionen] Modus Datei/Verzeichnis [Datei/Verzeichnis 2 [...]] }}} Neben den hier aufgeführten Beispielen findet man in der [:man:Manpage] von chmod weitere Informationen. = Modi = Es gibt zwei Arten, wie Zugriffsrechte gesetzt (und [:ls:angezeigt]) werden können: * '''symbolischer Modus''': Den Benutzerkategorien und Zugriffsrechten sind Buchstaben zugeordnet. Mit einer Kombination dieser Buchstaben wird angegeben, welche Rechte gesetzt oder entfernt werden sollen. * '''Oktal-Modus''': Die Rechte werden in Form einer dreistelligen Oktal-Zahl angegeben, wobei jede Ziffer für die Rechte einer Benutzerkategorie steht. Die Rechte einer Datei oder eines Verzeichnisses können für drei verschiedene Benutzerkategorien getrennt festgelegt werden: || Benutzertyp || symbolischer Modus || Oktalmodus || || Besitzer der Datei || `u` || 1. Ziffer || || Gruppe der Datei || `g` || 2. Ziffer || || Andere Benutzer || `o` || 3. Ziffer || Es gibt folgende Zugriffsrechte (ausführliche Informationen zu der Bedeutung der verschiedenen Zugriffsrechte findet man im Artikel [:Rechte:]): || Recht || symbolischer Modus || Oktalmodus || || Leserechte || `r` || 4 || || Schreibrechte || `w` || 2 || || Ausführungsrechte || `x` || 1 || || Setuid/Setgid ([:Rechte#Sonderrechte:Details]) || `s` ||<|2> ''siehe Experteninfo unten'' || || Sticky-Bit ([:Rechte#Sonderrechte:Details]) || `t` || == Symbolischer Modus == Der symbolische Modus besteht aus drei Teilen: * Zu Beginn stehen die Benutzerkategorien, denen die Rechte gesetzt bzw. entzogen werden sollen. Hier können mehrere Buchstaben kombiniert werden (z. B. `ug` für Benutzer und Gruppe) oder auch `a` angegeben werden (entspricht `ugo`) * Dann folgt der Operator: Mit `+` werden die Rechte gesetzt, mit `-` entzogen, mit einem `=` werden nur die explizit angegebenen Rechte gesetzt und die restlichen entzogen. * Zum Schluss folgen die Rechte. Auch hier können die jeweiligen Buchstaben einfach aneinandergehängt werden. {{{#!vorlage Experten Der erste Teil kann auch weggelassen werden. Das entspricht einem `a`, mit der Ausnahme, dass in der [:Rechte#umask:umask] gesetzte Bits ignoriert werden. Beispiel: {{{#!vorlage Befehl ls -l \}}}{{{ -rw-r--r-- 1 eigentümer gruppe 0 Sep 20 02:06 datei \}}} {{{#!vorlage Befehl chmod +rwx datei ls -l \}}}{{{ -rwxr-xr-x 1 eigentümer gruppe 0 Sep 20 02:06 datei* \}}} {{{#!vorlage Befehl chmod a+rwx datei ls -l \}}}{{{ -rwxrwxrwx 1 eigentümer gruppe 0 Sep 20 02:06 datei* \}}} {{{#!vorlage Befehl chmod -rwx datei \}}}{{{ chmod: datei: new permissions are ----w--w-, not --------- \}}} {{{#!vorlage Befehl ls -l datei \}}}{{{ -----w--w- 1 eigentümer gruppe 0 Sep 20 02:06 datei \}}} }}} === Beispiele === || Recht || Bedeutung || || `a+x` / `ugo+x` || Eine Datei für alle Nutzer ausführbar machen. || || `u+r` || Der Eigentümer darf (zusätzlich zu vorhandenen Rechten) lesen. || || `a+w` / `ugo+w` || Alle dürfen zusätzlich zu vorhandenen Rechten schreiben. || || `g-w` || Der Gruppe werden die Schreibrechte entzogen. || || `o=r` || Andere Benutzer dürfen nur lesen, nicht schreiben oder ausführen. || || `g=rw` || Die Gruppe darf __nur__ lesen und schreiben, ein eventuell vorhandenes Ausführungsrecht wird entfernt. || || `u+s` || Setzt das SetUID-Bit || [[Anker(oktal)]] == Oktal-Modus == Die Rechte werden für den Dateibesitzer, die Dateigruppe und andere separat addiert. An jeder Stelle bedeutet ein gesetzter Wert, dass die Rechte gewährt und eine 0, dass sie entzogen werden. Die Rechte werden somit durch drei Stellen vollständig beschrieben; die erste Stelle gibt die Rechte des Eigentümers, die zweite die Rechte der Gruppe und die letzte Stelle die Rechte für alle Übrigen an. {{{#!vorlage Experten Auch mit dem Oktalmodus können die Sonderrechte (SetUID / SetGID / Sticky) gesetzt werden: Dazu fügt man __vorne__ eine weitere Ziffer hinzu. Hier steht für SetUID die `4`, für SetGID die `2` und für Sticky die `1`. }}} === Beispiele === || Zahl || Bedeutung || || 644 || Der Eigentümer darf lesen und schreiben, alle anderen nur lesen. (`6 = 4 + 2`) || || 744 || Der Eigentümer darf lesen, schreiben und ausführen, alle anderen nur lesen. (`7 = 4 + 2 + 1`) || || 660 || Eigentümer und Gruppe dürfen lesen und schreiben, der Rest nichts. || || 4755 || Alle dürfen lesen und ausführen, der Eigentümer auch schreiben. Zusätzlich wird das SetUID-Bit gesetzt. || = Anwendung an einem Beispiel = {{{#!vorlage Befehl ls -l }}}{{{ insgesamt 4 -rwx------ 1 det det 0 2005-07-07 10:41 Datei1.sh -rw-rw-r-- 1 det det 0 2005-07-07 10:41 Datei2.txt drwxr-xr-x 2 det det 4096 2005-07-07 10:44 Verzeichnis }}} In diesem Beispiel befinden sich zwei Dateien und ein Verzeichnis. Am Anfang steht ein Block aus zehn Zeichen. Das erste zeigt an, um was für einen Dateityp es sich handelt. Bei einfachen Dateien steht dort ein - , bei Verzeichnissen ein `d` (directory), bei Verweisen ein `l` (link). Danach folgen drei Blöcke mit jeweils drei Zeichen. Der erste Block steht für den Dateibesitzer, der zweite für die Gruppe und der dritte für alle anderen. Jeder dieser Blöcke baut sich aus den Lese- (r, Read), den Schreib- (w, Write) und den Ausführungsrechten (x, eXecute) auf. Wenn der Buchstabe gesetzt ist, ist das Recht vorhanden. Die Datei '''Datei1.sh''' darf nur der Besitzer lesen, beschreiben und ausführen. Sie soll von allen gelesen und ausgeführt werden dürfen: {{{#!vorlage Befehl chmod a+rx Datei1.sh ls -l Datei1.sh }}}{{{ -rwxr-xr-x 1 det det 0 2005-07-07 10:41 Datei1.sh }}} Nun werden {{{#!vorlage Befehl chmod a-w Datei2.txt ls -l Datei2.txt }}}{{{ -r--r--r-- 1 det det 0 2005-07-07 10:41 Datei2.txt }}} = Optionen = ||<-2 cellstyle="background-color: #E2C890;" :>'''Optionen von chmod'''|| ||'''Option'''||'''Beschreibung'''|| || `-R`, ``--recursive`` || Ändert die Zugriffsrechte von Dateien und Verzeichnissen rekursiv, d.h. auch für Unterverzeichnisse und Dateien darin || || `-v`, ``--verbose`` || Ausgabe einer Diagnose für jede verarbeitete Datei || || `-c`, ``--changes`` || Wie ``--verbose``, aber nur, wenn auch etwas geändert wird || || `-f`, ``--silent``, ``--quiet`` || Unterdrücken der meisten Fehlermeldungen || Mehr Optionen erhält man mit `chmod --help` oder in der Manpage. = Rechte rekursiv setzen = In manchen Fällen möchte man für alle Dateien und Ordner in einem Verzeichnis die Rechte auf einmal setzen. Da Dateien und Ordner andere Rechte benötigen, kann man hier nicht mit einem Befehl arbeiten, aber `find` hilft hier: {{{#!vorlage Befehl find /verzeichnis/ -type d -exec chmod 755 {} + find /verzeichnis/ -type f -exec chmod 644 {} + }}} `-type d` bezieht sich hierbei auf "directory", also den Ordner, `-type f` auf "file", also die Dateien. Näheres dazu unter [:find:] # tag: Shell