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) | Когда используют |
|---|---|---|---|
022 | 644 rw-r--r-- | 755 rwxr-xr-x | обычное значение для root |
002 | 664 rw-rw-r-- | 775 rwxrwxr-x | пользователи с личной группой: группа может писать |
027 | 640 rw-r----- | 750 rwxr-x--- | остальным — ничего |
077 | 600 rw------- | 700 rwx------ | всё только владельцу: ключи, секреты |
000 | 666 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 по умолчанию на каталоге её перекрывает.