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

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

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

C++ 앱 내에서 다음을 사용하여 폴더를 만듭니다. mkdir( "foldername", 777 );

그런데 해당 폴더에 파일을 만들려고 할 때 문제가 발생하여 을 fopen()반환 NULL하고 errno나에게 말했습니다 Permission denied. 그래서 확인해보니 생성된 폴더에 대해 다음과 같은 권한이 있었습니다.dr----x--t

(루트 폴더에는 drwxrwxr-x)

확인해 보니 이 특이한 것은 t"일시적"을 의미하지만 그것이 무엇을 의미하는지 전혀 알 수 없습니다.

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

질문: 무슨 일이 일어나고 있는지에 대한 단서가 있나요? 내 앱이 폴더 속성을 올바르게 설정하지 않는 이유는 무엇입니까? 이 '임시' 속성의 의미는 무엇입니까?

(시스템은 Ubuntu 12.04입니다)

답변1

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

t 고정 비트가 설정되어 있고(모드 1000) 검색 가능하거나 실행 가능하다는 것을 의미합니다. (chmod(1) 또는 끈적끈적(8)을 참조하십시오.)

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

mode또한 인수 의 궁극적인 효과에는 mkdirumask에 대한 ANDing도 포함된다는 점에 유의해야 합니다 . 에서 man 2 mkdir:

인수 모드는 사용할 권한을 지정합니다. 일반적인 방법으로 프로세스의 umask에 의해 수정됩니다. 생성된 디렉터리의 권한은 (mode & ~umask & 0777)입니다.

이것이 당신에게 영향을 준다면, mode 인수를 사용하는 대신에 chmod당신 에게 제안하고 싶습니다 .mkdir

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

답변2

777C의 경우 십진수입니다. 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);

관련 정보