내가 찾은 한, umask를 사용할 때 파일에 부여할 수 있는 최고 권한은 666입니다. umask 0000
이는 내가 아는 모든 시스템에서 기본 파일 생성 권한이 666으로 설정되어 있기 때문입니다 .
파일의 내용을 표시하려면 실행 권한이 필요하다는 것을 알고 있습니다.
그런데 왜 기본 파일 생성 권한을 666으로 제한하려는 걸까요?
답변1
내가 아는 한 이것은 표준 유틸리티에 하드코딩되어 있습니다. 새 파일과 새 디렉터리를 strace
모두 만들었 습니다.touch
mkdir
추적 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
by 로 설정됩니다 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 권한으로 파일을 생성합니다. 여기에는 두 가지 이유가 있습니다.
- 보안: 임의의 파일이 실행되는 것을 원하지 않습니다.
- 편의성: 대부분의 파일은 실행 가능하지 않아도 됩니다. 많은 수의 다른 파일에 대해 실행 비트를 설정 해제하는 것보다 선택한 소수의 파일에 실행 비트를 설정하는 것이 훨씬 쉽습니다. 물론 umask 0133은 이 문제를 해결할 수 있지만 아무 것도 얻지 못하고 원하더라도 프로그램이 실행 파일을 생성하도록 만들 수 없습니다.