생성된 폴더 권한 문제: 임시 플래그

생성된 폴더 권한 문제: 임시 플래그

디렉토리 권한에 이상한 문제가 있습니다.

C++ 응용 프로그램에서 폴더를 만듭니다. mkdir( "foldername", 777 );

하지만 해당 폴더에 파일을 만들려고 하면 문제가 발생 하여 다시 fopen()돌아와서 . 그래서 확인해보니 생성된 폴더에 대해 다음과 같은 권한이 있습니다.NULLerrnoPermission denieddr----x--t

(루트 폴더에 있습니다 drwxrwxr-x)

찾아보니 이 특이한 t의미는 '일시적'이지만 그게 무슨 뜻인지 전혀 모르겠습니다.

chmod 777 foldername이는 셸에서 작동하며 속성을 로 설정 drwxrwxrwx하지만 매번 수동으로 수행할 수는 없습니다.

질문: 어떤 단서가 있나요? 내 애플리케이션이 폴더 속성을 올바르게 설정하지 않는 이유는 무엇입니까? 이 "임시" 속성의 의미는 무엇입니까?

(시스템은 우분투 12.04입니다)

답변1

t"임시"가 아닙니다. 이는 고정 비트가 설정되었음을 의미합니다. 에서 man ls:

t [표시] 고정 비트가 설정되고(모드 1000) 검색 가능하거나 실행 가능합니다. (chmod(1) 또는 Sticky(8)를 참조하십시오.)

당신이 설정했기 때문에 고정 비트가 여기에 설정되었습니다소수777(1411년 8월),8진수777(십진수 511). 0777대신 8진수를 사용하여 작성해야 합니다 777.

mode또한 to 매개변수의 최종 효과에는 mkdirumask와의 AND 연산도 포함된다는 점에 유의해야 합니다. 에서 man 2 mkdir:

매개변수 패턴은 사용할 권한을 지정합니다. 프로세스의 umask를 통해 일반적인 방법으로 수정됩니다. 생성된 디렉터리의 권한은 (mode & ~umask & 0777)입니다.

이것이 영향을 미치는 경우 패턴 매개변수를 사용 chmod하지 않는 것이 좋습니다.mkdir

최종 경고: 모드 777이 거의 완료되었습니다.안 돼요당신이 정말로하고 싶은 일. 모든 사용자에게 전역적으로 디렉터리를 여는 대신 디렉터리에 적절한 모드와 소유자/그룹을 설정하는 것이 좋습니다. 더 복잡한 규칙이 필요한 경우 ACL 사용을 고려해보세요.

답변2

777C는 10진수이기 때문이다. 07778진수로 처리되도록 사용해야 합니다 .

답변3

10진수 대신 8진수를 사용할 수도 있습니다.

mkdir( "foldername", 0777 );

둘째, 본인의 상태를 확인해야 합니다.마스크실제로 이러한 권한으로 inode를 생성할 수 있도록 설정하세요.

인용하다:

답변4

다른 좋은 답변 외에도 폴더를 만들기 umask전에 이를 설정하여 000필요한 올바른 권한을 얻을 수 있습니다.

#include <stdio.h>                                                              
#include <sys/stat.h>                                                           

int main(void) {
    mode_t old_umask;                                                                
    old_umask = umask(0);                                                                   
    mkdir("tests", 0777);
    umask(old_umask);                                                       
}

예:

$ g++ -Wall mkdir.cpp 
$ ./a.out 
$ ls -ld tests
drwxrwxrwx. 2 cuonglm cuonglm 4096 Jun 23 16:55 tests

노트

8진 모드를 사용하는 대신 다음에서 POSIX 매크로를 사용할 수 있습니다 mkdir.

mkdir("tests", S_IRWXU | S_IRWXG | S_IRWXO);

관련 정보