Was ist der Modus
Der Begriff „Modus einer Datei“ bezieht sich auf die auf Linux-Systemen verfügbaren Standarddateiberechtigungen (ohne Berücksichtigung von Zugriffssteuerungslisten , die eine andere Rasse darstellen).
Der Modus einer Datei besteht aus 12 Bits, die jeweils eine Berechtigung darstellen, die erteilt werden kann oder nicht (ein Bit reicht also aus, um dies anzuzeigen).
ZB ist die Berechtigung "Datei darf von Gruppenmitgliedern gelesen werden" das 6. Bit von rechts.
Zur Vereinfachung der Verwendung sind diese 12 Bits in 4 Gruppen mit jeweils 3 Bits unterteilt. Eine 3-Bit-Binärzahl kann 8 verschiedene Werte annehmen. Dies entspricht genau der Anzahl von Werten, die eine Oktalzahl (0–7) darstellen kann.
So können die zwölf Berechtigungen als 4-stellige Oktalzahl im Bereich von 0 bis 7777 dargestellt werden.
Um es etwas verwirrender zu machen, wird häufig eine Oktalzahl mit einer zusätzlichen führenden Null angegeben (genau wie 0x
Hexadezimalzahlen durch die Konvention vorangestellt werden), daher sind die Modi 0–07777.
Um es einfacher zu machen: In den meisten Fällen interessieren Sie sich nur für die niedrigen neun Bits, daher werde ich mich von jetzt an auf 0–0777 konzentrieren.
Warum ist es in Oktal geschrieben
Warum das Oktalsystem verwenden? Es macht es einfacher, den Modus zu lesen!
Die niedrigsten neun Bits des Modus repräsentieren die folgenden Berechtigungsbits in dieser Reihenfolge . Anstelle der Binärdarstellung zeige ich den Wert des jeweiligen Bits in Oktal (kopiert von chmod
(2)):
00400 read by owner
00200 write by owner
00100 execute/search by owner
00040 read by group
00020 write by group
00010 execute/search by group
00004 read by others
00002 write by others
00001 execute/search by others
Sehen Sie das Muster? 1
Stellt immer Ausführen / Suchen dar, 2
ist immer Schreiben und 4
wird immer gelesen. Wenn Lesen und Ausführen erlaubt sind, aber nicht Schreiben, ist es immer die Ziffer 5
, alle 3 Berechtigungen Lesen / Schreiben / Ausführen sind immer zusammen 7
. Schauen Sie sich zum Vergleich die Dezimalwerte an:
Allow read/execute for others: 0005, decimal 5.
Allow read/execute for group: 0050, decimal 40.
Allow read/execute for owner: 0500, decimal 320.
Allow read/execute for owner and group: 0550, decimal 360.
Allow read/execute for all, write
only for owner: 0755, decimal 493.
Oktal macht es also ein bisschen konsistenter: Die Position der Ziffer ist Eigentümer / Gruppe / andere, und die Ziffer sagt Ihnen alles über die drei Lese- / Schreib- / Ausführungsbits.
Was ist die Umask?
Die umask ist eine Eigenschaft eines Prozesses (dh eines laufenden Programms, z. B. Ihrer Shell) und jeder Prozess hat eine. Hiermit werden die Berechtigungen festgelegt, die beim Erstellen einer neuen Datei nicht festgelegt werden sollen . Der Shell-Befehl umask
legt die Maske der Shell fest. Wenn diese Shell ein anderes Programm startet, übernimmt dieses die umask von der aufrufenden Shell. Das Festlegen einer umask in einer Shell hat also keine Auswirkungen auf andere Programme, es sei denn, sie stammen von der ersten Shell ab und wurden nach dem Festlegen der umask erstellt. Aus diesem Grund sollte die umask sehr früh in Ihrer Sitzung durch ein Skript festgelegt werden.
Egal was andere Leute sagen, benutze 077
;-)
Wenn eine neue Datei erstellt wird , übergibt das Programm die gewünschten Berechtigungen an den open
(2) Systemaufruf. Das Betriebssystem entfernt die in der umask gesetzten Bits und das Ergebnis wird zum Erstellen der Datei verwendet. Sie können das folgende C-Programm zum Testen verwenden:
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <err.h>
#include <stdio.h>
int main(int argc, char **argv) {
// check for enough command line arguments
if (argc < 3)
errx(1, "Usage: %s <filename> <octalmode>", argv[0]);
// parse 2nd argument as octal integer
char *endptr = NULL;
int mode = (int)strtol(argv[2], &endptr, 8);
if (!*argv[2] || *endptr || mode < 0)
errx(2, "Not an octal mode: %s", argv[2]);
// create new file with given mode
int fd = open(
argv[1],
O_WRONLY|O_CREAT|O_EXCL,
mode
);
if (fd < 0)
err(1, "Failed to create file %s", argv[1]);
printf("open(\"%s\", ..., 0%03o) successful\n", argv[1], mode);
close(fd);
return 0;
}
Kompilieren:
$ gcc -o mkfile mkfile.c
Folgen Sie diesem Beispiel:
$ umask 77 # set umask to 0077
$ umask # check umask
0077
$ rm -f foo # delete old to make sure a new file will be created
$ ./mkfile foo 660 # create file `foo` with mode 0660
open("foo", ..., 0660) successful
$ ls -l foo
-rw------- 1 sk users 0 Nov 6 12:09 foo
Beachten Sie, wie das Programm die Berechtigungen rw-rw ----, dh Modus 0660, angefordert hat, aber die Berechtigungen der Gruppe wurden vollständig von der umask entfernt.
umask: 0077 000 000 111 111
umask bitwise negated: 07700 111 111 000 000
open's argument: 0660 000 110 110 000
(open's argument) AND (NEG umask) 0600 000 110 000 000
Im Allgemeinen sollte ein Programm vorschlagen, welche Berechtigungen es im günstigsten Fall für nützlich hält, und das Entfernen der Berechtigungen der umask des Betriebssystems überlassen. Verwenden Sie also 0777, wenn Sie ein Verzeichnis mit mkdir
(2) erstellen, und 0666, wenn Sie eine einfache Datei mit open
(2) erstellen . Abweichung nur dann, wenn dies sinnvoll ist, z. B. wenn ein Verschlüsselungsprogramm open
mit 0600 seinen privaten Schlüssel speichert und ein Compiler 0755
die von ihm erstellte ausführbare Binärdatei verwendet. In all diesen Fällen entfernt die umask unerwünschte Berechtigungen aus der Datei, wenn sie tatsächlich erstellt wird.
Hier ist ein Beispiel, in dem der Compiler versucht, eine Datei zu erstellen, die von jedem gelesen und ausgeführt werden kann, die jedoch nur vom Benutzer (Modus 0755) in einer Einstellung mit umask 077 geschrieben werden kann:
$ rm -f foo
$ umask 77
$ ./mkfile foo 0755
open("foo", ..., 0755) successful
$ ls -l foo
-rwx------ 1 sk users 0 Nov 6 12:15 foo
Und in einer Einstellung mit umask 0 (alle vom Programm angeforderten Bits zulassen):
$ rm -f foo
$ umask 0
$ ./mkfile foo 0755
open("foo", ..., 0755) successful
$ ls -l foo
-rwxr-xr-x 1 sk users 0 Nov 6 12:16 foo
Tatsächlich gcc
fordert der sogar Modus 0777 an:
$ umask 0
$ rm -f mkfile
$ gcc -o mkfile mkfile.c
$ ls -l mkfile
-rwxrwxrwx 1 sk users 17k Nov 6 12:19 mkfile
Also nicht verwenden umask 0.