Was ist das Maskieren eines Modus? [geschlossen]

-9

Ich verstehe, dass in GNU / Linux Dateiberechtigungen auch als Dateimodus bezeichnet werden und dass der Begriff "umask" mindestens die folgenden Bedeutungen haben kann:

  1. Der in die umaskShell eingebaute Befehl (die übliche Bedeutung).
  2. Der entsprechende Systemaufruf des eingebauten Befehls .
  3. Ein Shell - Prozess-Wert auch bezeichnet als Dateierstellungsmaske sowie bitmask oder maskiert .
  4. Eine benutzerspezifische Dateierstellungsmaske, die Prozesse ausführt, die für diesen Benutzer spezifisch sind (dann wird sie als Benutzermaske bezeichnet - Dateierstellungsmaske eines Benutzers).

Indem umaskwir den Befehl mit einem richtigen Argument ausführen, setzen wir die Maske für unseren aktuellen Shell-Prozessbaum . entweder für alle Benutzer im aktuellen Shell-Prozessbaum oder nur für unseren eigenen Benutzer. Im Allgemeinen werden solche Änderungen jedoch an neue Prozesse ( möglicherweise von einer anderen Shell ) vererbt .

Die mathematische Logik beinhaltet die Operation der Konjunktion AKA "anding" ( ), die auftritt, wenn " Das und einer Menge von Operanden ist wahr, wenn und nur wenn alle ihre Operanden wahr sind ". Basierend auf dieser Logik gibt es eine bitweise Operation mit identischem Namen . Anding ist anders als das Hinzufügen von Zahlen ( x + y → z) oder das Verketten von Zeichenfolgen ( x alongside y → xy).

Ich verstehe, dass man einen Modus auf diese Weise "maskieren" kann:

  OCTAL  BINARY       HUMAN-READABLE
  0666   0110110110  -rw-rw-rw-
 0555   0101101101  -r-xr-xr-x
  0444   0100100100  -r--r--r-- 

Meine Frage

Was bedeutet "Maskieren eines Modus" und wie kommt es 0666 ∧ 0555 → 0444?

JohnDoea
quelle
Verwandte Informationen: hier ,  hier ,  hier und  hier .
G-Man

Antworten:

11

umask, der Shell-Befehl und umaskdie Funktion legen beide die Datei-Erstellungsmaske fest, die auch als umask.

Sie haben dies umformuliert als

A umaskbedeutet sowohl eine Schale eingebaute Befehl und eine Shell - Funktion , die Basen , die eine variable allgemein als Befehl und enthält Dateierstellung Maske mit einem Wert , bezeichnet als Bitmaske oder maskieren .

was in vielerlei Hinsicht falsch ist:

  • Die umaskFunktion ist keine Shell-Funktion. siehe den Link oben;
  • Die Funktion enthält keine Variable. Hiermit wird die Dateierstellungsmaske des aktuellen Prozesses festgelegt.
  • der Wert beaufschlagten ist nicht nur allgemein bezeichnet als „Dateierstellungsmaske“, es ist die Dateierstellungsmaske (und sein Wert wird als „Bit - Maske“ oder „Maske“ nicht bezeichnet).

Eine Maske wirkt sich auf einige Dienstprogramme im aktuellen Prozessbaum aus, einschließlich anderer Shells, in denen sie geändert werden kann (daher hat Shell Y nicht unbedingt die Maske von Shell X).

Eine Maske beeinflusst im Allgemeinen nichts. Die Dateierstellungsmaske wirkt sich auf den aktuellen Prozess aus und wird von allen neu erstellten untergeordneten Prozessen übernommen. Untergeordnete Prozesse können sie selbst wieder ändern.

Diese Dateierstellungsmaske wirkt sich auf die Berechtigungen neu erstellter Dateien aus. Dateiberechtigungen, auch Dateimodus genannt, bestehen aus zwölf Bits, die die Zugriffsrechte des Besitzers, der Gruppe und anderer Benutzer der Datei codieren. Einzelheiten finden Sie in dieser kanonischen Antwort . Sie werden normalerweise als vier- oder dreistelliger Oktalwert dargestellt. Sie sind kein Strom von Bits.

Die Berechtigungen für neu erstellte Dateien werden entweder vom Programm festgelegt, das eine bestimmte Datei erstellt, oder standardmäßig festgelegt ( dh von der Funktion, die zum Erstellen von Dateien verwendet wird). Beispiele für erstere sind Programme, die Dateien (oder Verzeichnisse) mit openoder creatoder erstellen und mkdirden gewünschten Modus explizit angeben müssen. Beispiele für Letzteres sind Programme, die fopenDateien im Standardmodus 0666 verwenden. Der aktuelle umaskWert maskiert diesen Modus.

Sie haben dies umformuliert als

  1. Einige Dienstprogramme wie das mkdirErstellen einer Datei im Standalone-Modus (die Maske wird ignoriert).
  2. Einige Dienstprogramme verwenden die fopen()Funktion, bei der Dateien zuerst mit dem Standardmodus 0666 erstellt werden, umaskihr Modus jedoch unmittelbar nach der Erstellung in den Modus der Maske geändert wird.

was in vielerlei Hinsicht falsch ist:

  • Die Maske wird auf den angeforderten Modus angewendet, bevor die Datei erstellt wird, und nicht danach.
  • mkdir(Dies ist hier eine Funktion, kein Hilfsprogramm, aber das Gleiche gilt für das gleichnamige Hilfsprogramm.) Die Dateierstellungsmaske wird mit Sicherheit nicht ignoriert.

Wenn umaskberücksichtigt, ist der resultierende Modus das Ergebnis der Anwendung von umask als Bitmaske auf den angeforderten Modus: Jedes im angeforderten Modus gesetzte Bit wird gegen das entsprechende Bit in geprüft umaskund nur dann beibehalten, wenn letzteres nicht gesetzt ist. In Bezug auf Binäroperationen wird der angeforderte Modus bitweise mit dem Komplement von verknüpft umask. Somit umaskergibt a von 0022 mit einem Modus von 0666 0644; nicht durch Subtraktion, sondern weil 0666 & 0755 (0022's Komplement) 0644 ist. Ebenso umaskergibt a von 0011 mit einem Modus von 0666 0666.

Schauen wir uns die Berechnung genauer an. Es wird oft als Subtraktion dargestellt, auch in der Antwort, auf die Sie verwiesen haben, aber es ist wichtig zu verstehen, dass dies nicht der Fall ist. umaskwird als Maske angewendet. Ein Wert von 0022 wird folgendermaßen angewendet:

       Octal Binary
Mode   0666  000110110110
Mask   0022  000000010010  Bits set here mask bits above
Result 0044  000110100100

       Octal Binary
Mode   0644  000110100100
Mask   0022  000000010010
Result 0644  000110100100

Dies wird normalerweise durch bitweises Andern des Modus mit dem Komplement der Maske berechnet:

       Octal Binary
Mask   0022  000000010010
Compl. 7755  111111101101
Mode   0666  000110110110
Result 0644  000110100100

chmodWendet den in der Befehlszeile angegebenen Modus an, ohne dies umaskzu berücksichtigen. Auch andere Tools tun dies, selbst wenn sie Dateien erstellen. so cpund tar, wenn die entsprechenden Aufforderung Berechtigungen zu erhalten, werden Berechtigungen kopieren oder Berechtigungen wiederherstellen , ohne dabei umaskzu berücksichtigen.

Diese Antwort wird detaillierter.

Ihre letzten Fragen sind

Ist mein Verständnis genau genug und wie kommt es, dass 0666 ∧ 0555 → 0444?

Die Antwort auf die erste lautet anscheinend nicht. Die Antwort auf die zweite Frage lautet: So funktioniert es bitweise. Schreiben Sie die Operanden in Binär um:

Octal  Binary
0666   000110110110
0555   000101101101

Führen Sie nun eine bitweise und an jeder Bitposition durch. Dies bedeutet, dass jedes vertikal ausgerichtete Bitpaar und diese Bits verwendet werden (im obigen Beispiel dreimal 0 ∧ 0, dann 1 ∧ 1, 1 ∧ 0, 0 ∧ 1, 1 etc. 1 usw.):

       000100100100

(0 ∧ 0 ist 0, 0 ∧ 1 ist 0, 1 ∧ 0 ist 0, 1 ∧ 1 ist 1). Wandeln Sie das oben genannte zurück in ein Oktal um, und Sie erhalten 0444.

Stephen Kitt
quelle
8

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 0xHexadezimalzahlen 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? 1Stellt immer Ausführen / Suchen dar, 2ist immer Schreiben und 4wird 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 umasklegt 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 openmit 0600 seinen privaten Schlüssel speichert und ein Compiler 0755die 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 gccfordert 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.

stefan
quelle
2

Unter Linux ist die Standarddateiberechtigung 0644, die Standardverzeichnisberechtigung 0755 und die Standardumask 0022.

Da die vollständige Berechtigung einer Datei jetzt 0666 lautet, wurde die Standardberechtigung von (0666 - 0022 = 0644) und für das Verzeichnis (0777 - 0022 = 0755) verwendet.

Sie können die Maske mit festlegen. #umask 0000Sie erstellt Dateien und Verzeichnisse mit der vollständigen Berechtigung 666/777 (was jedoch sehr unsicher ist).

al mamun
quelle
0

Ich habe Probleme zu verstehen, was unter GNU / Linux umask ist

Okay.

sowie mit anding berechnen.

Ich habe dir die Formel gegeben:

mode=$(printf "%04o\n" "$(( (8#$default) & (~(8#$umask)) ))")

mit default = 0666 und umask = 0022 erhalten Sie:

$ printf "%04o\n" "$(( (8#0666) & (~(8#0022)) ))"
0644

Unter Linux bedeutet umask sowohl einen eingebauten Shell-Befehl als auch eine Kernelfunktion, die einen Systemwert ändert, der normalerweise als Dateierstellungsmaske AKA-Bitmaske oder einfach als Maske bezeichnet wird und vom eingebauten System mit einem Argument aufgerufen wird.

Sollte geschrieben werden als:

Unter Linux ist umask der Name einer eingebauten Shell, der Name einer Kernelfunktion und der Name eines Prozesswerts. Sowohl die eingebaute als auch die Funktion können den Prozesswert ändern.

  • Es ist kein Systemwert. Jeder Prozess hat eine umask, die auf seine untergeordneten Prozesse kopiert wird.
  • Der Prozesswert ist nicht in der Regel Dateierstellungsmaske genannt , es ist die Dateierstellungsmaske .
  • Es heißt nicht Bitmaske oder Maske.

Die Maske wirkt sich auf einige Unterprozesse im aktuellen Prozessbaum aus, einschließlich anderer Shells, in denen sie geändert werden kann (daher hat Shell Y nicht unbedingt die Maske von Shell X).

Die umask wirkt sich auf den Prozess aus, in dem sie definiert wurde, und auf die Childs, die von ihr gestartet werden.

  • jedes kind kann seine eigene umask ändern .

Dateiberechtigungen, die auch als Dateimodus bezeichnet werden, sind ein Satz von zwölf Binärbits, die die Zugriffsrechte des Benutzers, der Gruppe und anderer Benutzer der Datei für diese Datei kodieren (ugo → ein Strom von etwa bbbbbbbbbbbb).

Der Dateimodus ist eine Zahl (12 Binärziffern oder 4 Oktalziffern oder 3 Hexadezimalziffern).

$ bc <<<'ibase=8; mask=1644; obase=2; mask; obase=8; mask; obase=16; mask'
1110100100
1644
4A8

Dateiberechtigungen werden jedoch in der Regel stattdessen als vier- bis dreistelliger Oktalwert dargestellt (z. B. - 0644 oder 644).

Mode ist eine dreistellige oder vierstellige Zahl .
Wie 123und 0123ist die gleiche Dezimalzahl.

Die mathematische Logik beinhaltet die Operation der Konjunktion AKA "anding" (∧), die stattfindet, wenn "Das und einer Menge von Operanden ist wahr, wenn und nur wenn alle ihre Operanden wahr sind". Basierend auf dieser Logik gibt es eine bitweise Operation mit identischem Namen.

Okay.

Anding unterscheidet sich von der Addition von Zahlen (x + y → z) oder der Verkettung von Zeichenfolgen (x neben y → xy).

Okay.

Einstellen von Modi ohne oder mit umask (anhand der Maske)

Der Modus wird immer mit der umask eingestellt.

Einige Dienstprogramme wie mkdir erstellen eine Datei im Standalone-Modus, ohne umask zu verwenden (daher ist der Modus dieser Dateien nicht maskiert).

Nein, umask ist immer aktiv.

Einige andere Dienstprogramme erstellen Dateien mit einigen "maskierten" Berechtigungen (dh die Berechtigungen werden durch die Maske verursacht). Zum Beispiel Dienstprogramme, die Dateien mit der Funktion fopen () erstellen, bei denen zuerst die Maske erkannt und dann die Datei mit den darauf basierenden Berechtigungen erstellt wird.

Der Modus ist das Ergebnis von:

mode=$(printf "%04o\n" "$(( (8#$default) & (~(8#$umask)) ))")

Das Maskieren eines Modus erfolgt durch bitweises Anding und führt zu folgenden Ergebnissen:

Mode ist das Ergebnis von anding der Standardeinstellung mit der negierten umask.

             OCTAL  BINARY        HUMAN-READABLE
umask        0222   000010010010  --w--w--w-
not-umask    7555   111101101101  N/A
default     0666   000110110110  -rw-rw-rw-
result       0444   000100100100  -r--r--r-- 

Ist mein Verständnis genau genug und wie kommt es, dass 0666 ∧ 0555 → 0444?

Es gibt mehrere Punkte, die verbessert werden müssen, und nur das Anding (ohne Negation) ist:

0666  0 011 011 011
0555  0 101 101 101

Wenn Sie diese Binärziffern vertikal abgleichen, befolgen Sie diese Regeln: - Wenn sie gleich sind, schreiben Sie eine weitere gleiche Ziffer darunter. - Wenn sie unterschiedlich sind, schreiben Sie eine Null darunter.

0666  0 110 110 110
0555  0 101 101 101
       0 100 100 100
       0  4   4   4
0444  0 100 100 100
Isaac
quelle
0

Dies umaskist die “Dateimodus-Erstellungsmaske”: umask≡ “Dateimodus-Erstellungsmaske” Dies ist ein Prozesswert. Jeder Prozess hat seinen eigenen Wert, erbt jedoch von seinem übergeordneten Prozess. Der umaskWert wird im Kernel gespeichert und überlebt über forkund einige Formen von exec.

umaskist eine Art Bitmaske: set of umasks ⊂ set of bitmasks

Es gibt viele Arten von Bitmasken.

  • Maske: etwas, das etwas anderes abdeckt, so dass nur Teile sichtbar sind. ZB kann beim Malen eine geformte Maske verwendet werden, damit eine Person ein in die Maske geschnittenes Muster sprühen kann.
  • Bitmaske: Ein Satz von Bits, mit denen ein anderer Satz von Bits maskiert wird. Eine Bitmaske löscht oder setzt die abgedeckten Bits. Dazu können Sie bitweise andoder verwenden or.

Anders gesagt.

Die Erstellungsmaske für den Dateimodus ist mit einer umask identisch, jedoch nicht mit einer Maske. Ebenso wie eine schwarze Katze nicht mit einer Katze identisch ist. Sie sind beide Katzen, aber nicht beide schwarze Katzen. Es gibt viele Katzen in vielen Farben. Es gibt viele Bitmasken, die für viele Dinge verwendet werden.

Logische Maskierung

0666  0555 = 
110110110 ^ 010010010 =
0444

^ bedeutet "und", es funktioniert mit Bits. Also muss man zuerst das Oktal in Binär konvertieren. Dann müssen Sie die Operation nacheinander auf jedes Bit anwenden.

0 ^ 0 = 0
0 ^ 1 = 0
1 ^ 0 = 0
1 ^ 1 = 0

Auf Anfrage von OP kopiert, von doppelter Frage (OP zum Entfernen doppelter Fragen).

Strg-Alt-Delor
quelle