umask가 파일의 실행 권한을 변경하지 않는 이유는 무엇입니까? [복사]

umask가 파일의 실행 권한을 변경하지 않는 이유는 무엇입니까? [복사]

으로 변경하면 umask권한 이 있는 텍스트 파일을 0000만들고 싶습니다 rwxrwxrwx(umask에 대한 이해에서"중복 가능성" 질문에서 언급했듯이) 그러나 이것을 시도하면 다음과 같은 결과가 나타납니다.

$ umask 0000
$ touch /tmp/new.txt
$ ls -ld /tmp/new.txt 
-rw-rw-rw-  1 alanstorm  wheel  0 Jun  2 10:52 /tmp/new.txt

rw-rw-rw-즉, 실행 권한이 생략되고 for 파일(디렉토리는 ) 로 끝납니다 rwxrwxrwx. 나는 로컬 OS X 시스템, 공유 호스트의 오래된 BSD 시스템, linode에서 실행되는 Linux 서버에서 이것을 시도했습니다.

왜 이런거야? 내 이해는 umask가 권한의 최종 중재자라는 것입니다. 이것을 올바르게 이해하고 있습니까? 그렇다면 UNIX 시스템의 파일에 대한 기본 권한에 또 어떤 영향을 미치나요?

답변1

umask는 규정이 아닌 빼기입니다. 기본적으로 umask에 설정된 권한 비트는 프로그램 지정 모드에서 제거되지만 umask는 권한 비트를 추가할 수 없습니다.touch 기본값은 모드 666을 지정합니다.(링크는 GNU 구현을 가리키지만 그 외에는 동일한 방식으로 동작합니다.POSIX에 의해 지정됨umask), 따라서 결과 파일은 current: 에 의해 차단 됩니다 . 귀하의 경우 umask아무것도 차단되지 않았기 때문에 결과는 666입니다.

파일이나 디렉토리의 모드는 일반적으로 이를 생성한 프로그램에 의해 지정됩니다. 관련된 대부분의 시스템 호출은 모드(예를 들어 open(2),creat(2),mkdir(2)둘 다 모드 매개변수를 가지고 있지만;fopen(2)아니요, 모드 666을 사용합니다). 상위 디렉터리가 기본 ACL을 지정하지 않는 한, 호출 시 프로세스의 umask는 지정된 모드를 마스크하는 데 사용됩니다(비트 단위 mode & ~umask, 효과적으로 모드에서 umask의 각 권한 집합을 뺍니다). 증가했습니다. 상위 디렉터리가 기본 ACL을 지정하는 경우 해당 기본 ACL은 umask 대신 사용됩니다. 결과 파일 권한은 작성자가 지정한 패턴과 기본 ACL이 지정한 패턴의 교차점입니다.

POSIX 지정기본 모드는 파일의 경우 666이고 디렉터리의 경우 777이어야 합니다.문서기본(, POSIX를 읽을 때 프로그램이나 함수에서 파일이나 디렉터리의 모드를 지정하지 않으면 기본값이 적용되며 시스템에서 적용되지 않습니다. 일반적으로 이는 POSIX 호환 도구가 파일을 생성할 때 모드 666을 지정하고 디렉터리를 생성할 때 모드 777을 지정하고 거기에서 umask를 뺍니다. 그러나 다른 모드를 사용하거나 무시해야 하는 정당한 이유가 많기 때문에 시스템에서는 이를 강제할 수 없습니다. 우마스크:

  • 실행 파일을 생성하는 컴파일러는 실행 비트가 설정된 파일을 생성하려고 시도합니다(비록 umask를 적용하긴 하지만).
  • chmod(1)분명히 모드는 인수에 따라 지정되며 "who"가 지정되거나 모드가 완전히 지정되면 umask를 무시합니다(따라서 chmod o+xumask는 umask와 동일하게 무시되지만 chmod 777umask chmod +w가 적용됩니다).
  • 권한 보존 도구는 적절한 모드를 적용하고 umask를 무시합니다.예를 들어 cp -p, tar -p;
  • 모드를 완전히 지정하는 인수를 취하는 도구는 umask: install --mode, mknod -m... 도 무시합니다.

따라서 umask는 기본적으로 설정되는 것을 보고 싶지 않은 권한 비트를 지정하는 것으로 생각해야 하지만 이는 단지 요청일 뿐이라는 점에 유의하세요. 설정된 것을 보려는 권한 비트를 지정하는 데 사용할 수 없으며 설정되지 않은 것을 보려는 권한 비트를 지정하는 데만 사용할 수 있습니다. 또한 모든 프로세스는 다음을 사용하여 umask를 변경할 수 있습니다.umask(2)시스템콜! 시스템 umask(2)호출은 프로세스가 현재 umask(상위 프로세스에서 상속됨)를 찾는 유일한 POSIX 정의 방법이기도 합니다. Linux에서는 커널 4.7부터 다음을 통해 프로세스의 현재 umask를 볼 수 있습니다.Umask에서 찾고/proc/${pid}/status.

setuid(완전성을 기하기 위해 고정 비트의 동작 setgid은 시스템에 따라 다르며 NFS와 같은 원격 파일 시스템은 자체 변경 사항을 추가할 수 있다는 점을 언급하겠습니다 .)

답변2

파일 권한 계산 공식:

default_mode & ~umask

(O_CREAT표지판에 대한 설명을 읽어보세요)

POSIX에서도 지정됨의 경우 파일의 기본 모드는 S_IROTH | S_IWOTH | S_IRGRP | S_IWGRP | S_IRUSR | S_IWUSR또는 이고 666, 디렉터리의 경우 기본 모드는 응용 프로그램에서 지정하지 않은 경우 S_IRWXU | S_IRWXG | S_IRWXO또는 입니다.777

파일의 기본 모드에서 실행 비트가 이면 0비트별 AND는 항상 is 로 수행되기 때문입니다 &.00

그렇기 때문에 의 값에 관계없이 umask응용 프로그램이 실행 비트를 지정하지 않으면 새로 생성된 파일의 실행 비트가 꺼집니다.

답변3

위의 설명이 아주 좋습니다. umask 및 권한에 대한 명확한 설명을 제공합니다. 좀 더 실용적입니다. "터치"가 제공하는 권한이 무엇인지 알고 싶다면

" 추적 터치 /tmp/new.txt "

"new.txt"를 생성하는 데 사용된 터치 시스템 호출을 관찰하세요.

예를 들어. "strace touch /tmp/new.txt"의 o/p (... -> 일부 콘텐츠)

...

open("/tmp/new.txt", O_WRONLY | O_CREAT | O_NOCTTY | O_NONBLOCK, 0666) = 3

...

참고로 스트레스

관련 정보