Tại sao một số giá trị umask không có hiệu lực?


9

Tôi đang cố gắng để hiểu các quyền tốt hơn, vì vậy tôi đang thực hiện một số "bài tập". Đây là một chuỗi các lệnh mà tôi đang sử dụng với đầu ra tương ứng của chúng:

$ 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

Điều đó có ý nghĩa bởi vì chúng tôi biết rằng các quyền của tệp mặc định là 666( rw-rw-rw-) và quyền mặc định của thư mục là 777( rwxrwxrwx). Nếu tôi trừ đi giá trị umask từ các quyền mặc định mà tôi có 666-022=644, rw-r--r--thì file1, vì vậy, nó phù hợp với đầu ra trước đó; 777-022=755,, rwx-r-x-r-xcho dir1, cũng mạch lạc.

Nhưng nếu tôi thay đổi ô từ 022sang 021nó thì không còn nữa.

Dưới đây là ví dụ cho tệp:

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

-rw-r--rw-646nhưng nó phải là 666-021=645. Vì vậy, nó không hoạt động theo tính toán trước đó.

Dưới đây là ví dụ cho thư mục:

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

drwxr-xrw-756, 777-021=756. Vì vậy, trong trường hợp này kết quả là phù hợp với tính toán trước đó.

Tôi đã đọc người đàn ông nhưng tôi không tìm thấy bất cứ điều gì về hành vi này.

Ai đó có thể giải thích tại sao?

GIẢI TRÌNH

Như đã chỉ ra trong các câu trả lời: umaskgiá trị của toán học không bị trừ về mặt toán học khỏi các quyền của thư mục và tệp mặc định.

Hoạt động có liên quan hiệu quả là sự kết hợp của các toán tử boolean AND (&) và KHÔNG (!). Được:

R = quyền kết quả
D = quyền mặc định
U = ô hiện tại

R = D &! U

Ví dụ:

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 

TIỀN BOA

Một cách dễ dàng để nhanh chóng biết các quyền kết quả (ít nhất là nó đã giúp tôi) là nghĩ rằng chúng ta có thể sử dụng chỉ 3 giá trị thập phân:

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

Quyền sẽ là sự kết hợp của 3 giá trị này.
" "được sử dụng để chỉ ra rằng sự cho phép tương đối không được đưa ra.

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

Vì vậy, nếu ô hiện tại của tôi là 0053tôi biết tôi đang xóa quyền đọc và thực thi (4+1) khỏi nhóm và viết và thực thi (2+1)từ các kết quả khác dẫn đến

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

(nhóm và khác đã không được phép thực thi)

Câu trả lời:


26

umasklà một mặt nạ , nó không phải là một giá trị bị trừ. Như vậy:

  • chế độ 666, mặt nạ 022: kết quả là 666 & ~ 022, tức là 666 & 755, là 644;
  • chế độ 666, mặt nạ 021: kết quả là 666 & ~ 021, tức là 666 & 756, là 646.

Hãy nghĩ về các bit liên quan. 6 trong chế độ có nghĩa là bit 1 và 2 được đặt, đọc và ghi. 2 trong mặt nạ bit 1, bit ghi. 1 trong mặt nạ bit 0, bit thực thi.

Một cách khác để thể hiện điều này là xem xét các quyền ở dạng văn bản. 666 là rw-rw-rw-; 022 là ----w--w-; 021 là ----w---x. Mặt nạ bỏ các bit thiết lập của nó từ chế độ, do đó rw-rw-rw-bị che bởi ----w--w-trở thành rw-r--r--, bị che bởi ----w---xtrở thành rw-r--rw-.


11

Bạn cần suy nghĩ nhị phân, không thập phân. Cụ thể, có ba số nhị phân 3 bit: mỗi số cho Chủ sở hữu, Nhóm và Khác. Mỗi giá trị nằm trong khoảng từ 000 đến 111 (0-7 theo số thập phân).

ví dụ: rw-rw-rw (666) là 110 110 110.

Các umaskgiá trị là một quy định cụ mặt nạ mà bit sẽ được bật hoặc tắt (1 hoặc 0) khi tạo ra một tập tin mới hoặc thư mục. ví dụ: 022 thập phân là 000 010 010 nhị phân, trong khi 021 thập phân là 000 010 001

Các bit cho phép là AND-ed cùng với các ô bị phủ định để đi đến giá trị cuối cùng. "phủ định" có nghĩa là tất cả các bit được đảo ngược, tức là tất cả 1 được lật về 0 và ngược lại. ví dụNOT 022 (000 010 010) = 755 (111 101 101)

Ví dụ : 666 & !022 = 644. Trong nhị phân, đó là:

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

Ngoài ra , 777 & !022 = 755:

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

Lưu ý cách giá trị cuối cùng của mỗi bit chỉ có thể là 1 nếu nó là 1 trong cả giá trị cấp phép ban đầu (666 hoặc 777) trong ô bị phủ định. Nếu một trong hai là 0, kết quả là 0. Nghĩa là, 1 & 1 = 1 , trong khi 1 & 0 = 0 .


Nói một cách chính xác, có một số nhị phân 3 bit thứ tư cho các bit setuid, setgid và dính. Đó là lý do tại sao bạn thường thấy các quyền và mặt nạ được chỉ định bằng số 0 đứng đầu (hoặc một số số hàng đầu khác từ 0-7). ví dụ 0777 hoặc 2755.


2
Về mặt kỹ thuật, đó là số bát phân, không phải số thập phân, nhưng điều đó không thực sự thay đổi cốt lõi của câu trả lời.
David Z

@DavidZ: OP nghĩ rằng đó là số thập phân (xem ví dụ về phép trừ trong Q), có lẽ là những gì cas đang đề cập đến.
Các cuộc đua nhẹ nhàng trong quỹ đạo

1
@Lightness các ví dụ trừ được đưa ra bởi OP hoạt động cho dù chúng là bát phân hay thập phân, với điều kiện là không có chữ số nào đạt đến 8 và không bao giờ cần phải mang theo. Tôi đồng ý rằng có thể OP đã suy nghĩ theo số thập phân, nhưng không có gì trong câu hỏi chứng minh điều đó.
Stephen Kitt

@StephenKitt: Có vẻ như ngón tay của tôi đã bị trượt trên bàn phím khi tôi đang viết ví dụ vào calc.exe để chứng minh điều đó
Các cuộc đua Lightness trong Orbit

1
@cas vâng, tôi không đồng ý với phần đó (đó cũng là cơ sở cho câu trả lời của tôi), chỉ với khẳng định của Lightness rằng OP đang tính toán theo số thập phân chứ không phải bát phân.
Stephen Kitt
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.