Um umask là gì và nó hoạt động như thế nào?


190

Tôi tin rằng umask là thứ kiểm soát quyền truy cập tệp , nhưng không hiểu đầy đủ về nó.

Sau khi chạy umask 0644trong một thiết bị đầu cuối , tôi không thể đọc các tệp tôi tạo bằng trình soạn thảo văn bản dòng lệnh nano. Tôi nhận thấy rằng các quyền của tệp đó được đặt thành 0022thay vì mặc định 0755.

Làm thế nào để umask hoạt động? Tôi nghĩ rằng tôi chỉ có thể loại bỏ từng chữ số trong ô 0777, 7 - 6 = 17 - 4 = 3vì vậy, tôi hy vọng các quyền sẽ được 0133, nhưng rõ ràng, đây không phải là trường hợp.

  1. Ô chính xác là gì? Giải thích cho tôi như thể tôi là một "Linux noob"
  2. Làm thế nào để tôi tính toán với umask?
  3. Trường hợp sử dụng cho umask là gì?

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

Câu trả lời:


143

Umask hoạt động như một tập hợp các quyền mà các ứng dụng không thể thiết lập trên các tệp. Đó là mặt nạ tạo chế độ tệp cho các quy trình và không thể được đặt cho chính các thư mục. Hầu hết các ứng dụng sẽ không tạo các tệp với quyền thực thi được đặt, do đó chúng sẽ có mặc định 666, sau đó được sửa đổi bằng ô.

Vì bạn đã đặt ô để loại bỏ các bit đọc / ghi cho chủ sở hữu và các bit đọc cho người khác, một mặc định như 777trong các ứng dụng sẽ dẫn đến quyền của tệp 133. Điều này có nghĩa là bạn (và những người khác) có thể thực thi tệp và những người khác sẽ có thể ghi vào nó.

Nếu bạn muốn làm cho các tệp không được đọc / ghi / thực thi bởi bất kỳ ai trừ chủ sở hữu, bạn nên sử dụng một ô như 077để tắt các quyền đó cho nhóm và những người khác.

Ngược lại, một ô 000sẽ làm cho các thư mục mới được tạo có thể đọc được, có thể ghi và có thể hạ xuống cho mọi người (các quyền sẽ được 777). Một cái ô như vậy rất không an toàn và bạn không bao giờ nên đặt ô đó thành 000.

Ô mặc định trên Ubuntu 022có nghĩa là mọi người mới có thể đọc được các tệp mới, nhưng chỉ có thể ghi bởi chủ sở hữu:

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

Bắt đầu trong Ubuntu Oneiric (11.10), ô mặc định được nới lỏng 002, giúp mở rộng quyền truy cập ghi vào nhóm của chủ sở hữu:

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

Xem và sửa đổi ô

Để xem cài đặt ô hiện tại của bạn, hãy mở một thiết bị đầu cuối và chạy lệnh:

umask

Để thay đổi cài đặt ô của vỏ hiện tại thành một thứ khác, giả sử 077, chạy:

umask 077

Để kiểm tra xem cài đặt này có hoạt động hay không, bạn có thể tạo một tệp mới (quyền truy cập tệp của tệp hiện tại sẽ không bị ảnh hưởng) và hiển thị thông tin về tệp, chạy:

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

Cài đặt umask được kế thừa bởi các quy trình bắt đầu từ cùng một vỏ. Ví dụ: khởi động trình soạn thảo văn bản GEdit bằng cách thực thi gedittrong thiết bị đầu cuối và lưu tệp bằng gedit. Bạn sẽ nhận thấy rằng tệp mới được tạo bị ảnh hưởng bởi cùng cài đặt ô như trong thiết bị đầu cuối.

Trường hợp sử dụng: hệ thống nhiều người dùng

Nếu bạn đang ở trên một hệ thống được chia sẻ bởi nhiều người dùng, mong muốn những người khác không thể đọc các tệp trong thư mục chính của bạn. Đối với điều đó, một umask là rất hữu ích. Chỉnh sửa ~/.profilevà thêm một dòng mới với:

umask 007

Bạn cần phải đăng nhập lại để thay đổi ô này ~/.profileđể có hiệu lực. Tiếp theo, bạn cần thay đổi quyền truy cập tệp hiện có của các tệp trong thư mục chính của bạn bằng cách xóa bit đọc, ghi và thực thi cho thế giới. Mở một thiết bị đầu cuối và thực hiện:

chmod -R o-rwx ~

Nếu bạn muốn cài đặt ô này được áp dụng cho tất cả người dùng trên hệ thống, bạn có thể chỉnh sửa tệp hồ sơ toàn hệ thống tại /etc/profile.


3
Vì vậy, các chữ số trong ô có nghĩa là gì? Tại sao có 777nghĩa là nhóm và những người khác sẽ có thể viết cho nó, trong khi 077có nghĩa là họ không thể?
HelloGoodbye

3
Ngoài ra, bạn nói rằng nếu umask là 000, quyền tập tin sẽ được 777. Vì vậy, với mặt nạ mặc định 022, không nên cấp quyền tệp 755, tức là tương ứng với -rwxr-xr-x, phải không -rw-r--r--?
HelloGoodbye

12
Phải thừa nhận, lời giải thích này làm tôi bối rối hơn nó đã giúp tôi.
Connel Hooley

8
lưu ý rằng ô mặc định của Ubuntu đã thay đổi thành 0002 chỉ một tháng sau khi câu trả lời này được đăng.
Jeff Puckett

7
@Hello Goodbye nếu umask 000thì không có quyền sẽ bị xóa. các ứng dụng thích touchnanotạo các tệp với mặc định 666vì vậy quyền vẫn sẽ duy trì 666nhưng một ô 022sẽ loại bỏ các bit ghi cho nhóm và các tệp khác, do đó, 666được giảm xuống 644còn -rw-r--r--Xem xét mkdirchế độ tạo mặc định nào 777với một ô 022sẽ giảm quyền cho755
Jeff Puckett

38

Ngoài các cuộc thảo luận tốt trong câu trả lời được chấp nhận, đáng để thêm một số điểm nữa umask, với tham chiếu về cách nó được quản lý trong 12.04 trở đi.

Umask và pam_umask

Ô mặc định hiện có /etc/login.defsvà không có /etc/profile, như ghi chú chính thức trong các lần /etc/profileđọc:

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

Pam_umaskđược giải thích ngắn gọn dưới đây và cần phải nói rằng tệp mặc định để người dùng đặt cài đặt ô tùy chỉnh của mình vẫn còn ~/.profile.

Pam_umasklà một trong nhiều mô-đun PAM quan trọng rất quan trọng trong hoạt động của Ubuntu (chạy apropos '^pam_'để tìm các trang cho các trang khác). Trong trang web cho pam_umasknó được lưu ý rằng

pam_umask là mô-đun PAM để đặt mặt nạ tạo chế độ tệp của môi trường hiện tại. Các ô ảnh hưởng đến các quyền mặc định được gán cho các tệp mới được tạo.

Một lưu ý về ô mặc định

Các thư mục mới $HOMEcó thể được tạo bằng mkdir775 quyền và tệp touchmặc định được tạo với quyền 664 mặc định ngay cả khi ô mặc định là 022. Lúc đầu, điều này có vẻ mâu thuẫn và đáng để giải thích.

Mặc dù ô mặc định là 022 trên Ubuntu, nhưng đây không phải là toàn bộ câu chuyện, vì có một cài đặt /etc/login.defscho phép ô đó là 002 cho người dùng không root nếu gặp điều kiện (xem đoạn trích bên dưới). Trên một cài đặt bình thường, /etc/login.defschứa các cài đặt USERGROUPS_ENAB yes. Đây là những gì

Cho phép cài đặt các bit nhóm umask giống với bit chủ sở hữu (ví dụ: 022 -> 002, 077 -> 007) cho người dùng không root, nếu uid giống với gid và tên người dùng giống với tên chính tên nhóm.

Do đó, tại sao bạn thấy những điều sau đây statkhi một thư mục mới được tạo mkdirtrên một hệ thống người dùng như của tôi (uid và gid giống nhau):

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

Để biết thêm thông tin, hãy xem man pam_umaskvà các trang web Ubuntu trực tuyến .


Có vẻ như phần thứ hai của bạn đang thiếu một cái gì đó? (USERGROUP_ENABLE?) +1 để biết thông tin cập nhật
Lekensteyn

2
@Lekensteyn Thật kỳ lạ, thiết lập trong /etc/login.defschắc chắn là USERGROUPS_ENAB yessau khi kiểm tra nó. Cú pháp của tập tin đó là hơi bất thường.

Tôi chỉ kiểm tra tệp và nguồn và bạn đã đúng, cài đặt này (và một số khác) được đặt tên khó hiểu là "_ENAB".
Lekensteyn

33

Điều này là khá cũ, nhưng điều này là đáng nói. Để tính toán cho ô, không giống như quyền hệ thống tập tin. Các ô bát phân được tính toán thông qua bit VÀ của phần bù đơn phương của đối số bằng cách sử dụng bitwise NOT. Các ký hiệu bát phân như sau:

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

Sau đó, bạn có thể tính toán để thiết lập các khoản đầu tư thích hợp như:

$ 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

Tính toán quyền cuối cùng cho các tập tin

Bạn chỉ có thể trừ ô từ các quyền cơ sở để xác định quyền cuối cùng cho tệp như sau:

666 – 022 = 644
  • Quyền cơ sở tập tin: 666
  • giá trị umask: 022
  • trừ để có quyền của tập tin mới (666-022):644 (rw-r–r–)

Tính toán quyền cuối cùng cho các thư mục

Bạn chỉ có thể trừ ô từ các quyền cơ sở để xác định quyền cuối cùng cho thư mục như sau:

777 – 022 = 755
  • Quyền cơ sở thư mục: 777
  • giá trị umask: 022
  • Trừ đi để có được quyền của thư mục mới (777-022):755 (rwxr-xr-x)

3
Tôi không nghĩ đó là cách tính các phép cuối cùng, nếu giá trị vạch mặt là 077bạn sẽ trừ như thế nào 666-077trong trường hợp đó?
Sufiyan Ghori

5
Giải thích của @SufiyanGhori Baron chưa hoàn tất để xin phép tập tin. Trong trường hợp của bạn và bất kỳ phép tính nào trong tương lai, để dễ nhớ, bạn nên ghi nhớ để trừ chúng theo cách này: 6-0 6-7 6-7 nếu bất kỳ kết quả nào của ba số đó là -1 thì hãy để nó là 0. Vì vậy, chúng tôi có kết quả cuối cùng 600
Huy.PhamNhu

1
@ Huy.PhamNhu Điều đó cũng không đúng. Với sự cho phép cơ bản là 666 và số 033, bạn chắc chắn sẽ không nhận được 633.
maaartinus

7
Không không không. Bạn không thể sử dụng phép trừ để tính ô (nó hoạt động với các giá trị nhất định, nhưng không phải tất cả). Bạn phải nghĩ về umask là "vô hiệu hóa bit". Xem các câu trả lời khác của Sufiyan và Wisbucky.
wvducky

33

Những người khác trả lời đã giải thích thực sự tốt về khái niệm ô và tại sao nó được yêu cầu. Hãy để tôi thêm hai xu của tôi và cho bạn một ví dụ toán học về cách các quyền thực sự được tính toán.

Trước hết, Mặt nạ Hồi giáo không có nghĩa là trừ trừ, theo nghĩa số học - không có sự vay mượn hay mang theo, thứ hai, đó umasklà một mặt nạ; nó không phải là một số bị trừ

Thứ ba, mặt nạ tắt bit cho phép. Nếu họ đã tắt, sẽ umaskkhông thay đổi quyền,

Ví dụ: giả sử rằng bạn phải vạch mặt 077từ hệ thống mặc định cho các tệp 666và thư mục 777.

Lệnh bạn sẽ sử dụng là,

umask 077

(vạch mặt giá trị trong nhị phân, 000 111 111)

Điều mà sự vạch mặt này sẽ làm là nó sẽ tắt bất kỳ sáu LSB đầu tiên nào (ít bit có ý nghĩa nhất) nếu chúng đang 1và sẽ không thay đổi nếu bất kỳ trong số chúng đã bị tắt.

Đây là cách tính cho phép cuối cùng:

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

Quan sát cách cả hai 110giá trị đã thay đổi thành 000.

Tương tự như vậy,

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

7
đây sẽ là câu trả lời
Abdelouahab

@SufiyanGhori Vì vậy, nếu umask 177(001 111 111), nó sẽ tắt 7 bit đáng kể đầu tiên nếu chúng là1
Kasun Siyambalapitiya

đúng vậy @KasunSiyambalapitiya
Sufiyan Ghori

1
công thức cũng vậyresult = file permission & (!umask)
Eric Hodgins

1
@EricHodgins: Vâng, chính xác.
Amit N Nikol

14

Khái niệm cơ bản:

Nếu bạn giống như hầu hết mọi người và không hiểu "các số bát phân" được tính toán thông qua bitwise AND của phần bù đơn nhất của đối số bằng bitwise NOT " nghĩa là gì, đây là lời giải thích đơn giản của tôi:

Trước hết, hãy nghĩ về "mặt nạ" là gì. Một mặt nạ chặn một cái gì đó. Hãy nghĩ về mặt nạ băng. Trong trường hợp này, umask giống như mặt nạ băng để chặn / vô hiệu hóa quyền khi tạo tệp hoặc thư mục mới.

Các quyền mặc định khi tạo một thư mục mới là octal 777 (111 111 111)và một tệp mới là octal 666 (110 110 110). Chúng tôi đặt ô để chặn / vô hiệu hóa một số quyền.

  • Một chút mặt nạ của 1phương tiện để chặn / vô hiệu hóa quyền đó (đặt băng che trên bit đó).
  • Một chút mặt nạ 0sẽ cho phép quyền đi qua (không có băng che trên bit đó).

Vì vậy, một octal 022 (000 010 010)mặt nạ có nghĩa là vô hiệu hóa group writeothers write, và cho phép tất cả các quyền khác đi qua.

Phép tính:

Dưới đây là một tính toán ví dụ cho một tệp mới (quyền 666 mặc định) với 022 ô:

  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)

Vì vậy, đó là cách bạn kết thúc với kết quả 644 khi bạn tạo một tệp mới.

Cách dễ dàng hơn:

Nhưng nếu tính toán mặt nạ nghịch đảo chỉ làm bạn bối rối, có một cách dễ dàng hơn bằng cách sử dụng ký hiệu umask tượng trưng. Khi bạn sử dụng phương pháp này, thì bạn chỉ xác định các bit truyền qua thay vì các bit mặt nạ.

  • umask u=rwx,g=rx,o=rxphương tiện cho phép đi qua cho user rwx, group rx, other rx. Trong đó hàm ý vô hiệu hóa group w, others w. Nếu bạn chạy lệnh này thì kiểm tra umask, bạn sẽ nhận được 022.
  • umask u=rwx,g=,o=có nghĩa là cho phép đi qua cho user rwx. Điều này ngụ ý vô hiệu hóa tất cả truy cập cho groupothers. Nếu bạn chạy lệnh này thì kiểm tra umask, bạn sẽ nhận được 077.

Tính toán tiền thưởng:

Nếu bạn thực sự muốn hiểu "các số bát phân được tính thông qua bitwise AND của phần bù đơn phương của đối số bằng bitwise NOT" nghĩa là gì, thì đây là một số bảng logic có thể giúp chứng minh. Hãy nhớ rằng, một bit mặt nạ 1có nghĩa là vô hiệu hóa, 0có nghĩa là đi qua.

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)

Nếu bạn tạo bảng với NOT(mask), bây giờ nó chỉ là một ANDbảng logic đơn giản !

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)

Vì vậy, công thức cho nó là: result = perm AND (NOT mask)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.