У меня странная проблема с правами доступа к каталогам.
В приложении 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 с этими правами.
Использованная литература:
Страница руководства mkdir:http://man7.org/linux/man-pages/man2/mkdir.2.html
решение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);