Что такое "umask" и как он работает?

Я считаю, что umask - это то, что контролирует права доступа к файлам, но не до конца понимаю это.

После запуска umask 0644 в одном терминал, Я не могу прочитать файлы, которые я создаю с помощью текстового редактора командной строки nano. Я заметил, что права доступа к этому файлу установлены на 0022 вместо значения по умолчанию 0755.

Как работает umask? Я думал, что мог бы просто удалить каждую цифру в umask из 0777, 7 - 6 = 1 и 7 - 4 = 3, поэтому я ожидаю, что разрешения будут 0133, но, по-видимому, это не так.

  1. Что такое umask на самом деле? Объясни мне это так, как будто я был "новичком в Linux".
  2. Как мне выполнить вычисления с помощью umask?
  3. Каковы варианты использования umask?

umask действует как набор разрешений, которые приложения не могут устанавливать для файлов. Это маска создания файлового режима для процессы и не может быть установлен для самих каталогов. Большинство приложений не будут создавать файлы с установленными разрешениями на выполнение, поэтому по умолчанию у них будет значение 666, который затем изменяется с помощью umask.

Поскольку вы настроили umask на удаление битов чтения/записи для владельца и битов чтения для других, значение по умолчанию, такое как 777 в приложениях приведет к тому, что права доступа к файлам будут 133. Это означало бы, что вы (и другие) могли бы выполнить файл, а другие могли бы записывать в него.

Если вы хотите, чтобы файлы не могли быть прочитаны / записаны / выполнены никем, кроме владельца, вам следует использовать umask, например 077 чтобы отключить эти разрешения для группы и других пользователей.

В отличие от этого, umask из 000 сделает вновь созданные каталоги доступными для чтения, записи и передачи для всех (разрешения будут 777). Такая umask крайне небезопасна, и вы никогда не должны устанавливать umask на 000.

umask по умолчанию в Ubuntu был 022 это означает, что вновь созданные файлы доступны для чтения всеми, но доступны для записи только владельцем:

user@computer:~$ touch new-file-nameuser@computer:~$ ls -dl new-file-name-rw-r--r-- 1 user user 0 Apr  1 19:15 new-file-name

Начиная с Ubuntu Oneiric (11.10), umask по умолчанию был смягчен до 002, который расширяет доступ на запись к группе владельца:

user@computer:~$ touch new-file-nameuser@computer:~$ ls -dl new-file-name-rw-rw-r-- 1 user user 0 Apr  1 19:15 new-file-name

Просмотр и изменение umask

Чтобы просмотреть текущие настройки umask, откройте терминал и запустите команду:

umask

Чтобы изменить настройку umask текущей оболочки на что-то другое, скажем, 077, запустите:

umask 077

Чтобы проверить, работает ли этот параметр или нет, вы можете создать новое файл (права доступа к существующему файлу не будут затронуты) и отобразите информацию о файле, запустите:

user@computer:~$ touch new-file-nameuser@computer:~$ ls -dl new-file-name-rw------- 1 user user 0 Apr  1 19:14 new-file-name

Настройка umask наследуется процессами, запущенными из одной и той же оболочки. Например, запустите текстовый редактор GEdit, выполнив gedit в терминале и сохраните файл с помощью gedit. Вы заметите, что на вновь созданный файл влияет та же настройка umask, что и в терминале.

Пример использования: многопользовательская система

Если вы работаете в системе, которая используется несколькими пользователями, желательно, чтобы другие пользователи не могли читать файлы в вашем домашнем каталоге. Для этого очень полезна umask. Редактировать ~/.profile и добавьте новую строку с:

umask 007

Вам необходимо повторно войти в систему для этого изменения umask в ~/.profile чтобы вступить в силу. Далее вам нужно изменить существующие права доступа к файлам в вашем домашнем каталоге, удалив бит чтения, записи и выполнения для всего мира. Откройте терминал и выполнить:

chmod -R o-rwx ~

Если вы хотите, чтобы этот параметр umask применялся ко всем пользователям в системе, вы можете отредактировать файл общесистемного профиля по адресу /etc/profile.

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

Прежде всего, “маска” не означает “вычесть” в арифметическом смысле – здесь нет заимствования или переноса.

Во-вторых, следует понимать “маску” побитовый вместо этого: применение логических операций к каждому битовому столбцу независимо. То есть 4-й бит битовой последовательности разрешений взаимодействует только с 4-м битом маски.

В-третьих, маска превращается прочь биты разрешения. Если они уже выключены, то umask не вносит никаких изменений в разрешение,

Например, предположим, что вам нужно снять маску 077 из системных настроек по умолчанию для файлов, которые 666 и каталоги , которые являются 777.

Команда, которую вы будете использовать, это

umask 077

(значение демаскировки в двоичном формате, 000 111 111)

Что сделает эта демаскировка, так это отключит любой из первых шести LSBS (младших значащих битов), если они 1 и не внесет никаких изменений, если какой-либо из них уже выключен.

Вот как рассчитывается окончательное разрешение:

file permission   666 = 110 110 110 unmask value      077 = 000 111 111will result in    600 = 110 000 000

Наблюдайте, как оба 110 значения изменились на 000.

Аналогично,

directory permission   777 = 111 111 111 unmask value           077 = 000 111 111will result in         700 = 111 000 000

В дополнение к хорошему обсуждению в принятом ответе, стоит добавить еще несколько моментов о umask, со ссылкой на то, как он управляется в 12.04 и далее.

Umask и pam_umask

umask по умолчанию теперь находится в /etc/login.defs и не в /etc/profile, как указано в официальной записке в /etc/profile читает:

# The default umask is now handled by pam_umask.# See pam_umask(8) and /etc/login.defs.

Pam_umask кратко объясняется ниже, и следует сказать, что файл по умолчанию, в который пользователь помещает свои пользовательские настройки umask, по-прежнему ~/.profile.

Pam_umask является одним из многих важных Модули PAM которые имеют решающее значение для работы Ubuntu (запуск apropos '^pam_' чтобы найти справочные страницы для других). В manpage для pam_umask отмечается, что

pam_umask - это модуль PAM для установки маски создания режима файла текущей среды. umask влияет на разрешения по умолчанию, назначенные вновь созданным файлам.

Примечание к umask по умолчанию

Новые папки в $HOME может быть создан с помощью mkdir с разрешениями по умолчанию 775 и файлами, созданными с помощью touch с разрешениями по умолчанию 664, даже если umask по умолчанию равен 022. На первый взгляд это кажется противоречивым, и его стоит объяснить.

Хотя umask по умолчанию в Ubuntu равен 022, это еще не вся история, поскольку в /etc/login.defs это позволяет umask быть 002 для пользователей, не являющихся root, если выполняется условие (см. Выдержку ниже). При обычной установке, /etc/login.defs содержит настройку USERGROUPS_ENAB yes. Это то, что

>>Позволяет установить биты группы umask такими же, как биты владельца (примеры: 022-002, 077-007) для пользователей, не являющихся root, если uid совпадает с gid, а имя пользователя совпадает с именем основной группы.

Следовательно, почему вы видите следующее с stat когда создается новая папка с mkdir в однопользовательской системе, такой как моя (uid и gid совпадают):

Access: (0775/drwxrwxr-x)  Uid: ( 1000/username)   Gid: ( 1000/username)

Для получения дополнительной информации см. man pam_umask иСправочные страницы Ubuntu онлайн.

Это довольно старое, но об этом стоит упомянуть. Для вычисления для umask, в отличие от разрешений файловой системы. Восьмеричные умаски вычисляются с помощью побитового И унарного дополнения аргумента с использованием побитового NOT. Восьмеричные обозначения выглядят следующим образом:

Octal value : Permission0 : read, write and execute1 : read and write2 : read and execute3 : read only4 : write and execute5 : write only6 : execute only7 : no permissions

Затем вы можете рассчитать, чтобы установить правильные предпосылки umask, такие как:

$ umask 077$ mkdir dir1$ touch file$ ls -ld dir1 filedrwx------ 2 amrx amrx 4096 2011-03-04 02:05 dir1-rw------- 1 amrx amrx    0 2011-03-04 02:05 file

Вычисление Окончательного Разрешения Для Файлов

Вы можете просто вычесть umask из базовых разрешений, чтобы определить окончательное разрешение для файла следующим образом:

666 – 022 = 644
  • Права доступа к файловой базе : 666
  • значение umask : 022
  • вычтите, чтобы получить права доступа к новому файлу (666-022) : 644 (rw-r–r–)

Вычисление Окончательного Разрешения Для Каталогов

Вы можете просто вычесть umask из базовых разрешений, чтобы определить окончательное разрешение для каталога следующим образом:

777 – 022 = 755
  • Права доступа к базе каталогов : 777
  • значение umask : 022
  • Вычтите, чтобы получить права доступа к новому каталогу (777-022) : 755 (rwxr-xr-x)

Основная концепция:

Если вы похожи на большинство людей и не понимаете, какого черта "восьмеричные умаски вычисляются с помощью побитового И унарного дополнения аргумента с использованием побитового NOT" значит, вот мое простое объяснение:

Прежде всего, подумайте о том, что такое "маска". Маска что-то блокирует. Подумайте о клейкой ленте. В этом случае umask подобен клейкой ленте для блокировки / отключения разрешений при создании нового файла или каталога.

Разрешения по умолчанию при создании нового каталога следующие octal 777 (111 111 111), и новый файл будет octal 666 (110 110 110). Мы устанавливаем umask для блокировки/отключения определенных разрешений.

  • Немного маски из 1 означает заблокировать / отключить это разрешение (наклеить на этот бит клейкую ленту).
  • Немного маски из 0 позволит пропускать разрешение (без клейкой ленты поверх этого бита).

Таким образом, octal 022 (000 010 010) маска означает отключение group write и others write, и разрешить прохождение всех других разрешений.

Расчет:

Вот пример расчета для нового файла (разрешение по умолчанию 666) с 022 umask:

  perm mask result----------------------------u 1    0    1 (pass through)  1    0    1 (pass through)  0    0    0 (pass through)----------------------------g 1    0    1 (pass through)  1    1    0 (disable)  0    0    0 (pass through)----------------------------o 1    0    1 (pass through)  1    1    0 (disable)  0    0    0 (pass through)

Итак, вот как вы получаете результат 644 при создании нового файла.

Более простой способ:

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

  • umask u=rwx,g=rx,o=rx средства, позволяющие проходить через для user rwx, group rx, other rx. Что подразумевает отключение group w, others w. Если вы запустите эту команду, то проверьте umask, вы получите 022.
  • umask u=rwx,g=,o= средства, позволяющие проходить через для user rwx. Что подразумевает отключение всего доступа для group и others. Если вы запустите эту команду, то проверьте umask, вы получите 077.

Расчет бонуса:

Если вы действительно хотите понять, что "восьмеричные умаски вычисляются с помощью побитового И унарного дополнения аргумента с использованием побитового NOT" значит, вот несколько логических таблиц, которые могут помочь продемонстрировать. Помните, немного маски 1 означает отключить, 0 значит, проходите насквозь.

perm mask result----------------0    1    0     (mask 1 always disables)1    1    0     (mask 1 always disables)0    0    0     (mask 0 passes through)1    0    1     (mask 0 passes through)

Если вы составите таблицу с NOT(mask), теперь это просто простой AND логическая таблица!

perm NOT(mask) result---------------------0    0         0     (mask 1 always disables)1    0         0     (mask 1 always disables)0    1         0     (mask 0 passes through)1    1         1     (mask 0 passes through)

Таким образом, формула для этого такова: result = perm AND (NOT mask)

app_mode 666 rw- rw- rw-
umask 644 --0 -00 -00
file_mode 022 --- -w- -w-