Когда umask () полезен? - PullRequest
       21

Когда umask () полезен?

7 голосов
/ 01 июня 2011
umask(0);

fd = open("/dev/null", O_RDWR);

Вот man 2 umask:

umask() sets the calling process’s file mode creation mask (umask) to mask & 0777.

Но для меня это не имеет смысла, так как когда мы вызываем open, мы также предоставляем параметр mode.

Так какой смысл umask?

Ответы [ 4 ]

5 голосов
/ 01 июня 2011

Маска применяется ко всем режимам, используемым в операциях с файловой системой.Из руководства open(2):

Разрешения созданного файла: (mode & ~umask)

Таким образом, одним вызовом umask вы можете влиять на режим всехсоздавать файлы.

Это обычно используется, когда программа хочет, чтобы пользователь разрешил отменять права по умолчанию для файлов / каталогов, которые она создает.Параноидальный пользователь (или root) может установить umask на 0077, что означает, что даже если вы укажете 0777 в open(2), только текущий пользователь будет иметь доступ.

5 голосов
/ 20 февраля 2015

Я знаю, что это старый вопрос, но вот мои два цента:

Разрешения объекта общей памяти

Я пытался создать объект с общей памятью:

int shm_open(const char *name, int oflag, mode_t mode); 

Полученная совместно используемая память не имеет разрешения, установленного в аргументе mode, поэтому я прочитал справочную страницу shm_open, которая привела меня к функции open man page и там написано:

Режим

определяет разрешения для использования в случае создания нового файла. Этот аргумент должен быть предоставлен, когда O_CREAT указан в флажках; если O_CREAT не указан, то режим игнорируется. Действующие разрешения изменяются с помощью umask процесса обычным способом: разрешения созданного файла: (mode & ~ umask). Обратите внимание, что этот режим применяется только к будущему доступу к вновь созданному файлу

Поэтому я попытался изменить umask с помощью:

mode_t umask(mode_t mask); 

но это тоже не сработало, поэтому после нескольких поисков Google я нашел этот Настройка разрешения документ в gnu.org

Что рекомендует:

Когда вашей программе нужно создать файл и обойти umask для получения разрешений на доступ, самый простой способ сделать это - использовать fchmod после открытия файла, а не менять umask. На самом деле, смена масок обычно производится только снарядами. Они используют функцию umask.

и с fchmod моя функция работает так, как я хотел :) ей это:

int open_signals_shmem(struct signal_shmem **shmem, int size)
{
    int fd, ret;
    void *ptr;

    *shmem = NULL;
    ret = 1;

    fd = shm_open(SIGNALS_SHMEM_NAME, O_RDWR | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO);
    if (fd == -1)
    {
        printf("error: signals shmem could not be allocated (%s, errno=%d)\n", SIGNALS_SHMEM_NAME, errno);
    }
    else
    {
        // Change permissions of shared memory, so every body can access it
        fchmod(fd, S_IRWXU | S_IRWXG | S_IRWXO);

        if (ftruncate(fd, size) == -1)
        {
            printf("error: signals shmem could not be truncated (%s, errno=%d)\n", SIGNALS_SHMEM_NAME, errno);
        }
        else
        {
            ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
            if (ptr == MAP_FAILED)
            {
                printf("error: signals shmem could not be mapped (%s, errno=%d)\n", SIGNALS_SHMEM_NAME, errno);
            }
            else
            {
                *shmem = ptr;
                ret = 0;
            }
        }
    }
    return ret;
}
1 голос
/ 01 июня 2011

Цитирую эту статью :

Цель маски - позволить пользователи влиять на разрешения дается вновь созданным файлам и каталоги. Демоны не должны позволять сами быть затронуты этим установка, потому что то, что было уместно для пользователя не обязательно будет подходит для демона.

В некоторых случаях это может быть больше удобно для umask быть установленным ненулевое значение. Это одинаково приемлемо: важный момент что демон взял под свой контроль значение, а не просто принимая то, что было дано.

0 голосов
/ 03 февраля 2017

Большинство разработчиков Mac (и, как следствие, большинство тестировщиков программного обеспечения), начиная с детства, помещают это в свои .cshrc

umask 002

Однако большинство конечных пользователей не знают о umask, поэтому, если они создадут нового пользователя на компьютере и запустят ваше приложение, вы, скорее всего, создадите кучу файлов журналов и тому подобное без групповых разрешений на чтение / запись. Затем они снова переключают пользователей, и вдруг ваше приложение не работает. По этой причине мы добавляем это во все наши приложения. Наше правило о безопасности заключается в том, что «мы хотим, чтобы пользователи могли использовать наше программное обеспечение».

#import <sys/types.h>
#import <sys/stat.h>
int main(int argc, char *argv[])
{
    // set permissions for newly created files to ug+rwX,o+rX
    umask(0002); 
...