Как работает umask
Когда программа создаёт файл, она запрашивает режим — почти всегда 666 (rw-rw-rw-) для файлов и 777 для каталогов. Затем ядро сбрасывает каждый бит, установленный в umask процесса. С обычной 022 убираются биты записи для группы и остальных: файлы становятся 644, каталоги — 755. С 077 для группы и остальных убирается всё: 600 и 700. Маска может только отнимать права, но не добавлять; файл никогда не получит выполнение от umask, потому что у 666 его и не было.
Арифметика здесь — mode & ~umask, побитовое И с инвертированной маской, а не вычитание, поэтому umask 027 на 666 даёт 640, а не 639.
Распространённые значения
| umask | Файлы | Каталоги | Для чего |
|---|---|---|---|
| 022 | 644 | 755 | По умолчанию в большинстве дистрибутивов; остальные могут читать. |
| 002 | 664 | 775 | Debian/Ubuntu для пользователей с личной группой; члены группы могут писать. |
| 077 | 600 | 700 | Приватно по умолчанию: серверы, домашние каталоги с секретами. |
| 027 | 640 | 750 | Группа может читать, остальные — ничего; распространённая база для hardening (CIS). |
Где она задаётся
- Shell:
umaskвыводит её,umask 027задаёт для сессии; поместите её в~/.profileили/etc/profile.umask -Sпоказывает её в символьной форме. - Вход в систему:
/etc/login.defs(UMASK) иpam_umaskзадают значение до запуска оболочки;/etc/profileв Debian выводит его из того, есть ли у пользователя личная группа. - Сервисы systemd:
UMask=0077в секции[Service]; сервисы не читают профили оболочки. - cron: задания выполняются с
022независимо от настроек оболочки пользователя; задайте её внутри скрипта. - Docker: по умолчанию в контейнере
022; измените её в entrypoint или черезumaskв команде.
Вопросы
Почему мои новые файлы получают 644, когда мне нужно 664?
Ваша umask — 022. Задайте umask 002 (и убедитесь, что группа каталога — та, что вам нужна, с битом setgid на каталоге, чтобы новые файлы её наследовали).
Влияет ли umask на chmod?
Нет. chmod задаёт точные биты. umask применяется только при создании файла без явного режима, то есть почти всегда.
Почему каталог получает выполнение, а файл нет?
Каталоги создаются с 777 до применения маски, файлы — с 666. Выполнение на каталоге означает «можно войти»; файлам нужен явный chmod +x.
Отличается ли четырёхзначная umask?
Ведущий 0 (0022) — просто восьмеричная запись. Первая цифра маскировала бы setuid/setgid/sticky, которые создающие процессы никогда не запрашивают, так что на практике эффекта нет.