Warum werden einige umask-Werte nicht wirksam?

9

Ich versuche, Berechtigungen besser zu verstehen, also mache ich einige "Übungen". Hier ist eine Folge von Befehlen, die ich mit ihrer jeweiligen Ausgabe verwende:

$ umask
0022
$ touch file1
$ ls -l file1
-rw-r--r-- 1 user group 0 Mar 16 12:55 file1
$ mkdir dir1
$ ls -ld dir1
drwxr-xr-x 2 user group 4096 Mar 16 12:55 dir1

Dies ist sinnvoll, da wir wissen, dass die Standardberechtigungen für Dateien 666( rw-rw-rw-) und die Standardberechtigungen für Verzeichnisse 777( rwxrwxrwx) sind. Wenn ich den umask - Wert von diesen Standardberechtigungen subtrahiere ich habe 666-022=644, rw-r--r--für die file1, so dass es im Einklang mit der vorherige Ausgabe; 777-022=755, rwx-r-x-r-x, Für die dir1auch kohärent.

Aber wenn ich die Umask von 022auf ändere , ist 021es nicht mehr.

Hier ist das Beispiel für die Datei:

$ umask 0021
$ touch file2
$ ls -l file2
-rw-r--rw- user group 0 Mar 16 13:33 file2

-rw-r--rw-ist 646aber es sollte sein 666-021=645. Es funktioniert also nicht gemäß der vorherigen Berechnung.

Hier ist das Beispiel für das Verzeichnis:

$ touch dir2
$ ls -ld dir2
drwxr-xrw- 2 user group 4096 Mar 16 13:35 dir2

drwxr-xrw-ist 756, 777-021=756. In diesem Fall stimmt das Ergebnis mit der vorherigen Berechnung überein.

Ich habe den Mann gelesen, aber nichts über dieses Verhalten gefunden.

Kann jemand erklären warum?

ERLÄUTERUNG

Wie in den Antworten ausgeführt umask, wird der Wert von 'nicht mathematisch von den Berechtigungen des Standardverzeichnisses und der Datei abgezogen .

Die effektiv beteiligte Operation ist eine Kombination aus UND (&) und NICHT (!) Booleschen Operatoren. Gegeben:

R = resultierende Berechtigungen
D = Standardberechtigungen
U = aktuelle Umask

R = D &! U.

Zum Beispiel:

666 &! 0053 = 110 110 110 & 
            ! 000 101 011 
             110 110 110 &  
             111 010 100
           = 110 010 100 = 624 = rw - wr--
 
777 &! 0022 = 111 111 111 & 
            ! 000 010 010
             111 111 111 &  
             111 101 101
           = 111 101 101 = 755 = rwxr - xr-x 

TRINKGELD

Eine einfache Möglichkeit, die resultierenden Berechtigungen schnell zu ermitteln (zumindest hat es mir geholfen), besteht darin, zu glauben, dass wir nur 3 Dezimalwerte verwenden können:

r = 100 = 4 
w = 010 = 2
x = 001 = 1

Berechtigungen sind eine Kombination dieser 3 Werte.
" "wird verwendet, um anzuzeigen, dass die relative Berechtigung nicht erteilt wurde.

666 = 4+2+" "   4+2+" "   4+2+" "  = rw rw rw  

Wenn meine aktuelle Umask lautet, 0053weiß ich, dass ich Lese- und Ausführungsberechtigungen (4+1) aus der Gruppe entferne und Schreib- und Ausführungsberechtigungen (2+1)aus anderen Gruppen erhalte

 4+2     " "+2+" "     4+" "+" "   = 624 = rw--w-r--  

(Gruppe und andere hatten bereits keine Ausführungserlaubnis)

ikeDiM
quelle

Antworten:

26

umaskist eine Maske , es ist kein subtrahierter Wert. Somit:

  • Modus 666, Maske 022: das Ergebnis ist 666 & ~ 022, dh 666 & 755, was 644 ist;
  • Modus 666, Maske 021: Das Ergebnis ist 666 & ~ 021, dh 666 & 756, was 646 ist.

Denken Sie an die beteiligten Teile. 6 in einem Modus bedeutet, dass die Bits 1 und 2 gesetzt, gelesen und geschrieben werden. 2 in einer Maske maskiert Bit 1, das Schreibbit. 1 in einer Maske maskiert Bit 0, das Ausführungsbit.

Eine andere Möglichkeit, dies darzustellen, besteht darin, die Berechtigungen in Textform anzuzeigen. 666 ist rw-rw-rw-; 022 ist ----w--w-; 021 ist ----w---x. Die Maske löscht ihre gesetzten Bits aus dem Modus, so dass rw-rw-rw-maskiert durch ----w--w-wird rw-r--r--, maskiert durch ----w---xwird rw-r--rw-.

Stephen Kitt
quelle
11

Sie müssen binär denken, nicht dezimal. Insbesondere gibt es drei 3-Bit-Binärzahlen: jeweils eine für Eigentümer, Gruppe und Andere. Jeweils mit Werten zwischen 000 und 111 (0-7 in Dezimalzahl).

zB rw-rw-rw (666) ist 110 110 110.

Der umaskWert ist eine Maske, die angibt, welche Bits beim Erstellen einer neuen Datei oder eines neuen Verzeichnisses aktiviert oder deaktiviert werden (1 oder 0). Beispiel: 022 Dezimalzahl ist 000 010 010 Binär, während 021 Dezimalstelle 000 010 001 ist

Die Berechtigungsbits werden zusammen mit der negierten Umask UND-verknüpft, um den endgültigen Wert zu erhalten. "negiert" bedeutet, dass alle Bits invertiert sind, dh alle Einsen auf 0 gestellt sind und umgekehrt. z.BNOT 022 (000 010 010) = 755 (111 101 101)

Beispiel : 666 & !022 = 644. In binärer Form ist das:

  Owner  Group  Other     mode
   110    110    110      666 
&  111    101    101      755   (this is the negated 022)
   ---    ---    ---      ---
   110    100    100      644

Auch 777 & !022 = 755:

  Owner  Group  Other     mode
   111    111    111      777 
&  111    101    101      755
   ---    ---    ---      ---
   111    101    101      755

Beachten Sie, wie der endgültige Wert jedes Bits nur 1 sein kann , wenn es 1 ist sowohl der ursprüngliche Genehmigung Wert (666 oder 777) und in dem negierten Wert zu verändern. Wenn einer von ihnen 0 ist, ist das Ergebnis 0. Das heißt, 1 & 1 = 1 , während 1 & 0 = 0 ist .


Genau genommen gibt es eine vierte 3-Bit-Binärzahl für die Bits setuid, setgid und sticky. Aus diesem Grund werden häufig Berechtigungen und Masken angezeigt, die mit einer führenden 0 (oder einer anderen führenden Zahl von 0 bis 7) angegeben sind. zB 0777 oder 2755.

cas
quelle
2
Technisch gesehen ist es oktal, nicht dezimal, aber das ändert den Kern der Antwort nicht wirklich.
David Z
@DavidZ: OP dachte, es sei dezimal (siehe das Subtraktionsbeispiel im Q), worauf sich cas vermutlich bezog.
Leichtigkeitsrennen im Orbit
1
@Lightness Die vom OP angegebenen Subtraktionsbeispiele funktionieren unabhängig davon, ob sie oktal oder dezimal sind, da keine Ziffer 8 erreicht und kein Übertrag erforderlich ist. Ich bin damit einverstanden, dass das OP möglicherweise dezimal gedacht hat, aber nichts in der Frage beweist dies.
Stephen Kitt
@ StephenKitt: Sieht so aus, als wäre mein Finger auf die Tastatur gerutscht, als ich Beispiele in calc.exe schrieb, um dies zu beweisen. Light
Lightness Races in Orbit
1
@cas Ja, ich war mit diesem Teil nicht einverstanden (es ist auch die Grundlage für meine Antwort), nur mit der Behauptung von Lightness, dass das OP eher dezimal als oktal berechnet wurde.
Stephen Kitt