#c #linux #mkdir
#c #linux #mkdir
Вопрос:
У меня есть часть кода
if(mkdir(name, 0666/*permission*/) == -1)
{
printf("ERROR");
return ERROR;
}
Вновь созданный каталог выглядит следующим образом
drw-rw-r-- 2 atg atg 4096 Oct 3 17:54 f,,,
Но я хотел, чтобы у него были разрешения на запись для других, т.Е. drw-rw-rw-
.
Когда я пытаюсь войти в каталог, используя cd
, я получаю
bash: cd: f: отказано в разрешении
Если я создам его с разрешениями на выполнение, например:
if(mkdir(name, 0777/*permission*/) == -1)
{
printf("ERROR");
return ERROR;
}
Я получаю
drwxrwxr-x 2 atg atg 4096 Oct 3 18:00 f
Я могу войти cd
в каталог с.
С
if(mkdir(name, 0777/*permission*/) == -1)
{
printf("ERROR");
return ERROR;
}
Я получаю
dr-xr-xr-x 2 atg atg 4096 3 октября 18:02 f
Почему не установлено разрешение на запись?
Я использовал chmod как
case RD_WRT_DATA:
permission = 0666;
break;
if(mkdir(name, permission) == -1)
{
printf("ERROR");
return ERROR;
}
else
{
return SUCCESS;
}
if(chmod(name, permission) == -1)
{
printf("ERROR");
return ERROR;
}
else
{
return SUCCESS;
}
проверено umask:
grep UMASK /etc/login.defs
UMASK 022
все еще разрешения, которые я получаю, ->
drw-rw-r-- 2 atg atg 4096 Oct 3 18:15 f
Должен ли я изменить umask? Есть ли какие-либо изменения без этого?
Комментарии:
1. но требуется разрешение
drw-rw-rw-
— вы уверены? Это означает, что никто не может получить доступ к чему-либо в каталоге. Вам нужноx
получить доступ к содержимому каталога (если вы знаете, что там) иr
перечислить содержимое, ноr
безx
него практически бесполезно2. Вы должны использовать
perror(name);
(вместоprintf("ERROR");
….) для обработки ошибок
Ответ №1:
Каталог без исполняемых разрешений не может быть указан.
В дополнение к настройке umask(0)
, создайте каталог с режимом 0777
.
Ответ №2:
Значение процесса umask
маскирует разрешения на запись для лиц, не являющихся владельцами. См. https://en.wikipedia.org/wiki/Umask:
В вычислительной технике umask — это команда, которая определяет настройки маски, управляющей тем, как устанавливаются права доступа к файлам для вновь созданных файлов. Он также может ссылаться на функцию, которая устанавливает маску, или он может ссылаться на саму маску, которая формально известна как маска создания режима файла. Маска представляет собой группировку битов, каждый из которых ограничивает то, как устанавливается соответствующее разрешение для вновь созданных файлов.
Значение umask является глобальным для процесса. Таким образом, вызов umask()
повлияет на все потоки, запущенные в процессе, а также на все дочерние процессы, созданные после изменения значения.
Чтобы безопасно обеспечить права доступа к файлам или каталогам, не влияя на остальную часть процесса, вам необходимо явно задать разрешение с помощью chmod()
:
int rc;
mode_t mode = 0777;
rc = mkdir( name, mode );
if ( 0 == rc )
{
rc = chmod( name, mode );
}
.
.
.
Если вы действительно хотите внести изменения umask()
, гораздо лучше установить для него то, что вам нужно, а затем восстановить его позже:
mode_t old_mask = umask( 0 );
int rc = mkdir( name, 0777 );
umask( old_mask );
Комментарии:
1. Обратите внимание, что изменение и восстановление umask по-прежнему небезопасно в многопоточных приложениях, поскольку другие потоки будут использовать измененную umask в промежутке между ними.
Ответ №3:
Попробуйте вызвать
umask(0);
перед mkdir
, поскольку umask
влияет на разрешения вновь созданного каталога.
Ответ №4:
Большинство дистрибутивов Linux используют default umask = 022
. Это означает, что при вызове mkdir
с разрешениями 777
вы получаете разрешения : 777(asked) - 022(umask) = 0755(actual)
. На самом деле, umask
это то, какие разрешения должны быть удалены из вновь созданных файлов / каталогов, где каждая восьмеричная цифра означает:
0 : read, write and execute
1 : read and write
2 : read and execute
3 : read only
4 : write and execute
5 : write only
6 : execute only
7 : nothing
Сделайте umask(0)
, и вы получите запрошенные разрешения 777
для созданного каталога.