← Весь справочник

umask

Маска прав по умолчанию — какие биты снимаются у новых файлов и каталогов

umask — встроенная команда оболочки. Она задаёт маску битов, которые отнимаются у каждого нового файла и каталога, созданного этим процессом и его потомками. Программы обычно создают файлы с правами 666, каталоги — с 777, а маска убирает лишнее.

Синтаксис

umask [-p] [-S] [маска]

Без аргумента показывает текущую маску. Маска действует только в текущей оболочке и запущенных из неё процессах. Уже существующие файлы она не меняет.

Опции и формы записи

ЗаписьЧто делает
umaskпоказать маску числом: 0022
umask -Sпоказать, какие права остаются: u=rwx,g=rx,o=rx
umask -pпоказать в виде команды umask 0022 — удобно сохранить и потом восстановить
umask 027задать маску числом: какие биты снимать
umask u=rwx,g=rx,o=задать символически: какие права оставить (как -S, только наоборот по смыслу числа)
umask g+w / umask o-rразрешить / запретить отдельный бит относительно текущей маски

Числовая маска пишется так же, как права в chmod: цифры для владельца, группы и остальных, 4 — r, 2 — w, 1 — x.

Как считается результат

Права нового объекта = права, которые запросила программа, без битов маски (запрошенные & ~маска).

МаскаНовый файл (из 666)Новый каталог (из 777)Когда используют
022644 rw-r--r--755 rwxr-xr-xобычное значение для root
002664 rw-rw-r--775 rwxrwxr-xпользователи с личной группой: группа может писать
027640 rw-r-----750 rwxr-x---остальным — ничего
077600 rw-------700 rwx------всё только владельцу: ключи, секреты
000666 rw-rw-rw-777 rwxrwxrwxвсем всё — почти никогда не нужно

Где задаётся постоянно

МестоДля кого
~/.bashrc, ~/.profileинтерактивные оболочки одного пользователя
/etc/profile, /etc/bash.bashrcоболочки всех пользователей
UMASK в /etc/login.defsзначение при входе; применяет модуль pam_umask
UMask= в unit-файле systemd, umask в скрипте запускасервисы — профили оболочки на них не действуют

Текущую маску любого процесса видно в /proc/PID/status, строка Umask:.

Примеры

# посмотреть текущую маску в разных видах
umask
umask -S
umask -p

# закрыть новые файлы от «остальных» и проверить
umask 027
touch report.txt && mkdir data
stat -c '%a %n' report.txt data     # 640 report.txt, 750 data

# поменять маску только для одной команды — в подоболочке
(umask 077; echo 'token=…' > ~/secret.env)

# сохранить маску и вернуть её после блока команд
old=$(umask -p)
umask 077
touch private.key
$old

# сделать маску постоянной для своих интерактивных оболочек
echo 'umask 027' >> ~/.bashrc

# создать каталог с нужными правами, не трогая маску
mkdir -m 750 /srv/app/private

# какая маска у запущенного процесса
grep Umask /proc/1/status

Подводные камни

  • Это не вычитание, а снятие битов. С маской 033 файл получится 644, а не 633: бит x, которого и так не было, снимать нечего.
  • Бит x у файлов маска не добавляет. Даже с маской 000 новый файл будет 666 — сделать его исполняемым можно только chmod.
  • Символическая запись противоположна числовой. umask 027 и umask u=rwx,g=rx,o= — одно и то же: число перечисляет, что снять, буквы — что оставить.
  • Маска не трогает существующие файлы. touch по уже существующему файлу права не меняет. Перезапись через > тоже сохраняет старые права.
  • Значение живёт в процессе. umask 077 в одном терминале не влияет на другие сессии, сервисы и cron. Для постоянной настройки используй файлы из таблицы выше.
  • У разных пользователей маска разная. В Ubuntu у пользователей с личной группой (имя группы совпадает с именем пользователя) маска при входе становится 002, а у root — 022. Проверяй маску под тем пользователем, от которого создаются файлы.
  • cp и mkdir -m. cp в новый файл берёт права источника и тоже применяет маску. mkdir -m 755 выставляет права явно, маску игнорирует.
  • Не всё подчиняется маске. Программа может сама выставить права после создания (ssh-keygen делает ключ 600 при любой маске), а ACL по умолчанию на каталоге её перекрывает.

См. также

chmod · chown · acl · mkdir · proc · useradd