Neden bazı umask değerleri etkili olmaz?


9

İzinleri daha iyi anlamaya çalışıyorum, bu yüzden bazı "alıştırmalar" yapıyorum. İşte kendi çıktı ile kullandığım bir komut sırası:

$ 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

Yani, biz varsayılan dosya izinleri olduğunu biliyorum çünkü mantıklı 666( rw-rw-rw-) ve dizinleri varsayılan izinler şunlardır 777( rwxrwxrwx). Ben var bu varsayılan izinleri umask'ı değerini çıkarmak durumunda 666-022=644, rw-r--r--için file1, önceki çıkışı ile 's Tutarlı yüzden; 777-022=755,, rwx-r-x-r-xiçin dir1de tutarlı.

Ben den izin maskesini değiştirmek Ama eğer 022için 021kendisine daha fazla değildir.

İşte dosya örneği:

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

-rw-r--rw-olduğunu 646ama olmalı 666-021=645. Yani önceki hesaplamaya göre çalışmaz.

Dizine örnek:

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

drwxr-xrw-olduğunu 756, 777-021=756. Bu durumda sonuç, önceki hesaplama ile tutarlıdır.

Adamı okudum ama bu davranış hakkında hiçbir şey bulamadım.

Birisi nedenini açıklayabilir mi?

AÇIKLAMA

Yanıtlarda belirtildiği gibi: umaskdeğeri, varsayılan dizinden ve dosyanın izinlerinden matematiksel olarak çıkarılmaz .

Etkin bir şekilde dahil edilen işlem, AND (&) ve NOT (!) Boole operatörlerinin bir kombinasyonudur. Verilen:

R = sonuçta elde edilen izinler
D = varsayılan izinler
U = geçerli umask

R = D &! U

Örneğin:

666 &! 0053 = 110110110 & 
            ! 000101011 
             110110110 ve  
             111 010 100
           = 1101010 100 = 624 = rw - wr--
 
777 &! 0022 = 111111 111 & 
            ! 000 010 010
             1111111111 ve  
             11110110110
           = 111101101 = 755 = rwxr - xr-x 

İPUCU

Ortaya çıkan izinleri hızlı bir şekilde bilmenin kolay bir yolu (en azından bana yardımcı oldu) sadece 3 ondalık değer kullanabileceğimizi düşünmektir:

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

İzinler bu 3 değerin birleşimi olacaktır.
" "göreli izin verilmediğini belirtmek için kullanılır.

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

Bu yüzden şu anki umask'ım gruptan yazma ve yürütme iznini 0053kaldırdığımı ve diğer sonuçlardan (4+1)(2+1)

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

(grup ve diğerlerinin zaten yürütme izni yoktu)

Yanıtlar:


26

umaskbir maske , çıkarılan bir değer değil. Böylece:

  • mod 666, maske 022: sonuç 666 & 022, yani 646 olan 666 ve 755;
  • mod 666, maske 021: sonuç 666 ve ~ 021, yani 646 olan 666 ve 756'dır.

İlgili parçaları düşünün. Bir modda 6, bit 1 ve 2'nin ayarlandığı, okunduğu ve yazıldığı anlamına gelir. Bir maskede 2 bit 1, yazma biti maskeler. Bir maskede 1 bit 0, yürütme biti maskeler.

Bunu temsil etmenin bir başka yolu da izinleri metin biçiminde incelemektir. 666 rw-rw-rw-; 022 ----w--w-; 021'dir ----w---x. Maske, yani modundan ayarlanan bit damla rw-rw-rw-maskelenir ----w--w-hale rw-r--r--maskelenmiş ----w---xolur rw-r--rw-.


11

Ondalık değil, ikili düşünmeniz gerekir. Özellikle, üç adet 3 bitlik ikili sayı vardır: her biri bir Sahip, Grup ve Diğer için. Her biri 000 ila 111 (ondalık olarak 0-7) arasında değişen değerlere sahiptir.

örneğin rw-rw-rw (666) 110110110'dur.

umaskDeğeri yeni bir dosya ya da dizin oluştururken bit ya da (1 ya da 0) kapalı olacaktır bir maske belirtmektir. 022 ondalık 000 010 010 ikili iken, 021 ondalık 000 010 001'dir.

İzin değerlerine, nihai değere ulaşması için reddedilen umask ile birlikte AND-düzenlenir. "reddedildi", tüm bitlerin ters çevrildiği, yani 1'lerin 0'a çevrildiği ve tersi anlamına gelir. ÖrneğinNOT 022 (000 010 010) = 755 (111 101 101)

Örnek: 666 & !022 = 644. İkili olarak, bu:

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

Ayrıca 777 & !022 = 755:

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

O 1 ise her bit nihai değeri yalnızca 1 nasıl olabilir Not hem orijinal izni değere (666 veya 777) VE reddedildiği umask içinde. Bunlardan biri 0 ise, sonuç 0 olur. Yani, 1 & 1 = 1 , 1 & 0 = 0 .


Açıkçası, setuid, setgid ve yapışkan bitler için dördüncü bir 3 bit ikili sayı var. Bu nedenle, genellikle 0 önde gelen (veya 0-7 arasında başka bir lider sayı) ile belirtilen izinleri ve maskeleri görürsünüz. örneğin, 0777 veya 2755.


2
Teknik olarak ondalık değil sekizli, ama bu cevabın çekirdeğini gerçekten değiştirmiyor.
David Z

@DavidZ: OP, ondalık olduğunu düşündü (Q'daki çıkarma örneğine bakın), bu da cas'un bahsettiği şeydir.
Yörüngede Hafiflik Yarışları

1
@ OP tarafından verilen çıkarma örnekleri sekizlik veya ondalık olsun, hiçbir basamağın 8'e ulaşmadığı ve hiçbir zaman taşıma gerektirmediği göz önüne alındığında çalışır. OP'nin ondalık olarak düşünmesinin mümkün olduğuna katılıyorum, ancak sorudaki hiçbir şey bunu kanıtlamıyor.
Stephen Kitt

@StephenKitt: Ben 😂 bunu kanıtlamak için calc.exe içine örnekler yazarken benim parmak gibi görünüyor tuş takımında kaymış olmalı
Orbit Açıklık Yarışları

1
@cas evet, bu bölüme katılmıyordum (cevabımın da temeli budur), sadece Hafifliğin OP'nin sekizlik yerine ondalık olarak hesapladığı iddiasıyla.
Stephen Kitt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.