เหตุใดค่า umask บางอย่างจึงไม่มีผล


9

ฉันพยายามที่จะเข้าใจการอนุญาตที่ดีขึ้นดังนั้นฉันจึงทำ "แบบฝึกหัด" นี่คือลำดับของคำสั่งที่ฉันใช้กับเอาต์พุตที่เกี่ยวข้อง:

$ 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

นั่นสมเหตุสมผลเพราะเรารู้ว่าการอนุญาตไฟล์เริ่มต้นคือ666( rw-rw-rw-) และสิทธิ์เริ่มต้นไดเรกทอรีคือ777( rwxrwxrwx) ถ้าฉันลบค่า umask จากสิทธิ์เริ่มต้นเหล่านี้ฉันมี 666-022=644, rw-r--r--สำหรับfile1ดังนั้นมันเชื่อมโยงกันกับการส่งออกก่อนหน้า; 777-022=755, rwx-r-x-r-xสำหรับdir1, ยังสอดคล้องกัน

แต่ถ้าผมเปลี่ยน umask จาก022ไป021มันไม่ได้เป็นอะไรมากไป

นี่คือตัวอย่างสำหรับไฟล์:

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

-rw-r--rw-เป็นแต่มันควรจะเป็น646 666-021=645ดังนั้นจึงไม่ทำงานตามการคำนวณก่อนหน้า

นี่คือตัวอย่างสำหรับไดเรกทอรี:

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

drwxr-xrw-คือ756, 777-021=756. ดังนั้นในกรณีนี้ผลลัพธ์จะสอดคล้องกับการคำนวณก่อนหน้า

ฉันอ่านผู้ชาย แต่ฉันไม่พบอะไรเกี่ยวกับพฤติกรรมนี้

มีใครอธิบายได้ไหม

คำอธิบาย

ตามที่ระบุไว้ในคำตอบ: umaskค่าของมันไม่ได้ถูกลบออกทางคณิตศาสตร์จากไดเรกทอรีเริ่มต้นและการอนุญาตของไฟล์

การดำเนินการที่เกี่ยวข้องอย่างมีประสิทธิภาพเป็นการรวมกันของตัวดำเนินการบูลีน AND (&) และ NOT (!) ได้รับ:

R = การอนุญาตที่ได้รับ
D = การอนุญาตเริ่มต้น
U = umask ปัจจุบัน

R = D &! U

ตัวอย่างเช่น:

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 

เคล็ดลับ

วิธีง่ายๆในการรู้สิทธิ์ที่ได้อย่างรวดเร็ว (อย่างน้อยก็ช่วยฉันด้วย) คือคิดว่าเราสามารถใช้ค่าทศนิยม 3 ค่า:

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

การอนุญาตจะเป็นการรวมกันของ 3 ค่าเหล่านี้
" "ใช้เพื่อระบุว่าไม่อนุญาตการให้สิทธิ์แบบสัมพัทธ์

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

ดังนั้นหาก umask ปัจจุบันของฉันคือ0053ฉันรู้ว่าฉันลบ(4+1) สิทธิ์การอ่านและการดำเนินการจากกลุ่มและการเขียนและการดำเนินการ(2+1)จากผลอื่น ๆ

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

(กลุ่มและอื่น ๆ ไม่ได้รับอนุญาตให้ดำเนินการ)

คำตอบ:


26

umaskเป็นมาสก์ไม่ใช่ค่าที่หักออก ดังนั้น:

  • โหมด 666, มาสก์ 022: ผลลัพธ์คือ 666 & ~ 022, เช่น 666 & 755, ซึ่งคือ 644;
  • โหมด 666, มาส์ก 021: ผลลัพธ์คือ 666 & ~ 021, เช่น 666 & 756, ซึ่งคือ 646

คิดว่าบิตที่เกี่ยวข้อง 6 ในโหมดหมายถึงบิต 1 และ 2 ถูกตั้งค่าอ่านและเขียน 2 ในมาสก์มาสก์ 1 บิต, บิตการเขียน 1 ในมาสก์มาสก์บิต 0, บิตดำเนินการ

อีกวิธีในการแทนค่านี้คือดูสิทธิ์ในรูปแบบข้อความ 666 คือrw-rw-rw-; 022 คือ----w--w-; ----w---x021 หน้ากากลดลงชุดบิตจากโหมดเพื่อrw-rw-rw-หลอกลวงโดย----w--w-กลายเป็นrw-r--r--หน้ากากโดยจะกลายเป็น----w---xrw-r--rw-


11

คุณต้องคิดเป็นเลขฐานสองไม่ใช่ทศนิยม โดยเฉพาะมีเลขฐานสอง 3 บิตสามหมายเลข: แต่ละหมายเลขสำหรับเจ้าของกลุ่มและอื่น ๆ แต่ละค่ามีค่าตั้งแต่ 000 ถึง 111 (0-7 เป็นทศนิยม)

เช่น rw-rw-rw (666) คือ 110 110 110

umaskค่าเป็นระบุหน้ากากซึ่งบิตจะอยู่ในหรือนอก (1 หรือ 0) เมื่อมีการสร้างไฟล์ใหม่หรือไดเรกทอรี เช่น 022 ทศนิยมคือ 000 010 010 ไบนารีในขณะที่ 021 ทศนิยมคือ 000 010 001

บิตการอนุญาตคือ AND-ed พร้อมกับ umask เมื่อตะกี้เพื่อมาถึงค่าสุดท้าย "negated" หมายความว่าบิตทั้งหมดกลับด้านคือ 1s ทั้งหมดพลิกเป็น 0 และกลับกัน เช่นNOT 022 (000 010 010) = 755 (111 101 101)

ตัวอย่าง: 666 & !022 = 644. ในไบนารีนั่นคือ:

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

นอกจากนี้777 & !022 = 755:

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

โปรดสังเกตว่าค่าสุดท้ายของแต่ละบิตจะมีค่าได้เพียง 1 ถ้าเป็น 1 ทั้งในค่าการอนุญาตดั้งเดิม (666 หรือ 777) และใน umask เมื่อตะกี้ หากทั้งของพวกเขาคือ 0 ผลที่ได้คือ 0. นั่นคือ1 และ 1 = 1ในขณะที่ 1 และ 0 = 0


พูดอย่างเคร่งครัดมีเลขฐานสอง 3 บิตที่สี่สำหรับบิต setuid, setgid และเหนียว นั่นเป็นเหตุผลที่คุณมักจะเห็นการอนุญาตและมาสก์ที่ระบุด้วย 0 นำหน้า (หรือหมายเลขนำหน้าอื่น ๆ จาก 0-7) เช่น 0777 หรือ 2755


2
ในทางเทคนิคแล้วมันคือฐานแปดไม่ใช่ทศนิยม แต่นั่นไม่ได้เปลี่ยนแกนของคำตอบ
David Z

@DavidZ: OP คิดว่ามันเป็นทศนิยม (ดูตัวอย่างการลบใน Q) ซึ่งน่าจะเป็นสิ่งที่ cas อ้างอิงถึง
การแข่งขัน Lightness ใน Orbit

1
@Lightness ตัวอย่างการลบที่กำหนดโดยงาน OP ไม่ว่าจะเป็นเลขฐานแปดหรือทศนิยมเนื่องจากไม่มีตัวเลขถึง 8 และไม่จำเป็นต้องพกติดตัว ฉันยอมรับว่าเป็นไปได้ที่ OP กำลังคิดในรูปทศนิยม แต่ไม่มีอะไรในคำถามที่พิสูจน์ได้ว่า
Stephen Kitt

@StephenKitt: ดูเหมือนว่านิ้วของฉันจะต้องมีการลื่นบนปุ่มกดเมื่อฉันเขียนตัวอย่างเป็น calc.exe เพื่อพิสูจน์ it
Lightness Races ใน Orbit

1
@ ใช่ใช่ฉันไม่เห็นด้วยกับส่วนนั้น (มันเป็นพื้นฐานสำหรับคำตอบของฉันเช่นกัน) เพียงแค่ยืนยัน Lightness ว่า OP ได้คำนวณเป็นทศนิยมแทนที่จะเป็นฐานแปด
สตีเฟ่น Kitt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.