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


12

내가 알다시피, umask를 사용할 때 파일에 부여 할 수있는 최고 권한은 666 umask 0000입니다. 그것은 내가 아는 모든 시스템에서 666 인 것처럼 보이는 기본 파일 생성 권한 때문입니다.

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


어떤 시스템입니까? umask내가 만난 유일한 것은 항상 0022 였고 기본 권한 644를
만들었습니다

당신은 오해하지 않았습니다. Umask는 기본 파일 권한 인 666을 사용하고 자체 값을 뺍니다 (시스템의 경우 0022). 따라서 설정할 수있는 가장 많은 권한은 umask 0000여전히 파일 권한 666으로 제한됩니다. (그러나 폴더는 777을 사용합니다)
Peter

잡았다. 이제 이것은 좋은 질문입니다.
manatwork

2
파일 내용을보기 위해 실행 권한이 필요하지 않습니다. 이것은 디렉토리에 대한 것이므로 디렉토리가 기본적으로 실행 권한으로 작성됩니다.
Joseph R.

1
나는 "chmod"에 액세스하지 않으면 파일을 실행할 수 없다고 생각한다. umask 0000은 0666으로 파일을 생성하고 0777로 디렉토리를 생성합니다. [이것은 보안 측면에서 상당히 끔찍한 기본 설정입니다!]
Olivier Dulac

답변:


10

내가 알 수있는 한, 이것은 표준 유틸리티에 하드 코딩되어 있습니다. 나는 새로운 파일 생성과 새로운 디렉토리 생성을 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_IRWXUGO의해 수정 된 (읽기 : 0777)로 설정하십시오 umask_value.

touch.c 더 명확합니다.

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

즉, 모든 사람에게 읽기 및 쓰기 권한을 부여하십시오 (읽기 : 0666) umask. 물론 파일 작성 프로세스 에 의해 수정 될 것 입니다.

이 방법은 프로그래밍 방식으로 만 해결할 수 있습니다. 즉, C 프로그램 내에서 파일을 작성하는 동안 시스템을 직접 호출하거나 저수준 시스템 콜을 할 수있는 언어 내에서 파일을 작성하는 동안 (예 : Perl 's sysopenunder perldoc -f sysopen).


네 말이 맞아, 나는 사고를 원하지 않는다. 그러나 그것을 바꿀 방법이 없다면 끔찍합니다! 표준 값은 777이어야합니다 . 그리고 우리는 umask file및 을 필요 로 umask dir합니다. 두 가지 다른 기본값을 설정하고 잘 설정하십시오. 그러나 지금은 exec perms로 파일을 만들 수있는 방법이 없습니다.
피터

1
@PeterI 글쎄, 생성시 디렉토리의 모드를 지정 mkdir(1)하는 -m스위치를 제공합니다 . 그러나 파일 open(2)을 사용하는 경우 파일을 만들 때 syscall을 사용하므로 파일을 만드는 데 사용하는 도구는 모드 비트를 전달하는 데 사용되는 도구이므로 open문제에 대해 언급하지 않습니다. install(1)기본적으로 파일을 새 위치에 복사하고 실행 비트를 설정하지만 생성시 여전히 발생하지 않습니다.
Joseph R.

당신은, 말을 touch예를 들어 올바른 값을 설정하는 책임이있다. 값을 어디에 저장하는지 알고 있습니까? 그들은 시스템 전체에 설정되어있을 수 있습니다. 내가 자유롭게 쉬고 싶기 때문에 ;)
Peter

@PeterI 업데이트 된 답변을 참조하십시오.
Joseph R.

1
@PeterI 나는 대답을 다시 업데이트했다. C 또는 Perl과 같은 다른 언어에서 직접 시스템 호출을 할 수 있습니다.
Joseph R.

6

먼저 전역 기본값이 없으며 권한은 파일을 만드는 응용 프로그램에 따라 다릅니다. 예를 들어,이 작은 C 프로그램은 umask가 0000 인 경우 권한 0777 인 파일 '/ tmp / foo'를 만듭니다 (어쨌든 권한은 0777 & ~ umask 임).

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

많은 응용 프로그램에서 권한이 0666 인 파일을 만듭니다. 두 가지 이유가 있습니다.

  1. 보안 : 임의의 파일을 실행하기를 원하지 않습니다.
  2. 편의성 : 대부분의 파일은 실행 파일 일 필요는 없습니다. 엄청나게 많은 다른 파일에서 설정을 해제하는 것보다 일부 파일에서 실행 파일을 설정하는 것이 더 쉽습니다. 물론, umask 0133은 이것을 해결하지만 아무것도 얻지 못하며 원하는 경우에도 프로그램이 실행 파일을 만들 수 없습니다.

1
보안상의 이유로 x (execute) 비트를 설정하지 않고 파일이 작성됩니다. 파일 [cw]의 우연한 실행은 "나쁜 것"(tm) 일 수 있습니다. chmod 프로그램은 필요에 따라 권한 비트를 재설정 할 수있는 기능을 제공합니다.
ChuckCottrill
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.