Проблема с разрешениями созданной папки: временный флаг

Проблема с разрешениями созданной папки: временный флаг

У меня странная проблема с правами доступа к каталогам.

В приложении C++ я создаю папку со следующим содержимым: mkdir( "foldername", 777 );

Но у меня возникла проблема при попытке создать файл в этой папке, fopen()вернулся NULLи errnoсказал мне Permission denied. Поэтому я проверил, и действительно, у меня были следующие разрешения на папку, которая была создана:dr----x--t

(Корневая папка имеет drwxrwxr-x)

Я проверил, и это необычное tозначает «временный», но я понятия не имею, что это значит.

chmod 777 foldernameиз оболочки выполняет эту работу и устанавливает атрибуты drwxrwxrwx, но я не могу делать это вручную каждый раз.

Вопрос: есть ли какие-нибудь подсказки, что происходит? Почему мое приложение не устанавливает правильно атрибуты папок? Что означает этот атрибут 'temporary'?

(система — Ubuntu 12.04)

решение1

tне "временный", это означает, что установлен липкий бит. Из man ls:

t [означает, что] установлен бит sticky (режим 1000), и файл доступен для поиска или выполнения. (См. chmod(1) или sticky(8).)

Здесь установлен липкий бит, потому что вы установилидесятичная дробь777 (восьмеричное 1411), невосьмеричный777 (десятичное 511). Вам нужно написать, 0777чтобы использовать восьмеричное, а не 777.

Вам также следует отметить, что конечный эффект аргумента modeтакже mkdirвключает в себя операцию AND против вашего umask. Из man 2 mkdir:

Аргумент mode определяет разрешения для использования. Он модифицируется umask процесса обычным образом: разрешения созданного каталога — (mode & ~umask & 0777).

Я бы посоветовал вам, если это касается вас, использовать аргумент mode вместо этого chmod.mkdir

Последнее предупреждение: режим 777 почтиникогдачто вы действительно хотите сделать. Вместо того, чтобы открывать каталог глобально для всех пользователей, рассмотрите возможность установки надлежащего режима и владельца/группы для каталога. Если вам нужны более сложные правила, рассмотрите возможность использования ACL.

решение2

777для C это десятичное число. Вы должны использовать 0777так, чтобы оно рассматривалось как восьмеричное.

решение3

Вероятно, вы захотите использовать восьмеричное число для режима, а не десятичное:

mkdir( "foldername", 0777 );

Во-вторых, вам нужно проверить свойumaskнастройки, чтобы убедиться, что вы действительно можете создать 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

Примечание

Вместо использования восьмеричного режима вы можете использовать макросы POSIX в mkdir:

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

Связанный контент