차단 모드란 무엇인가요?

차단 모드란 무엇인가요?

내가 아는 한, GNU/Linux에서는 파일 권한을 파일 권한이라고도 합니다.모델그리고 "마스크"라는 용어는 적어도 다음과 같은 다른 의미를 의미할 수 있습니다.

  1. 이것마스크쉘 내장(일반적인 의미).
  2. 이것마스크쉘 내장 응답시스템 호출.
  3. 이것마스크해당 명령이 쉘에 내장되어 있습니다 umask.
  4. 쉘 프로시저 값은 다음과 같이 알려져 있습니다.파일 생성 마스크, 또한비트 마스크그렇지 않으면마스크.
  5. 사용자별 파일은 해당 사용자에게 고유한 프로세스에 영향을 미치는 마스크를 생성합니다.사용자 마스크→ 사용자의 파일 생성 마스크).

이것마스크내장 케이스

하나는 사용할 수 있습니다마스크umask적절한 인수를 사용하여 명령을 실행하여 쉘을 빌드합니다.
이를 통해 우리는마스크현재를 위해쉘 프로세스 트리;
현재 쉘 프로세스 트리의 모든 사용자 또는 우리 자신의 사용자에 대해
일반적으로 이러한 변경 사항은 새 프로세스에 상속됩니다.아마 또 다른 껍질일 거야).

수학적 논리의 기초

나는 이해수학적 논리포함 작업접속사또한 ~으로 알려진안정적인( )는 다음을 기준으로 한다.마스크케이스 내장. 그러므로:

피연산자 집합에 대해 true입니다.만약에 그리고 만약에, 모든 피연산자가 참입니다.

그리고 같은 이름을 가진 사람이 있다는 걸 알게 됐어요비트별 연산이 논리를 기반으로 합니다. Anding은 x + y → z숫자를 더하는 것( )이나 문자열을 연결하는 것( )과 다릅니다 x alongside y → xy.

내 질문

다음과 같이 "패턴을 마스크"하는 것이 가능하다는 것을 알고 있습니다.

  OCTAL  BINARY       HUMAN-READABLE
  0666   0110110110  -rw-rw-rw-
∧ 0555   0101101101  -r-xr-xr-x
  0444   0100100100  -r--r--r-- 

하지만 이것이 맞는지는 잘 모르겠습니다.

내 질문

차단 모드란 무엇이며 어떻게 구현하나요 0666 ∧ 0555 → 0444?

답변1

umask, 쉘 명령 및umask, 함수, 모두 라고도 알려진 파일 생성 마스크를 설정합니다 umask.

당신은 그것을 다음과 같이 다시 작성했습니다

A는 umask쉘 내장 명령과 해당 명령을 기반으로 하며 일반적으로 호출되는 변수를 포함하는 쉘 함수를 나타냅니다.파일 생성 마스크그 가치는비트 마스크그렇지 않으면마스크.

이는 여러 면에서 올바르지 않습니다.

  • umask함수는 쉘 함수가 아닙니다. 위 링크를 참조하세요.
  • 이 함수에는 변수가 없습니다. 현재 프로세스에 대한 파일 생성 마스크를 설정합니다.
  • ​​​​에 기초한 가치는흔히 언급되는"파일 생성 마스크"로서파일 생성 마스크(해당 값은 "비트마스크" 또는 "마스크"라고 부르지 않음)

마스크변경될 수 있는 다른 쉘을 포함하여 현재 프로세스 트리의 일부 유틸리티에 영향을 미칩니다(따라서 쉘 Y에는 쉘 X의 마스크가 반드시 있을 필요는 없습니다).

마스크는 일반적으로 영향을 미치지 않습니다.파일 생성 마스크현재 프로세스에 영향을 미치며 상속됩니다.모두새로 생성된 하위 프로세스입니다. 하위 프로세스는 자유롭게 다시 변경할 수 있습니다.

이 파일 생성 마스크는 새로 생성된 파일의 권한에 따라 작동합니다. 파일 모드라고도 하는 파일 권한은 파일 소유자, 그룹 및 기타 사용자에 대한 12비트로 인코딩된 액세스 권한 집합입니다.이 표준 답변더 알아보기. 일반적으로 4자리 또는 3자리 8진수 값으로 표시됩니다. 그들을아니요비트스트림.

새로 생성된 파일에 대한 권한은 해당 파일을 생성한 프로그램에 의해 지정되거나 기본적으로 지정됩니다(파일을 생성하는 데 사용하는 함수에 의해 지정됨). 전자의 예로는 다음을 사용하여 파일(또는 디렉터리)을 생성하는 프로그램이 있습니다.open또는creat또는mkdir, 원하는 모드를 명시적으로 지정해야 합니다. 후자의 예로는 다음을 사용하는 프로그램이 있습니다.fopen, 여기서 파일은 기본 0666 모드로 끝납니다. 현재 umask값은 이 모드를 마스킹합니다.

당신은 그것을 다음과 같이 다시 작성합니다

  1. 다음과 같은 일부 유틸리티mkdir독립 모드로 파일을 생성합니다(마스크는 무시됩니다).
  2. 일부 유틸리티 사용fopen()처음에는 기본 0666 모드를 사용하여 파일을 생성했지만, umask생성 직후에 마스크 모드로 모드를 변경하는 기능입니다.

이는 여러 면에서 올바르지 않습니다.

  • 요청된 패턴에 마스크를 적용한 후가 아닌 파일을 생성하기 전에 적용하십시오.
  • mkdir(유틸리티가 아닌 기능이지만, 같은 이름의 유틸리티에도 동일하게 적용됩니다)아니요파일 생성 마스크는 무시됩니다.

umask고려할 때 결과 패턴은 요청된 패턴에 비트마스크로 umask를 적용한 결과입니다. 요청된 패턴에 설정된 각 비트는 의 해당 비트와 비교하여 확인되고 umask후자가 설정되지 않은 경우에만 유지됩니다. 이진 연산의 경우 요청된 패턴 AND의 보수는 비트 ANDed입니다 umask. 따라서 umask모드 0666의 0022는 뺄셈이 아니라 0666과 0755(0022의 보수)가 0644이기 때문에 0644를 제공합니다. 마찬가지로 umask모드 0666을 사용한 0011의 결과는 0666입니다.

계산 과정을 좀 더 자세히 살펴보겠습니다. 연결된 답변에 포함된 빼기로 표현되는 경우가 많지만 umask마스크로 사용되지 않는다는 점을 이해하는 것이 중요합니다. 따라서 값 0022가 적용됩니다.

       Octal Binary
Mode   0666  000110110110
Mask   0022  000000010010  Bits set here mask bits above
Result 0644  000110100100

       Octal Binary
Mode   0644  000110100100
Mask   0022  000000010010
Result 0644  000110100100

이는 일반적으로 패턴을 마스크의 보수와 비트 단위 AND로 계산합니다.

       Octal Binary
Mask   0022  000000010010
Compl. 7755  111111101101
Mode   0666  000110110110
Result 0644  000110100100

chmod에 관계없이 명령줄에 지정된 모드를 적용합니다 umask. 파일을 생성할 때에도 다른 도구를 사용하여 이 작업을 수행할 수 있습니다. 따라서 권한을 유지하라는 지시를 받으면 권한은 관계없이 복사되거나 복원 cp됩니다 .tarumask

이 답변자세한 내용은.

마지막 질문은

내 이해가 충분히 정확합니까? 어떻게 0666∧0555→0444가 될 수 있나요?

첫 번째 질문에 대한 대답은 분명히 '아니요'입니다. 두 번째 질문에 대한 대답은 그것이 비트 합계가 작동하는 방식이기 때문입니다. 피연산자를 이진수로 다시 작성합니다.

Octal  Binary
0666   000110110110
0555   000101101101

이제 각 비트 위치에 대해 비트별 AND를 수행합니다. 이는 수직으로 정렬된 각 비트 쌍을 취하는 것을 의미하며 다음과 같습니다(위의 예에서는 0 ∧ 0을 세 번, 그 다음에는 1 ∧ 1, 1 ∧ 0, 0 ∧ 1, 1 ∧ 1 등).

       000100100100

(0 ∧ 0은 0, 0 ∧ 1은 0, 1 ∧ 0은 0, 1 ∧ 1은 1입니다). 위의 내용을 다시 8진수로 변환하면 0444가 됩니다.

답변2

패턴이 뭐예요?

"파일 모드"라는 용어는 Linux 시스템에서 사용할 수 있는 표준 파일 권한을 나타냅니다.액세스 제어 목록, 이는 다른 품종입니다).

파일 모드는 12비트로 구성되며, 각 비트는 부여되거나 부여되지 않을 수 있는 권한을 나타냅니다(따라서 이를 나타내는 데는 1비트이면 충분합니다).
예를 들어, "그룹 구성원이 파일을 읽을 수 있음" 권한은 오른쪽에서 6번째 비트입니다.

사용 편의성을 위해 이 12비트는 각각 3비트로 구성된 4개의 그룹으로 나뉩니다. 3자리 이진수는 8개의 서로 다른 값을 가질 수 있는데, 이는 8진수(0~7)가 나타낼 수 있는 값의 개수와 정확히 같습니다.
따라서 이러한 12개의 권한은 0~7777 범위의 4자리 8진수로 표시될 수 있습니다.
상황을 더욱 혼란스럽게 만들기 위해 8진수는 일반적으로 앞에 0을 추가하여 표시하므로( 0x16진수에 관례적으로 접두사가 붙는 것처럼) 모드는 0–07777입니다.

더 간단하게 만들려면 대부분의 경우 하위 9비트에만 관심이 있으므로 여기서는 0~0777에 중점을 두겠습니다.

왜 8진수로 쓰여졌나요?

왜 8진수를 사용하나요? 패턴을 읽는 것이 더 쉬워집니다!

모드의 가장 낮은 9비트는 다음과 같은 권한 비트를 나타냅니다.그와 같은 순서로. 이진 표현을 사용하는 대신 해당 비트의 값을 8진수로 표시하겠습니다( chmod(2)에서 복사).

00400 read by owner
00200 write by owner
00100 execute/search by owner
00040 read by group
00020 write by group
00010 execute/search by group
00004 read by others
00002 write by others
00001 execute/search by others

패턴이 보이나요? 1Always는 실행/검색, 2항상 쓰기 및 4항상 읽기를 의미합니다. 읽기 및 실행이 허용되지만 쓰기가 허용되지 않는 경우 숫자는 항상 이고 5읽기/쓰기/실행을 모두 합한 3가지 권한은 모두 항상 입니다 7. 비교를 위해 십진수 값을 살펴보세요.

Allow read/execute for others:          0005, decimal   5.
Allow read/execute for group:           0050, decimal  40.
Allow read/execute for owner:           0500, decimal 320.
Allow read/execute for owner and group: 0550, decimal 360.
Allow read/execute for all, write
only for owner:                         0755, decimal 493.

따라서 8진수는 일관성을 더 높여줍니다. 숫자의 위치는 소유자/그룹/기타이고 숫자는 세 개의 읽기/쓰기/실행 비트에 대한 모든 것을 알려줍니다.

우마스크가 뭐야?

우마스크는프로세스 속성(즉, 쉘과 같은 실행 중인 프로그램) 각 프로세스마다 하나씩. 권한을 설정하지 않고 프로세스를 결정합니다.새 파일 만들기. shell 명령은 umask쉘의 마스크를 설정합니다. 언제이것쉘은 다른 프로그램을 시작한 다음 호출 쉘에서 umask를 상속합니다. 따라서 쉘에서 umask를 설정하면아니요다른 프로그램에 영향을 미치고,~하지 않는 한그들은 첫 번째 껍질의 후손이며 창조되었습니다.뒤쪽에우마스크를 설정하세요. 이것이 세션 초기에 스크립트에 의해 umask가 설정되어야 하는 이유입니다.

다른 사람이 뭐라고 말하든 사용하십시오 077;-)

새 파일이 있을 때만들어진, 프로그램을 통해 프로그램은 필요한 권한을 open(2) 시스템 호출에 전달합니다. 운영 체제는 umask에 설정된 비트를 제거하고 그 결과를 사용하여 파일을 생성합니다. 이를 테스트하려면 다음 C 프로그램을 사용할 수 있습니다.

#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <err.h>
#include <stdio.h>

int main(int argc, char **argv) {

    // check for enough command line arguments
    if (argc < 3)
        errx(1, "Usage: %s <filename> <octalmode>", argv[0]);

    // parse 2nd argument as octal integer
    char *endptr = NULL;
    int mode = (int)strtol(argv[2], &endptr, 8);
    if (!*argv[2] || *endptr || mode < 0)
        errx(2, "Not an octal mode: %s", argv[2]);

    // create new file with given mode
    int fd = open(
        argv[1],
        O_WRONLY|O_CREAT|O_EXCL,
        mode
    );
    if (fd < 0)
        err(1, "Failed to create file %s", argv[1]);

    printf("open(\"%s\", ..., 0%03o) successful\n", argv[1], mode);

    close(fd);

    return 0;
}

엮다:

$ gcc -o mkfile mkfile.c

다음 예를 따르십시오.

$ umask 77   # set umask to 0077
$ umask      # check umask
0077
$ rm -f foo           # delete old to make sure a new file will be created
$ ./mkfile foo 660    # create file `foo` with mode 0660
open("foo", ..., 0660) successful
$ ls -l foo
-rw------- 1 sk users 0 Nov  6 12:09 foo

프로그램이 어떻게 모드 0660인 rw-rw---- 권한을 요청하지만 그룹의 권한은 umask에 의해 완전히 제거되는지 확인하세요.

umask:                              0077    000 000 111 111
umask bitwise negated:             07700    111 111 000 000
open's argument:                    0660    000 110 110 000

(open's argument) AND (NEG umask)   0600    000 110 000 000

일반적으로 프로그램은 가장 허용적인 상황에서 유용하다고 간주되는 권한을 제안해야 하며, 권한 제거는 운영 체제의 umask에 맡겨야 합니다. 따라서 (2)를 사용하여 디렉토리를 생성할 때는 0777을 사용하고 mkdir, (2)를 사용하여 일반 파일을 생성할 때는 0666을 사용합니다 open. 예를 들어 암호화 도구는 open0600을 사용하여 개인 키를 저장할 수 있고 컴파일러는 이를 0755생성하는 실행 가능한 바이너리에 사용할 수 있습니다. 이 모든 경우에 umask는 파일이 실제로 생성될 때 파일에서 불필요한 권한을 제거합니다.

다음은 모든 사람이 읽고 실행할 수 있지만 umask 077 설정에서 사용자(모드 0755)만 쓸 수 있는 파일을 생성하려는 컴파일러의 예입니다.

$ rm -f foo
$ umask 77
$ ./mkfile foo 0755
open("foo", ..., 0755) successful
$ ls -l foo
-rwx------ 1 sk users 0 Nov  6 12:15 foo

umask 0 설정(프로그램에서 요청한 모든 비트가 허용됨):

$ rm -f foo
$ umask 0
$ ./mkfile foo 0755
open("foo", ..., 0755) successful
$ ls -l foo
-rwxr-xr-x 1 sk users 0 Nov  6 12:16 foo

실제로 gcc패턴 0777도 요청됩니다.

$ umask 0
$ rm -f mkfile
$ gcc -o mkfile mkfile.c
$ ls -l mkfile
-rwxrwxrwx 1 sk users 17k Nov  6 12:19 mkfile

그래서원하지 않는다umask 0을 사용하세요.

답변3

Linux에서 기본 파일 권한은 0644, 기본 디렉터리 권한은 0755, 기본 umask는 0022입니다.

이제 파일의 전체 권한은 0666이므로 기본 권한은 (0666 - 0022 = 0644)에서 나오고 디렉터리의 기본 권한은 (0777 - 0022 = 0755)입니다.

전체 666/777 권한을 가진 파일과 디렉터리를 생성하는 설정 마스크를 사용할 수 있습니다 #umask 0000(그러나 이는 매우 안전하지 않습니다).

답변4

GNU/Linux의 umask가 무엇인지 이해할 수 없습니다.

좋아요

그리고 anding을 사용하여 계산합니다.

나는 여러분에게 다음 공식을 제시했습니다.

mode=$(printf "%04o\n" "$(( (8#$default) & (~(8#$umask)) ))")

default=0666 및 umask=0022를 사용하면 다음을 얻을 수 있습니다.

$ printf "%04o\n" "$(( (8#0666) & (~(8#0022)) ))"
0644

Linux에서 umask는 쉘 내장 명령과 시스템 값을 변경하는 커널 함수(종종 파일 생성 마스크라고도 함, 비트 마스크라고도 함) 또는 인수가 포함된 내장 명령에 의해 호출되는 커널 함수를 모두 의미합니다.

다음과 같이 작성되어야 합니다:

Linux에서 umask는 쉘 내장 함수의 이름, 커널 함수의 이름, 프로세스 값의 이름입니다. 내장 기능과 기능 모두 프로세스 값을 변경할 수 있습니다.

  • 시스템 값이 아닙니다. 각 프로세스에는 하위 프로세스에 복사되는 umask가 있습니다.
  • 프로세스 값은 다음과 같습니다.일반적으로 명명된 파일 생성 마스크, 그것이것파일 생성 마스크.
  • 비트마스크나 마스크라고 하지 않습니다.

마스크는 마스크를 변경할 수 있는 다른 쉘을 포함하여 현재 프로세스 트리의 일부 하위 프로세스에 영향을 미칩니다. 따라서 쉘 Y에는 쉘 X의 마스크가 반드시 있을 필요는 없습니다.

이것마스크정의된 프로세스와 해당 프로세스에서 시작된 하위 프로세스에 영향을 줍니다.

  • 모든 어린이는 자신의 모습을 바꿀 수 있습니다.마스크.

파일 모드라고도 하는 파일 권한은 파일의 사용자, 그룹 및 파일에 대한 다른 사용자의 액세스 권한을 인코딩하는 12비트 집합입니다(ugo → bbbbbbbbbbbb 스트림).

파일 모드는 숫자(2진수 12자리 또는 8진수 4자리 또는 16진수 3자리)입니다.

$ bc <<<'ibase=8; mask=1644; obase=2; mask; obase=8; mask; obase=16; mask'
1110100100
1644
4A8

그러나 파일 권한은 일반적으로 4~3개의 8진수 값(예: 0644 또는 644)으로 표현됩니다.

패턴은 3으로 이루어진 숫자입니다.또는네 자리. 와 는 십진수 와
같습니다 .1230123

수학적 논리에는 "and"(∧)라고도 알려진 결합 연산이 포함됩니다. 이는 "모든 피연산자가 참인 경우에만 피연산자 집합의 합이 참"일 때 발생합니다. 이 논리를 기반으로 하는 동일한 이름의 비트 연산이 있습니다.

좋아요

Anding은 숫자를 더하는 것(x + y → z) 또는 문자열을 연결하는 것(x 및 y → xy)과 다릅니다.

좋아요

umask가 없거나 포함된 모드 설정(마스크를 통해)

모드는 항상 umask를 사용하여 설정됩니다.

일부 유틸리티(예: mkdir)는 umask를 사용하지 않고 독립 모드로 파일을 생성합니다(따라서 이러한 파일의 모드는 마스크되지 않습니다).

아니요, umask는 항상 작동합니다.

일부 다른 유틸리티는 특정 "차폐된" 권한(즉, 차단으로 인해 권한이 부여됨)이 있는 파일을 생성합니다. 예를 들어 유틸리티는 fopen() 함수를 사용하여 파일을 생성합니다. 이 함수는 먼저 마스크를 식별한 다음 이를 기반으로 권한이 있는 파일을 생성합니다.

패턴은 다음의 결과입니다.

mode=$(printf "%04o\n" "$(( (8#$default) & (~(8#$umask)) ))")

마스킹 모드는 비트별 AND로 수행되며 결과는 다음과 같습니다.

패턴은 기본값의 합입니다.부정적인마스크.

             OCTAL  BINARY        HUMAN-READABLE
umask        0222   000010010010  --w--w--w-
not-umask    7555   111101101101  N/A
default    ∧ 0666   000110110110  -rw-rw-rw-
result       0444   000100100100  -r--r--r-- 

내 이해가 충분히 정확합니까? 어떻게 0666∧0555→0444가 될 수 있나요?

개선이 필요한 몇 가지 문제가 있습니다. 유일한 anding(부정 없음)은 다음과 같습니다.

0666 → 0 011 011 011
0555 → 0 101 101 101

당신이 일치한다면수직의이 이진수는 다음 규칙을 따릅니다. - 같으면 아래에 또 다른 동일한 숫자를 쓰십시오. - 다르면 아래에 0을 쓰십시오.

0666 → 0 110 110 110
0555 → 0 101 101 101
       0 100 100 100
       0  4   4   4
0444 → 0 100 100 100

관련 정보