기본 파일 생성 권한이 666인 이유는 무엇입니까?

기본 파일 생성 권한이 666인 이유는 무엇입니까?

내가 찾은 한, umask를 사용할 때 파일에 부여할 수 있는 최고 권한은 666입니다. umask 0000이는 내가 아는 모든 시스템에서 기본 파일 생성 권한이 666으로 설정되어 있기 때문입니다 .

파일의 내용을 표시하려면 실행 권한이 필요하다는 것을 알고 있습니다.
그런데 왜 기본 파일 생성 권한을 666으로 제한하려는 걸까요?

답변1

내가 아는 한 이것은 표준 유틸리티에 하드코딩되어 있습니다. 새 파일과 새 디렉터리를 strace모두 만들었 습니다.touchmkdir

추적 touch결과는 다음과 같습니다.

open("newfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3

그리고 mkdir추적 결과는 다음과 같습니다.

mkdir("newdir", 0777)                   = 0

C의 파일/디렉토리 생성 프로세스에 대한 코드가 부족하기 때문에 기본 권한을 수정하는 방법이 없습니다. 그러나 기본적으로 파일을 실행 가능하게 만들지 않는 것이 합리적이라고 생각됩니다. 임의의 텍스트가 실수로 쉘 명령으로 잘못 해석되는 것을 원하지 않습니다.

고쳐 쓰다

표준 유틸리티에 권한 비트를 하드코딩하는 방법에 대한 예를 제공합니다. 다음은 무엇 보다도 coreutils및 의 소스 코드를 포함하는 패키지의 두 파일 중 일부 관련 행 입니다 .touch(1)mkdir(1)

mkdir.c:

if (specified_mode)
   {   
     struct mode_change *change = mode_compile (specified_mode);
     if (!change)
       error (EXIT_FAILURE, 0, _("invalid mode %s"),
              quote (specified_mode));
     options.mode = mode_adjust (S_IRWXUGO, true, umask_value, change,
                                  &options.mode_bits);
     free (change);
   }   
  else
    options.mode = S_IRWXUGO & ~umask_value;
}   

즉, 모드를 지정하지 않으면 S_IRWXUGOby 로 설정됩니다 umask_value.

touch.c더욱 명확해졌습니다.

int default_permissions =
  S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;

즉, 모든 사람에게 읽기 및 쓰기 권한(읽기: 0666)을 부여합니다. umask이는 물론 파일 생성 프로세스에 의해 수정됩니다.

이 문제는 프로그래밍 방식으로만 해결할 수 있습니다. 즉, C 프로그램에서 파일을 생성할 때 시스템 호출을 직접 만들거나 낮은 수준의 시스템 호출을 허용하는 언어에서 파일을 생성할 수 있습니다(참조). , 예를 들어 예 sysopen) perldoc -f sysopen)의 Perl입니다.

답변2

첫째, 전역 기본값이 없으며 권한은 파일을 생성한 응용 프로그램에 따라 다릅니다. 예를 들어, umask가 0000이면 이 작은 C 프로그램은 권한이 0777인 "/tmp/foo" 파일을 생성합니다(어쨌든 권한은 0777 & ~umask입니다).

int main() 
{
   creat("/tmp/foo", 0777);
   return 0;
}

즉, 많은 응용 프로그램은 0666 권한으로 파일을 생성합니다. 여기에는 두 가지 이유가 있습니다.

  1. 보안: 임의의 파일이 실행되는 것을 원하지 않습니다.
  2. 편의성: 대부분의 파일은 실행 가능하지 않아도 됩니다. 많은 수의 다른 파일에 대해 실행 비트를 설정 해제하는 것보다 선택한 소수의 파일에 실행 비트를 설정하는 것이 훨씬 쉽습니다. 물론 umask 0133은 이 문제를 해결할 수 있지만 아무 것도 얻지 못하고 원하더라도 프로그램이 실행 파일을 생성하도록 만들 수 없습니다.

관련 정보