← Назад к вопросам

Почему при создании файла права равны 666?

1.6 Junior🔥 121 комментариев
#Linux и администрирование

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Почему файлы по умолчанию создаются с правами 666?

Это отличный и довольно фундаментальный вопрос, который касается ядра взаимодействия пользователя, процессов и операционной системы, в частности, Linux/UNIX-подобных систем.

Короткий ответ: Файлы создаются с маской прав 0666 (чтение и запись для всех: владельца, группы и остальных) не потому, что это абсолютное значение, а потому, что это значение по умолчанию в ядре ОС, которое затем модифицируется текущей umask (user mask) процесса для получения итоговых прав.

Давайте разберем этот механизм детально, так как он лежит в основе управления безопасностью и доступом в UNIX.

Механизм создания файлов и роль umask

  1. Системный вызов и значение по умолчанию: Когда программа (например, touch, текстовый редактор, компилятор) создает новый обычный файл через системный вызов open() с флагом O_CREAT, она может (но не обязана) передать третий аргумент — mode. Этот аргумент указывает желаемые права доступа. Если программа явно не задает права, или если используется стандартная библиотека C (fopen()), часто используются разумные умолчания. Однако глубоко в ядре системы существует базовое значение, равное 0666. Это максимально "открытые" права: чтение и запись для всех категорий пользователей. Отсутствие исполнительного бита (x) логично — свежесозданный текстовый файл или данные не являются программой.

  2. umask — маска пользовательских прав: Но если бы каждый файл создавался с правами rw-rw-rw-, это была бы катастрофа для безопасности. Любой пользователь системы мог бы читать и изменять ваши временные файлы, логи и т.д. Здесь в игру вступает umask — это маска процесса, выраженная в восьмеричном формате. Ее значение вычитается из базовых прав.

    **Принцип работы `umask`:** Это маска на **запрет** прав. Биты, установленные в `umask`, будут "сняты" у создаваемого файла или директории.
    *   Стандартная `umask` для многих дистрибутивов — `0002`.
    *   База: `0666` (`rw-rw-rw-`)
    *   `umask`: `0002` (-------w-)
    *   Итог: `0664` (`rw-rw-r--`) // Право на запись для "остальных" (others) запрещено.

    Другой распространенный пример — более строгая `umask` `0022`:
    *   База: `0666` (`rw-rw-rw-`)
    *   `umask`: `0022` (----w--w-)
    *   Итог: `0644` (`rw-r--r--`) // Права на запись для группы и остальных запрещены.

Практическая демонстрация

Давайте посмотрим, как это работает в командной строке:

# Проверяем текущую umask
$ umask
0002

# Создаем файл с помощью touch, который не задает права явно
$ touch myfile_default.txt
$ ls -l myfile_default.txt
-rw-rw-r-- 1 user user 0 May 27 10:00 myfile_default.txt # Права 0664

# Меняем umask на более строгую
$ umask 0022
$ touch myfile_strict.txt
$ ls -l myfile_strict.txt
-rw-r--r-- 1 user user 0 May 27 Указываем права явно. Команда `install` или использование `chmod` в скрипте.
$ install -m 755 my_script.sh /usr/local/bin/ # Создаст файл с правами 0755, несмотря на umask

# Использование системного вызова open() в C с явными правами
#include <fcntl.h>
#include <sys/stat.h>
int fd = open("newfile", O_CREAT | O_WRONLY, 0640); // Права rw-r---- будут установлены независимо от umask

Особый случай: директории

Для директорий базовое значение другое — 0777 (rwxrwxrwx). Это связано с тем, что для доступа к содержимому директории (список файлов, cd) необходим исполнительный (x) бит. Итоговые права директории также рассчитываются как 0777 & ~umask.

$ umask 0022
$ mkdir new_dir
$ ls -ld new_dir
drwxr-xr-x 2 user user 4096 May 27 10:05 new_dir # Права 0755 (0777 - 0022)

Вывод и значение для DevOps

Понимание этого механизма критически важно для DevOps. Так как мы активно работаем с автоматизацией (скрипты, Ansible, CI/CD), сборкой приложений и управлением конфигурациями.

  • Безопасность: Неправильная umask в скрипте или сервисе может привести к созданию файлов, доступных на запись другим пользователям (например, временных файлов веб-сервера), что является уязвимостью.
  • Воспроизводимость: На разных системах могут быть установлены разные значения umask по умолчанию (в /etc/profile, ~/.bashrc). Если ваш скрипт или программа расчета прав надеется на умолчания, поведение может отличаться. Всегда явно задавайте необходимые права (chmod) для критичных файлов в скриптах развертывания.
  • Отладка: Если файлы или директории создаются с неожиданными правами, первое, что нужно проверить — значение umask в контексте выполняющегося процесса (например, из-под какого пользователя работает cron или systemd-сервис).

Таким образом, число 666 — это не финальный приговор, а отправная точка в гибкой схеме управления правами UNIX, где umask выступает в роли основного механизма обеспечения безопасности по умолчанию, а явное задание прав (chmod) — как инструмент точного контроля.

Почему при создании файла права равны 666? | PrepBro