Новые файлы недоступны коллеге: как umask меняет права при создании

Вчера каталог отчётов читала вся команда. Сегодня новый файл видит только автор, хотя права родительского каталога никто не менял. Часто причина находится в процессе, который создал файл: у него другая маска umask.

Обычный новый файл создаётся с запрошенными правами, из которых маска убирает разрешения. Для привычного запроса 0666 маска 0027 оставляет 0640: владелец читает и пишет, группа читает, остальные не получают доступа. Для каталога исходный запрос обычно 0777, и та же маска оставляет 0750.

Посчитаем маску, затем проверим создание

Ниже программа вычисляет результат побитовыми операциями. Она помогает понять правило независимо от текущей файловой системы. Это важно на Windows: переносимые Python-биты режима там не воспроизводят все правила Linux.

def permissions(requested, mask):
    return requested & (~mask & 0o777)

for mask in (0o027, 0o007, 0o077):
    file_mode = permissions(0o666, mask)
    directory_mode = permissions(0o777, mask)
    print(f"{mask:04o}: file={file_mode:04o} dir={directory_mode:04o}")
assert permissions(0o666, 0o027) == 0o640
assert permissions(0o777, 0o007) == 0o770

Получатся пары 0640/0750, 0660/0770 и 0600/0700. Маска не добавляет права исполнения обычному файлу: исходный запрос 0666 их не содержит. Поэтому простой совет «поставить ноль во всех разрядах» не превращает текстовый файл в исполняемый.

На Linux подтвердите наблюдение в отдельном временном каталоге: посмотрите umask, создайте обычный файл и каталог, затем вызовите stat -c '%a %n'. Меняйте маску внутри подоболочки, чтобы эксперимент не затронул остальной терминал. Для реального сервиса ищите маску его процесса или настройку UMask в unit systemd.

Групповое чтение требует правильной группы

Режим 0640 даёт чтение группе файла, а не всем участникам вашей команды вообще. Сравните stat с id коллеги. Если файл принадлежит неподходящей группе, изменение umask не решит доступ. В совместном каталоге часто используют setgid-бит каталога для наследования группы и согласованную маску для создающих процессов.

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

Когда umask не объясняет результат

Приложение может запросить режим 0600 само. Маска умеет только убирать биты, поэтому из такого запроса не получится 0640. Кроме того, программа может изменить режим после создания, а ACL каталога задаёт дополнительные правила. Сначала воспроизведите создание тем же процессом, затем смотрите итоговые владельца, режим и ACL.

Уже существующие файлы не меняются от нового umask. Поэтому проверка только старого отчёта создаёт ложное впечатление исправления. Создайте новую версию, откройте её от имени реального читателя и убедитесь, что автор сохранил нужное право записи. Так можно настроить совместный каталог без раздачи доступа всем пользователям машины.

Работа с пользователями, файлами и процессами становится понятнее через практику терминала. В курсе Bash Linux + Git вы разберёте Linux-команды и автоматизацию скриптами. Изучите программу и научитесь находить, какой именно процесс создаёт недоступные файлы.

Продолжить на практике