디렉토리 권한에 이상한 문제가 있습니다.
C++ 응용 프로그램에서 폴더를 만듭니다.
mkdir( "foldername", 777 );
하지만 해당 폴더에 파일을 만들려고 하면 문제가 발생 하여 다시 fopen()
돌아와서 . 그래서 확인해보니 생성된 폴더에 대해 다음과 같은 권한이 있습니다.NULL
errno
Permission denied
dr----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 매개변수의 최종 효과에는 mkdir
umask와의 AND 연산도 포함된다는 점에 유의해야 합니다. 에서 man 2 mkdir
:
매개변수 패턴은 사용할 권한을 지정합니다. 프로세스의 umask를 통해 일반적인 방법으로 수정됩니다. 생성된 디렉터리의 권한은 (mode & ~umask & 0777)입니다.
이것이 영향을 미치는 경우 패턴 매개변수를 사용 chmod
하지 않는 것이 좋습니다.mkdir
최종 경고: 모드 777이 거의 완료되었습니다.안 돼요당신이 정말로하고 싶은 일. 모든 사용자에게 전역적으로 디렉터리를 여는 대신 디렉터리에 적절한 모드와 소유자/그룹을 설정하는 것이 좋습니다. 더 복잡한 규칙이 필요한 경우 ACL 사용을 고려해보세요.
답변2
777
C는 10진수이기 때문이다. 0777
8진수로 처리되도록 사용해야 합니다 .
답변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);