Команда umask в Linux

Права доступа к файлам и папкам в Linux – это часть стандарта POSIX. В связи с этим нам доступен ряд команд, таких как chmod, chown, chgrp и umask. В этой статье будет рассмотрена команда umask Linux. Эта команда задаёт набор прав, которые будут применены к файлам и директориям при их создании.

Настройки заданные командой будут действовать только для новых файлов. В этой статье будет рассмотрена команда umask Linux, её основные параметры, а также способы применения их на практике.

Права доступа в Linux

Поскольку команда umask используется для настройки прав по умолчанию, надо сначала разобраться какие есть права. Как было сказано ранее, Linux следует стандартам POSIX, что делает его UNIX-совместимой операционной системой. В общем случае права доступа в UNIX разбиты на три категории:

  • u (user) – пользователь.
  • g (group) – группа.
  • o (other) – остальные пользователи.

Каждая категория имеет три вида прав, причём эти права имеют отличия для файлов и каталогов. Для файлов:

  • r (read) – чтение файла.
  • w (write) – изменение файла.
  • x (execute) – выполнение файла, как программы.

Для каталогов:

  • r (read) – чтение списка файлов.
  • w (write) – изменение и создание файлов в каталоге.
  • x (execute) – открытие файлов в каталоге.

Вы можете посмотреть список прав командой для файлов в любом текущем каталоге такой командой:

ls -l

Вы увидите что-то вроде -rwxrw-r--, где первый символ служит для обозначения папок и символических ссылок, а последующие символы можно разбить на группы по три, для категорий u, g и o соответственно.

 

С файлами всё понятно, но для каталогов параметры r и x могут вносить некоторую неясность. Если запретить чтение списка файлов (r), то вы не сможете открыть каталог, но при этом можете открыть и изменить файл, если знаете его имя, также доступно создание новых файлов. Если запретить открытие файлов (x), то вы не сможете открыть каталог и прочитать файлы в нём, но при этом с помощью команды ls вы получите список файлов без какой-либо конкретики в виде прав и размера файлов.

По умолчанию новые файлы будут иметь права -rw-rw-r--, где первый прочерк говорит о том, что перед нами файл. Для папок же права будут выглядеть следующим образом: drwxrwxr-x, где d говорит о том, что мы имеем дело с папкой (l будет означать символическую ссылку).

Права могут быть выражены не только в виде последовательности букв, но и в восьмеричном виде, например, для -rw-rw-r--  запись будет выглядеть вот так: 0664. Права для файла по умолчанию в Linux в восьмеричном формате записываются как 0666, а для каталога 0777. В этом случае 0 ничего не означает, а каждая цифра означает набор прав для определённой группы. Сначала владелец, потом группа, а потом все остальные. Но благодаря маске в Linux по умолчанию для файла выставляются права 0664, а для директории 0775. Именно на установку этих значений влияет команда umask. Подробнее о правах доступа к файлам можете узнать из нашей статьи.

Как работает umask

Команда umask задаёт маску прав для новых файлов и каталогов. При создании любого файла операционная система запрашивает маску прав и рассчитывает маску на основе неё. По умолчанию стоит маска 0002, Первая цифра ни на что не влияет и является пережитком синтаксиса языка C. Дальше цифры аналогичны правам доступа в Linux: первая - владелец, вторая - группа и третья - все остальные. Эта маска используется для расчета прав файла. Если не вдаваться в подробности, то рассчитывается всё довольно просто, от максимальных прав отнимается маска и получаются права для файла. Фактически, получается, что маска содержит права, которые не будут установлены для файла. Поэтому права по умолчанию для файла будут 666 - 002 = 664, а для каталога - 777 - 002 = 775.

Каждую цифру маски 002 можно перевести в двоичную систему. Последняя 2 описывает категорию other и в двоичной системе выглядит как 010. Биты читаются слева направо и описывают права rwx. В данном примере 1 означает запрет на запись, а нули разрешают чтение и выполнение. Если будет стоять битовая маска 100, то получится 4 в восьмеричной системе, то это будет означать запрет на чтение.

 

Важное замечание, что с помощью маски не получится разрешить выполнение файлов. Флаг x с помощью маски можно установить только для каталогов. Поскольку права файла рассчитываются на основе прав 666, в которых выполнение уже отключено rw-rw-rw, то маска тут уже ничего сделать не может. Зато для каталогов всё работает, потому что используются права 777. Для наглядности маску по умолчанию можно представить в виде таблицы:

Категория прав

User

Group

Other

Буквенное обозначение

r

w x r w x r -

x

Битовая маска

0

0 0 0 0 0 0 1

0

Маска в восьмеричном виде

0

0

2

Нельзя не сказать и о том, что команда работает в пределах одной сессии терминала и не распространяется на всю систему и другие сессии.

Синтаксис и опции umask

Команда umask, как было сказано ранее, определяет битовую маску, которая будет применена к новым файлам. У команды довольно простой синтаксис и есть только несколько опций:

$ umask опции маска_в_восьмеричном_виде

Помимо маски в восьмеричном виде есть и способ задания прав по умолчанию схожий с синтаксисом команды chmod:

$ umask опции u=права,g=права,o=права

Опции утилиты:

  • -p - вывести команду umask, которая при выполнении задаст текущую маску в восьмеричном виде;
  • -S - вывести права по умолчанию для папки в формате u=rwx, g=rwx, o=rwx рассчитанные по текущей маске.

Посмотреть текущее значение маски можно двумя способами. Если команде передать опцию -p, то она выведет команду для установки текущей маски:

umask -p

Параметр -S выводит текущие разрешения в формате u=rwx, g=rwx, o=rx, где х (выполнение) относится только к каталогам. Право на выполнение для файлов можно выдать только с помощью chmod.

umask -S

Теперь рассмотрим способы задания маски:

umask 0002

umask 002

Как видите, четвертую цифру можно опустить. Маску можно задать и с помощью более традиционных обозначений:

umask u=rwx,g=rwx,o=

В отличие от битовой маски, таким способом прописываются разрешения, а не запреты. Иными словами, права задаются ровно так же, как и в chmod. В этом примере для категории other мы не указали никаких прав, таким образом запрещены все три операции. Для файлов, как и в случае с битовой маской, право на выполнение не выдаётся.

Группы прав можно объединять, или же задавать права сразу для всех категорий, использовав параметр a= (all).

umask ug=rwx,o=rx

umask a=rwx

Также имеется возможность работы с отдельными правами. Оператором + или - можно разрешить или запретить определённое действие, остальные биты в маске останутся нетронутыми.

umask ug-w

umask a+w

Помимо прочего вы можете комбинировать два предыдущих способа. Например, разрешить пользователю все операции, а группе и остальным пользователям убрать право на чтение.

umask u=rwx,go-r

 

Переходим к самому интересному – применению команды на практике. Из очевидного стоит отметить добавление команды в какой-либо скрипт. Например, можно запретить изменение файлов, которые будут записаны в дальнейшем. Напомним, что команда будет действовать в пределах одной сессии терминала.

В этом примере при выполнении скрипта необходимо иметь маску по умолчанию, поэтому прописывается команда umask.

Другой пример использования не столь безопасный. Команда прописывается в конфигурационных файлах пользователя. Изменить маску для оболочки терминала можно добавлением строчки с командой umask в файле ~/.bashsrc. Это справедливо для дистрибутивов на основе Debian. В других дистрибутивах может потребоваться редактирование файла .profile.

Глобальные изменения оболочки вступят в силу после добавления строчки в файл /etc/bash.bashsrc. Но эта маска имеет меньший вес, чем та, что задаётся в домашнем каталоге. Впрочем, вы можете задать лишь необходимые права для пользователя, а остальные оставить из глобальной конфигурации. Например, для пользователя задать параметр g+w, что разрешит ему изменение файлов группы.

Изменение маски для всех программ системы – нетривиальная задача, которая потребует внесение множества правок. Поэтому вместо этого используют локальные права, установленные командой setfacl.

Сравнение с chmod

У команд chmod и umask есть три значительных отличия. Первое, umask задаёт маску для новых файлов, а chmod устанавливает права для существующих. Второе, если говорить о маске, то у umask она инверсная. Если какой-либо бит в ней равен 1, то это означает запрет на выполнение соответствующей операции. Третье, umask не может предоставить права на выполнение файла. Даже если указать маску 000, разрешающую всё, то для файла будут заданы права rw-rw-rw-.

Из общего стоит отметить аналогичный синтаксис предоставления права через операторы =, +, -. Также обе команды не способны менять владельца и группу, для этого существуют команды chown и chgrp. Более сложное управление правами осуществляется через команду setfacl, позволяющую задавать разные права для отдельных пользователей, групп и каталогов, что расширяет стандарт POSIX.

Выводы

Команда umask Linux позволяет установить права для новых файлов и каталогов. Она будет полезна в том случае, если вы хотите задать права заранее. Но учтите, что изменения маски будут распространяться только на текущую сессию терминала, а также то, что за пределами терминала команда практически не имеет силы.

3 комментария

  1. Андрей 30 августа, 2021 Ответить
  2. Владимир 1 сентября, 2021 Ответить
  3. Sokoloff 13 сентября, 2021 Ответить

Ответить

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: