일부 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 = 110110110 및 
            ! 000 101 011 
             110110110 및  
             111010100
           = 110 010 100 = 624 = rw--wr--
 
777 &! 0022 = 111111111 및 
            ! 000 010 010
             111 111 111 및  
             111 101 101
           = 111101101 = 755 = rwxr--xr-x 

결과 권한을 신속하게 알 수있는 쉬운 방법 (최소한 도움이 되었음)은 소수점 이하 세 자리 만 사용할 수 있다고 생각하는 것입니다.

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

umaskA는 마스크 그것은 뺀 값이 아니다. 그러므로:

  • 모드 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-이고; 021은 ----w---x입니다. 마스크 때문에, 모드 세트로부터 비트를 삭제 rw-rw-rw-함으로써 마스크 ----w--w-된다 rw-r--r--의해 마스크, ----w---x해진다 rw-r--rw-.


11

십진수가 아닌 이진수로 생각해야합니다. 특히 소유자, 그룹 및 기타에 각각 하나씩 3 개의 3 비트 이진수가 있습니다. 각각 000에서 111 사이의 값을 갖습니다 (10 진수로 0-7).

예를 들어 rw-rw-rw (666)는 110110110입니다.

umask값은 새 파일이나 디렉토리를 만들 때 어떤 비트가 켜지거나 꺼질 지 (1 또는 0)를 지정하는 마스크입니다. 예 : 022 10 진수는 000 010 010 이진수이고 021 10 진수는 000 010 001입니다

권한 비트는 부정 된 umask와 함께 AND-ed되어 최종 값에 도달합니다. "negated"는 모든 비트가 반전됨을 의미합니다. 즉, 모든 1이 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

각 비트의 최종 값이 원래 권한 값 (666 또는 777) 부정 된 umask 모두 에서 1 인 경우에만 1이 될 수 있습니다 . 둘 중 하나가 0이면 결과는 0입니다. 즉, 1 & 1 = 1 이고 1 & 0 = 0 입니다.


엄밀히 말하면 setuid, setgid 및 sticky 비트에 대한 네 번째 3 비트 이진수가 있습니다. 그렇기 때문에 선행 0 (또는 0 ~ 7의 다른 선행 번호)으로 지정된 권한과 마스크가 종종 표시됩니다. 예 : 0777 또는 2755


2
기술적으로 십진수가 아닌 8 진수이지만 실제로 답변의 핵심을 바꾸지는 않습니다.
David Z

@DavidZ : OP는 그것이 10 진수라고 생각했습니다 (Q의 빼기 예 참조). 아마도 cas가 참조한 것입니다.
궤도

1
@Lightness는 숫자가 8에 도달하지 않고 캐리가 필요하지 않다는 점을 고려하여 OP가 제공하는 빼기 예제가 8 진수 또는 10 진수인지 여부에 관계없이 작동합니다. OP가 10 진수로 생각했을 가능성이 있지만 동의하지는 않습니다.
Stephen Kitt

@StephenKitt : calc.exe에 예제를 쓸 때 손가락이 키패드에서 미끄러 져 들어가야하는 것처럼 보입니다. 😂
Orbit in Orbit

1
@ cas 예, OP가 8 진이 아닌 10 진수로 계산되었다는 Lightness의 주장과 함께 그 부분에 동의하지 않았습니다 (내 대답의 기초이기도합니다).
Stephen Kitt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.