“ umask” คืออะไรและทำงานอย่างไร


190

ฉันเชื่อว่า umask เป็นสิ่งที่ควบคุมการอนุญาตไฟล์แต่ไม่เข้าใจอย่างเต็มที่

หลังจากทำงานumask 0644ในสถานีnanoฉันไม่สามารถอ่านไฟล์ที่ผมสร้างขึ้นด้วยโปรแกรมแก้ไขข้อความบรรทัดคำสั่ง ผมสังเกตเห็นว่าสิทธิ์ของไฟล์ที่มีการกำหนดให้แทนการเริ่มต้น00220755

umask ทำงานอย่างไร ฉันคิดว่าฉันก็สามารถเอาหลักในแต่ละ umask จาก0777, 7 - 6 = 1และ7 - 4 = 3ดังนั้นผมคาดว่าสิทธิ์ที่จะเป็น0133แต่เห็นได้ชัดว่านี้ไม่ได้เป็นกรณีที่

  1. umask คืออะไรกันแน่? อธิบายให้ฉันเหมือนฉันเป็น "Linux noob"
  2. ฉันจะคำนวณด้วย umask ได้อย่างไร
  3. กรณีการใช้งานสำหรับ umask คืออะไร?

app_mode 666 rw- rw- rw- umask 644 --0 -00 -00 file_mode 022 --- -w- -w-
grabantot

คำตอบ:


143

umask ทำหน้าที่เป็นชุดของสิทธิ์ที่แอปพลิเคชันไม่สามารถตั้งค่าในไฟล์ มันเป็นมาสก์การสร้างโหมดไฟล์สำหรับกระบวนการและไม่สามารถตั้งค่าสำหรับไดเรกทอรีได้ แอปพลิเคชันส่วนใหญ่จะไม่สร้างไฟล์ที่มีการอนุญาตให้ใช้สิทธิดังนั้นพวกเขาจะมีค่าเริ่มต้น666ซึ่งจะถูกแก้ไขโดย umask

ในขณะที่คุณได้ตั้ง umask เพื่อลบบิตอ่าน / เขียนสำหรับเจ้าของและบิตอ่านสำหรับคนอื่น ๆ เริ่มต้นเช่นในการใช้งานจะส่งผลให้สิทธิ์ของแฟ้มที่ถูก777 133นี่หมายความว่าคุณ (และคนอื่น ๆ ) สามารถเรียกใช้ไฟล์ได้และคนอื่น ๆ ก็สามารถเขียนลงไปได้

หากคุณต้องการให้ไฟล์ไม่สามารถอ่าน / เขียน / ดำเนินการโดยใครก็ได้ยกเว้นเจ้าของคุณควรใช้ umask 077เพื่อปิดสิทธิ์เหล่านั้นสำหรับกลุ่ม & อื่น ๆ

ในทางตรงกันข้าม umask ของ000จะทำให้ไดเรกทอรีที่สร้างขึ้นใหม่สามารถอ่านได้เขียนได้และสืบทอดมาสำหรับทุกคน (สิทธิ์จะเป็น777) umask นั้นไม่ปลอดภัยอย่างมากและคุณไม่ควรตั้ง umask ให้000เป็น

ค่าเริ่มต้น umask บน Ubuntu นั้น022หมายความว่าทุกคนสามารถอ่านไฟล์ที่สร้างขึ้นใหม่ แต่เจ้าของเท่านั้นที่เขียนได้:

user@computer:~$ touch new-file-name
user@computer:~$ ls -dl new-file-name
-rw-r--r-- 1 user user 0 Apr  1 19:15 new-file-name

การเริ่มต้นใน Ubuntu Oneiric (11.10) ค่าเริ่มต้นของ umask นั้นผ่อนคลาย002ซึ่งขยายการเข้าถึงการเขียนไปยังกลุ่มเจ้าของ:

user@computer:~$ touch new-file-name
user@computer:~$ ls -dl new-file-name
-rw-rw-r-- 1 user user 0 Apr  1 19:15 new-file-name

การดูและแก้ไข umask

หากต้องการดูการตั้งค่า umask ปัจจุบันของคุณให้เปิดเทอร์มินัลแล้วรันคำสั่ง:

umask

หากต้องการเปลี่ยนการตั้งค่า umask ของเชลล์ปัจจุบันเป็นอย่างอื่นให้พูด 077, รัน:

umask 077

หากต้องการทดสอบว่าการตั้งค่านี้ใช้งานได้หรือไม่คุณสามารถสร้างไฟล์ใหม่ (การอนุญาตไฟล์ของไฟล์ที่มีอยู่จะไม่ได้รับผลกระทบ) และแสดงข้อมูลเกี่ยวกับไฟล์ที่รัน:

user@computer:~$ touch new-file-name
user@computer:~$ ls -dl new-file-name
-rw------- 1 user user 0 Apr  1 19:14 new-file-name

การตั้งค่า umask สืบทอดโดยกระบวนการที่เริ่มต้นจากเชลล์เดียวกัน ตัวอย่างเช่นเริ่มตัวแก้ไขข้อความ GEdit โดยดำเนินการgeditในเทอร์มินัลและบันทึกไฟล์โดยใช้ gedit คุณจะสังเกตเห็นว่าไฟล์ที่สร้างขึ้นใหม่นั้นได้รับผลกระทบจากการตั้งค่า umask เช่นเดียวกับในเทอร์มินัล

ใช้กรณี: ระบบผู้ใช้หลายคน

หากคุณอยู่ในระบบที่ใช้งานร่วมกันโดยผู้ใช้หลายคนต้องการให้ผู้อื่นไม่สามารถอ่านไฟล์ในโฮมไดเร็กตอรี่ของคุณได้ สำหรับสิ่งนั้น umask มีประโยชน์มาก แก้ไข~/.profileและเพิ่มบรรทัดใหม่ด้วย:

umask 007

คุณต้องลงชื่อเข้าใช้อีกครั้งเพื่อให้การเปลี่ยนแปลง umask นี้~/.profileมีผล ถัดไปคุณต้องเปลี่ยนการอนุญาตไฟล์ที่มีอยู่ของไฟล์ในโฮมไดเร็กตอรี่ของคุณโดยการลบบิตการอ่าน, การเขียนและเอ็กซีคิวต์โลก เปิดเทอร์มินัลแล้วดำเนินการ:

chmod -R o-rwx ~

หากคุณต้องการตั้งค่า umask /etc/profileนี้นำไปใช้กับผู้ใช้ทุกคนในระบบคุณสามารถแก้ไขแฟ้มประวัติของทั้งระบบที่


3
ดังนั้นตัวเลขใน umask หมายความว่าอย่างไร เหตุใด777กลุ่มและบุคคลอื่นจึงสามารถเขียนถึงมันในขณะที่077หมายความว่าพวกเขาทำไม่ได้?
HelloGoodbye

3
นอกจากนี้คุณบอกว่าถ้า umask คืออนุญาตไฟล์จะ000 777ดังนั้นด้วยรูปแบบเริ่มต้นของ022การอนุญาตไฟล์ควรจะ755สอดคล้องกับ-rwxr-xr-xไม่ใช่-rw-r--r--หรือไม่
HelloGoodbye

12
ต้องยอมรับคำอธิบายนี้ทำให้ฉันสับสนมากกว่าที่มันช่วยฉัน
Connel Hooley

8
โปรดทราบว่าumask เริ่มต้นของ Ubuntu เปลี่ยนเป็น 0002เพียงหนึ่งเดือนหลังจากคำตอบนี้ถูกโพสต์
Jeff Puckett

7
@HelloGoodbye ถ้า umask 000นั้นจะไม่มีการอนุญาตใด ๆ ให้ลบออก แอปพลิเคชั่นที่ชอบtouchและnanoสร้างไฟล์ด้วยค่าเริ่มต้น666ดังนั้นการอนุญาตของไฟล์จะยังคงอยู่666แต่ umask ของ022จะลบบิตการเขียนสำหรับกลุ่มและอื่น ๆ ดังนั้นจึง666ถูกลดขนาดเป็น644aka -rw-r--r--พิจารณาmkdirว่าโหมดเริ่มต้นที่สร้าง777ด้วย umask 022จะลดสิทธิ์ไป755
Jeff Puckett

38

นอกเหนือจากการอภิปรายที่ดีในคำตอบที่ยอมรับแล้วมันก็คุ้มค่าที่จะเพิ่มจุดเพิ่มเติมเกี่ยวumaskกับการจัดการใน 12.04 เป็นต้นไป

Umask และ pam_umask

umask เริ่มต้นอยู่ในขณะนี้/etc/login.defsและไม่ได้อยู่ใน/etc/profileบันทึกย่ออย่างเป็นทางการในการ/etc/profileอ่าน:

# The default umask is now handled by pam_umask.
# See pam_umask(8) and /etc/login.defs.

Pam_umaskอธิบายสั้น ๆ ด้านล่างและควรจะกล่าวว่าไฟล์เริ่มต้นสำหรับผู้ใช้ในการวางการตั้งค่า umask ที่กำหนดเองของเขายังคง~/.profileอยู่

Pam_umaskเป็นหนึ่งในโมดูล PAM ที่สำคัญมากมายที่มีความสำคัญในการทำงานของ Ubuntu (เรียกใช้apropos '^pam_'เพื่อค้นหา manpages สำหรับอีกอัน) ในmanpageสำหรับpam_umaskมันมีข้อสังเกตว่า

pam_umask เป็นโมดูล PAM เพื่อตั้งค่ามาสก์การสร้างโหมดไฟล์ของสภาพแวดล้อมปัจจุบัน umask ส่งผลต่อสิทธิ์เริ่มต้นที่กำหนดให้กับไฟล์ที่สร้างขึ้นใหม่

หมายเหตุเกี่ยวกับ umask เริ่มต้น

$HOMEสามารถสร้างโฟลเดอร์ใหม่mkdirด้วยสิทธิ์เริ่มต้น 775 และไฟล์ที่สร้างด้วยtouchสิทธิ์ 664 เริ่มต้นแม้ว่า umask เริ่มต้นจะเป็น 022 นี่เป็นครั้งแรกที่ขัดแย้งและคุ้มค่าที่จะอธิบาย

ในขณะที่ umask เริ่มต้นคือ 022 บน Ubuntu แต่นี่ไม่ใช่เรื่องราวทั้งหมดเนื่องจากมีการตั้งค่า/etc/login.defsที่อนุญาตให้ umask เป็น 002 สำหรับผู้ใช้ที่ไม่ใช่รูทหากตรงตามเงื่อนไข (ดูข้อความที่ตัดตอนมาด้านล่าง) ในการติดตั้งปกติมีการตั้งค่า/etc/login.defs USERGROUPS_ENAB yesนี่คืออะไร

เปิดใช้งานการตั้งค่าบิตกลุ่ม umask ให้เหมือนกับเจ้าของบิต (ตัวอย่าง: 022 -> 002, 077 -> 007) สำหรับผู้ใช้ที่ไม่ใช่รูทหาก uid เหมือนกับ gid และชื่อผู้ใช้เป็นชื่อหลัก ชื่อกลุ่ม.

ดังนั้นทำไมคุณเห็นข้อความต่อไปนี้statเมื่อสร้างโฟลเดอร์ใหม่ด้วยmkdirระบบผู้ใช้เดียวเช่น mine (uid และ gid เหมือนกัน):

Access: (0775/drwxrwxr-x)  Uid: ( 1000/username)   Gid: ( 1000/username)

สำหรับข้อมูลเพิ่มเติมโปรดดูที่man pam_umaskและ อูบุนตู manpages ออนไลน์


ดูเหมือนว่าส่วนที่สองของคุณจะหายไปบางอย่าง? (USERGROUP_ENABLE?) +1 สำหรับข้อมูลที่อัปเดต
Lekensteyn

2
@Lekensteyn แปลกมากการตั้งค่า/etc/login.defsนั้นแน่นอนUSERGROUPS_ENAB yesหลังจากตรวจสอบแล้ว ไวยากรณ์ของไฟล์นั้นผิดปกติเล็กน้อย

ฉันเพิ่งตรวจสอบไฟล์และแหล่งที่มาและคุณพูดถูกการตั้งค่านี้ (และอื่น ๆ ) มีการตั้งชื่อสับสน "_ENAB"
Lekensteyn

33

นี่ค่อนข้างเก่า แต่ก็คุ้มค่าที่จะพูดถึง ในการคำนวณ umask ซึ่งแตกต่างจากสิทธิ์ระบบไฟล์ งานเลขฐานแปดจะถูกคำนวณผ่านทางค่าบิตและของส่วนประกอบที่ยังไม่เสร็จของอาร์กิวเมนต์โดยใช้ bitwise NOT สัญลักษณ์แปดด้านมีดังนี้:

Octal value : Permission
0 : read, write and execute
1 : read and write
2 : read and execute
3 : read only
4 : write and execute
5 : write only
6 : execute only
7 : no permissions

จากนั้นคุณสามารถคำนวณเพื่อตั้งค่า umask ล่วงหน้าอย่างเหมาะสมเช่น:

$ umask 077
$ mkdir dir1
$ touch file
$ ls -ld dir1 file

drwx------ 2 amrx amrx 4096 2011-03-04 02:05 dir1
-rw------- 1 amrx amrx    0 2011-03-04 02:05 file

การคำนวณการอนุญาตขั้นสุดท้ายสำหรับไฟล์

คุณสามารถลบ umask จากสิทธิ์พื้นฐานเพื่อกำหนดสิทธิ์ขั้นสุดท้ายสำหรับไฟล์ดังต่อไปนี้:

666 – 022 = 644
  • สิทธิ์พื้นฐานของไฟล์: 666
  • ค่า umask: 022
  • ลบเพื่อรับสิทธิ์ของไฟล์ใหม่(666-022):644 (rw-r–r–)

การคำนวณการอนุญาตขั้นสุดท้ายสำหรับไดเรกทอรี

คุณสามารถลบ umask จากสิทธิ์พื้นฐานเพื่อกำหนดสิทธิ์ขั้นสุดท้ายสำหรับไดเรกทอรีดังนี้

777 – 022 = 755
  • สิทธิ์พื้นฐานของไดเรกทอรี: 777
  • ค่า umask: 022
  • ลบเพื่อรับสิทธิ์ของไดเรกทอรีใหม่(777-022):755 (rwxr-xr-x)

3
ฉันไม่คิดว่าวิธีการคำนวณใบอนุญาตขั้นสุดท้ายจะเกิดอะไรขึ้นถ้าค่า unmask เป็น077อย่างไรคุณจะลบ666-077ในกรณีนั้นได้อย่างไร
Sufiyan Ghori

5
@SufiyanGhori Baron การอธิบายไม่สมบูรณ์สำหรับการอนุญาตไฟล์ ในกรณีของคุณและการคำนวณใด ๆ ในอนาคตเพื่อง่ายต่อการจำคุณควรจำไว้เพื่อลบพวกเขาด้วยวิธีนี้: 6-0 6-7 6-7 ถ้าผลลัพธ์ใด ๆ ของสามตัวนี้คือ -1 แล้วให้เป็น 0 ดังนั้นเราจึง มีผลลัพธ์สุดท้าย 600
Huy.PhamNhu

1
@ Huy.PhamNhu นั่นไม่ถูกต้องเช่นกัน เมื่อได้รับอนุญาตจาก 666 และ um 033 คุณจะไม่ได้ 633
maaartinus

7
ไม่ไม่ไม่. คุณไม่สามารถใช้การลบเพื่อคำนวณ umask (ใช้ได้กับค่าบางอย่าง แต่ไม่ทั้งหมด) คุณต้องนึกถึง umask ว่าเป็น "disable bits" ดูคำตอบอื่น ๆ ของ Sufiyan และ Wisbucky
wisbucky

33

บางคนตอบว่าได้อธิบายแนวคิดของ umasking ดีและทำไมมันต้อง ให้ฉันเพิ่มสองเซ็นต์ของฉันและให้ตัวอย่างทางคณิตศาสตร์เกี่ยวกับวิธีการคำนวณการอนุญาตจริง

ประการแรก“ หน้ากาก” ไม่ได้หมายความว่า“ ลบ” ในความหมายทางคณิตศาสตร์ - ไม่มีการยืมหรือพกติดตัวประการที่สองumaskหน้ากากคือ ไม่ใช่การลบจำนวน

ประการที่สามหน้ากากปิดบิตการอนุญาต หากพวกเขาปิดอยู่แล้วumaskจะไม่มีการเปลี่ยนแปลงการอนุญาต

ตัวอย่างเช่นสมมติว่าคุณมีการเปิดโปง077จากค่าเริ่มต้นของระบบสำหรับไฟล์ที่เป็นและไดเรกทอรีซึ่งเป็น666777

คำสั่งที่คุณจะใช้คือ

umask 077

(เปิดโปงค่าในไบนารี000 111 111)

สิ่งที่ unmask นี้จะทำคือมันจะปิด LSB หกตัวแรก (บิตที่สำคัญน้อยที่สุด) ถ้าเป็น1และจะไม่มีการเปลี่ยนแปลงหากมีสิ่งใดปิดอยู่

นี่คือวิธีการคำนวณสิทธิ์ขั้นสุดท้าย:

file permisison 666 = 110 110 110 
unmask value    077 = 000 111 111
will result in, 600 = 110 000 000

สังเกตว่า110ค่าทั้งสองมีการเปลี่ยนแปลง000อย่างไร

ในทำนองเดียวกัน

directory permission 777 = 111 111 111 
unmask value         077 = 000 111 111
will result in,      700 = 111 000 000

7
นี่ควรเป็นคำตอบ!
Abdelouahab

@SufiyanGhori ดังนั้นถ้า umask 177(001 111 111) มันจะปิดบิตที่สำคัญน้อยที่สุด 7 อันดับแรกถ้าเป็น1
Kasun Siyambalapitiya

นั่นถูกต้อง @KasunSiyambalapitiya
Sufiyan Ghori

1
สูตรก็เช่นกันresult = file permission & (!umask)
Eric Hodgins

1
@EricHodgins: ใช่แน่นอน
Amit Naidu

14

แนวคิดพื้นฐาน:

หากคุณเป็นเหมือนคนส่วนใหญ่และไม่เข้าใจว่า heck "octal umasks คำนวณจาก bitwise และการรวมกันของข้อโต้แย้งโดยใช้ bitwise NOT"หมายความว่านี่คือคำอธิบายง่ายๆของฉัน:

ก่อนอื่นลองนึกว่า "หน้ากาก" คืออะไร หน้ากากปิดกั้นบางสิ่งบางอย่าง นึกถึงกระดาษกาว ในกรณีนี้ umask ก็เหมือนกับ masking tape เพื่อบล็อก / ปิดการอนุญาตเมื่อสร้างไฟล์ใหม่หรือ dir

สิทธิ์เริ่มต้นเมื่อมีการสร้าง dir ใหม่เป็นและไฟล์ใหม่เป็นoctal 777 (111 111 111) octal 666 (110 110 110)เราตั้ง umask เพื่อบล็อก / ปิดการใช้งานการอนุญาต

  • รูปแบบ1การปิดกั้นหมายถึงการบล็อก / ปิดใช้งานการอนุญาตนั้น (ใส่เทปกาวลงบนบิตนั้น)
  • รูปแบบบิต0จะอนุญาตให้ผ่าน (ไม่มีเทปกาวบนบิตนั้น)

ดังนั้นoctal 022 (000 010 010)หน้ากากหมายถึงการปิดการใช้งานgroup writeและothers writeและอนุญาตให้สิทธิ์อื่น ๆ ทั้งหมดจะต้องผ่าน

คำนวณ:

นี่คือตัวอย่างการคำนวณสำหรับไฟล์ใหม่ (ค่าเริ่มต้น 666 สิทธิ์) ด้วย 022 umask:

  perm mask result
----------------------------
u 1    0    1 (pass through)
  1    0    1 (pass through)
  0    0    0 (pass through)
----------------------------
g 1    0    1 (pass through)
  1    1    0 (disable)
  0    0    0 (pass through)
----------------------------
o 1    0    1 (pass through)
  1    1    0 (disable)
  0    0    0 (pass through)

นั่นคือวิธีที่คุณจะได้ผลลัพธ์ 644 เมื่อคุณสร้างไฟล์ใหม่

วิธีที่ง่ายกว่า:

แต่ถ้าการคำนวณมาสก์ผกผันทำให้คุณสับสน เมื่อคุณใช้วิธีนี้คุณเพียงแค่ระบุบิตทรูบายแทนมาส์กบิต

  • umask u=rwx,g=rx,o=rxวิธีการอนุญาตให้ผ่านสำหรับuser rwx, ,group rx other rxซึ่งหมายถึงการปิดการใช้งาน,group w others wถ้าคุณเรียกใช้คำสั่งนี้แล้วตรวจสอบคุณจะได้รับumask022
  • umask u=rwx,g=,o=user rwxวิธีการอนุญาตให้ผ่านสำหรับ ซึ่งหมายถึงการปิดการเข้าถึงทั้งหมดและgroup othersถ้าคุณเรียกใช้คำสั่งนี้แล้วตรวจสอบคุณจะได้รับumask077

การคำนวณโบนัส:

หากคุณต้องการเข้าใจว่า"octal umasks คำนวณจาก bitwise และส่วนใดส่วนหนึ่งของอาร์กิวเมนต์โดยใช้ bitwise NOT"หมายความว่านี่คือตารางตรรกะบางอย่างที่สามารถช่วยสาธิตได้ โปรดจำไว้ว่ามาสก์บิต1หมายถึงปิดใช้งาน0หมายถึงการผ่าน

perm mask result
----------------
0    1    0     (mask 1 always disables)
1    1    0     (mask 1 always disables)
0    0    0     (mask 0 passes through)
1    0    1     (mask 0 passes through)

หากคุณสร้างตารางด้วยNOT(mask)ตอนนี้มันเป็นเพียงANDตารางตรรกะง่ายๆ!

perm NOT(mask) result
---------------------
0    0         0     (mask 1 always disables)
1    0         0     (mask 1 always disables)
0    1         0     (mask 0 passes through)
1    1         1     (mask 0 passes through)

ดังนั้นสูตรสำหรับมันคือ: result = perm AND (NOT mask)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.