[[Inhaltsverzeichnis(1)]] Verändert die Zugriffsrechte von Dateien. = Aufruf = {{{#!vorlage Befehl chmod [Option] Modus Datei }}} oder {{{#!vorlage Befehl chmod [Option] Oktal-Modus Datei }}} Neben den hier aufgeführten Beispielen findet man in der [:man:Manpage] von '''chmod''' weitere Informationen. = Modi = Die Rechte einer Datei oder eines Verzeichnisses können für drei verschiedene Typen von Benutzern vergeben werden: || '''u''' || ''user'' || Besitzer der Datei || || '''g''' || ''group'' || Gruppe der Datei || || '''o''' || ''other'' || Andere Benutzer || || '''a''' || ''all'' || Alle Gruppen || Will man Rechte für alle drei gleichzeitig setzen, kann man den Buchstaben '''a''' auch wegfallen lassen. Jede Gruppe kann individuell folgende Rechte erhalten: || '''r''' || ''read'' || Leserechte || || '''w''' || ''write'' || Schreibrechte || || '''x''' || ''eXecute'' || Ausführungsrechte || || '''s''' || || SUID-Bit (wird [#SUID-bit weiter unten] noch erklärt) || Diese Rechte werden mit einem vorangestellten '''+''' einer Datei oder einem Verzeichnis gegeben und mit einem '''-''' entzogen. Mit einem '''=''' werden vorhandene Rechte entfernt und nur die angegebenen gesetzt. Mehrere Operationen dürfen direkt aneinander angehängt werden. == Beispiele == {{{#!vorlage Befehl chmod a+x Datei # Eine Datei für alle Nutzer ausführbar machen chmod u+r Datei # Der Eigentümer darf zusätzlich zu vorhandenen Rechten lesen. chmod a+w Datei # Alle dürfen zusätzlich zu vorhandenen Rechten schreiben chmod g-w Datei # Der Gruppe werden die Schreibrechte entzogen chmod u=rwx Datei # Der Eigentümer darf lesen, schreiben und ausführen chmod g=rw Datei # Die Gruppe darf __nur__ lesen und schreiben }}} [[Anker(oktal)]] = Oktal-Modi = || '''4''' || Leserechte || || '''2''' || Schreibrechte || || '''1''' || Ausführungsrechte || Die Rechte werden für den Dateibesitzer, die Dateigruppe und die Anderen separat addiert. An jeder Stelle bedeutet ein gesetzter Wert, dass die Rechte gewährt und ein 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. Der SUID-Bit kann mit dieser Methode nicht gesetzt werden. == Beispiele == {{{#!vorlage Befehl chmod 644 Datei # Der Eigentümer darf lesen und schreiben, alle anderen nur lesen. }}} Die 6 kommt durch die Addition von 4 und 2 zustande, genau wie die 7 im nächsten Beispiel durch 4 + 2 + 1. {{{#!vorlage Befehl chmod 744 Datei # Der Eigentümer darf lesen, schreiben und ausführen, alle anderen nur lesen. }}} = Anwendung an einem Beispiel = {{{#!vorlage Befehl det@datengrab:~/tmp/rechte$ 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. Wir wollen, dass alle sie lesen und ausführen dürfen: {{{#!vorlage Befehl det@datengrab:~/tmp/rechte$ chmod +rx Datei1.sh det@datengrab:~/tmp/rechte$ ls -l insgesamt 4 -rwxr-xr-x 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 }}} Anders sieht es mit den Schreibrechten aus. Wenn wir versuchen durch ein -w der Datei2.txt die Schreibrechte für alle zu entziehen, wird dies scheitern. Diese werden bei symbolischer Schreibweise immer nur dem Besitzer der Datei gegeben oder entzogen. {{{#!vorlage Befehl det@datengrab:~/tmp/rechte$ chmod -w Datei2.txt det@datengrab:~/tmp/rechte$ ls -l insgesamt 4 -rwxr-xr-x 1 det det 0 2005-07-07 10:41 Datei1.sh -r--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 }}} Wenn wir dies ändern wollen, greifen wir auf die oktale Schreibweise zurück: {{{#!vorlage Befehl det@datengrab:~/tmp/rechte$ chmod 444 Datei2.txt det@datengrab:~/tmp/rechte$ ls -l insgesamt 4 -rwxr-xr-x 1 det det 0 2005-07-07 10:41 Datei1.sh -r--r--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 }}} = Parameter = || ``-R`` || ``--recursive`` || Ändert die Zugriffsrechte von Dateien und Verzeichnissen rekursiv || || ``-v`` || ``--verbose`` || Ausgabe einer Diagnose für jede verarbeitete Datei || || ``-c`` || ``--changes`` || Wie ``--verbose``, aber nur bei wirklichen Änderungen || || ``-f`` || ``--silent``, ``--quiet`` || Unterdrücken der meisten Fehlermeldungen || mehr Parameter mit {{{#!vorlage Befehl chmod --help }}} [[Anker(SUID-bit)]] = SUID-Bit = {{{#!vorlage Warnung Setzen von SUID-BIT nur wenn es __unbedingt__ notwendig ist! }}} {{{#!vorlage Hinweis Das SUID-Bit funktioniert nicht bei Skripten! }}} Manchmal braucht man unter Linux die Möglichkeit, Benutzer Programme ausführen zu lassen, die sie eigentlich nicht ausführen dürfen (z.B. Passwort ändern, d.h. Schreibrechte auf die Datei '''/etc/shadow'''). Deswegen hat Linux die Option "Set User ID", oder auch kurz SUID-Bit. Ist das SUID-Bit gesetzt, wird eine ausführbare Datei nicht mit der Berechtigung des Benutzers, sondern mit der Berechtigung des Eigentümers der Datei ausgeführt. {{{#!vorlage Befehl ls -l /usr/bin/passwd -rwsr-xr-x 1 root root 25692 Mar 8 2001 /usr/bin/passwd ^ | \_______ s .. Das setuid-Bit. Normalerweise steht statt des s ein x... }}} SUID-Bit setzen: {{{#!vorlage Befehl chmod u+s Datei }}} = SGID-Bit = Mit dem ''Set Group ID Bit'' kann man gemeinsame Ordner einrichten. Ist dieser Bit gesetzt (mit ``chmod g+s OrdnerName``), dann vererbt sich die Benutzergruppe beim Erstellen eines neuen Unterordners mit. Man kann somit einen gemeinsamen Ordner einrichten, in dem mehrere Benutzer Dateien/Ordner erstellen können. Allerdings werden die Zugriffsrechte nicht vererbt, sondern richten sich weiterhin nach der aktuell eingestellten umask. Die Vorgehensweise: 1. Alle Benutzer, die Zugriff erhalten sollen, in eine gemeinsame Benutzergruppe stecken, siehe [:Benutzer_und_Gruppen:Benutzer und Gruppen]. Es empfiehlt sich die Benutzergruppe ''users'' dafür zu verwenden. 1. Ordner und alle Unterordner (Parameter ''-R'' für rekursiv) einrichten 1. Gruppe setzen: {{{#!vorlage Befehl sudo chown -R .GRUPPENNAME ORDNERNAME }}}(der Punkt vor dem Gruppennamen ist wichtig!) 1. SGID setzen: {{{#!vorlage Befehl chmod -R g+srwx ORDNERNAME }}} Nachprüfen kann man das mit einem '''ls -la''': {{{#!vorlage Befehl -rwxr-sr-x 1 root tty 9276 Mar 8 2001 /usr/bin/wall ^ | \__ s .. Group ID ist gesetzt }}} = 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 {} + }}} ---- # tag: Shell