Mengapa beberapa nilai umask tidak berlaku?

9

Saya mencoba memahami izin dengan lebih baik, jadi saya melakukan beberapa "latihan". Berikut urutan perintah yang saya gunakan dengan output masing-masing:

$ 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

Itu masuk akal karena kita tahu bahwa hak akses file default adalah 666( rw-rw-rw-) dan direktori hak akses default adalah 777( rwxrwxrwx). Jika saya kurangi nilai umask dari hak akses default ini saya memiliki 666-022=644, rw-r--r--, untuk file1, sehingga koheren itu dengan keluaran sebelumnya; 777-022=755,, rwx-r-x-r-xuntuk dir1, juga koheren.

Tapi jika saya mengubah umask dari 022ke 021tidak lagi.

Ini adalah contoh untuk file tersebut:

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

-rw-r--rw-hanyalah 646tetapi seharusnya 666-021=645. Jadi itu tidak bekerja sesuai dengan perhitungan sebelumnya.

Berikut adalah contoh untuk direktori:

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

drwxr-xrw-adalah 756, 777-021=756. Jadi dalam hal ini hasilnya koheren dengan perhitungan sebelumnya.

Saya sudah membaca pria itu tetapi saya belum menemukan apa pun tentang perilaku ini.

Adakah yang bisa menjelaskan mengapa?

PENJELASAN

Seperti yang ditunjukkan dalam jawaban: umasknilai tidak dikurangi secara matematis dari direktori default dan izin file.

Operasi yang terlibat secara efektif adalah kombinasi dari operator boolean AND (&) dan NOT (!). Diberikan:

R = izin yang dihasilkan
D = izin default
U = umask saat ini

R = D &! U

Sebagai contoh:

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 

TIP

Cara mudah untuk dengan cepat mengetahui izin yang dihasilkan (setidaknya itu membantu saya) adalah dengan berpikir bahwa kita dapat menggunakan hanya 3 nilai desimal:

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

Izin akan menjadi kombinasi dari 3 nilai ini.
" "digunakan untuk menunjukkan bahwa izin relatif tidak diberikan.

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

Jadi jika umask saya saat ini adalah 0053saya tahu saya menghapus (4+1) izin baca dan eksekusi dari grup dan menulis serta eksekusi (2+1)dari yang lain menghasilkan

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

(grup dan lainnya sudah tidak memiliki izin eksekusi)

ikeDiM
sumber

Jawaban:

26

umaskadalah topeng , itu bukan nilai yang dikurangi. Jadi:

  • mode 666, mask 022: hasilnya adalah 666 & ~ 022, yaitu 666 & 755, yaitu 644;
  • mode 666, mask 021: hasilnya adalah 666 & ~ 021, yaitu 666 & 756, yaitu 646.

Pikirkan bagian-bagian yang terlibat. 6 dalam mode berarti bit 1 dan 2 diatur, dibaca dan ditulis. 2 dalam topeng topeng bit 1, bit tulis. 1 dalam topeng topeng bit 0, bit eksekusi.

Cara lain untuk mewakili ini adalah dengan melihat izin dalam bentuk teks. 666 adalah rw-rw-rw-; 022 adalah ----w--w-; 021 adalah ----w---x. Topeng menjatuhkan bit set dari mode, jadi rw-rw-rw-disamarkan oleh ----w--w-menjadi rw-r--r--, disamarkan oleh ----w---xmenjadi rw-r--rw-.

Stephen Kitt
sumber
11

Anda perlu berpikir dalam biner, bukan desimal. Secara khusus, ada tiga angka biner 3-bit: masing-masing satu untuk Pemilik, Grup, dan Lainnya. Masing-masing dengan nilai mulai dari 000 hingga 111 (0-7 dalam desimal).

mis. rw-rw-rw (666) adalah 110 110 110.

The umasknilai adalah menspesifikasikan masker yang bit akan on atau off (1 atau 0) saat membuat file baru atau direktori. mis. 022 desimal adalah 000 010 010 biner, sedangkan 021 desimal adalah 000 010 001

Bit izin AND-ed bersama-sama dengan umask yang dinegasikan untuk sampai pada nilai akhir. "dinegasikan" berarti bahwa semua bit terbalik, yaitu semua 1 membalik ke 0, dan sebaliknya. misalnyaNOT 022 (000 010 010) = 755 (111 101 101)

Contoh: 666 & !022 = 644. Dalam biner, itu:

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

Juga 777 & !022 = 755:

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

Perhatikan bagaimana nilai akhir dari setiap bit hanya bisa 1 jika itu adalah 1 di kedua nilai izin asli (666 atau 777) DAN di umask yang dinegasikan. Jika salah satu dari mereka adalah 0, hasilnya adalah 0. Yaitu, 1 & 1 = 1 , sedangkan 1 & 0 = 0 .


Sebenarnya ada angka biner 3-bit keempat untuk bit setuid, setgid, dan sticky. Itu sebabnya Anda sering melihat izin dan topeng yang ditentukan dengan 0 di depan (atau nomor terkemuka lainnya dari 0-7). misal 0777 atau 2755.

cas
sumber
2
Yah secara teknis itu oktal, bukan desimal, tetapi itu tidak benar-benar mengubah inti dari jawabannya.
David Z
@ DavidZ: OP pikir itu desimal (lihat contoh pengurangan dalam Q), yang mungkin cas apa yang dimaksud.
Lightness Races dalam Orbit
1
@Lightness contoh pengurangan yang diberikan oleh OP bekerja apakah itu oktal atau desimal, mengingat bahwa tidak ada angka mencapai 8 dan tidak pernah ada kebutuhan untuk membawa. Saya setuju bahwa OP mungkin berpikir dalam desimal, tetapi tidak ada dalam pertanyaan yang membuktikan hal itu.
Stephen Kitt
@StephenKitt: Sepertinya jari saya pasti tergelincir pada keypad ketika saya sedang menulis contoh ke calc.exe untuk membuktikannya 😂
Lightness Races in Orbit
1
@cas ya, saya tidak setuju dengan bagian itu (itu adalah dasar untuk jawaban saya juga), hanya dengan pernyataan Lightness 'bahwa OP menghitung dalam desimal daripada oktal.
Stephen Kitt