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.