Что такое «маски» и как это работает?

190

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

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

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

  1. Что такое Умаск? Объясните мне, как будто я был "Linux Noob"
  2. Как рассчитать с Umask?
  3. Какие варианты использования для Umask?
Lekensteyn
источник
app_mode 666 rw- rw- rw- umask 644 --0 -00 -00 file_mode 022 --- -w- -w-
grabantot

Ответы:

143

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

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

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

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

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

user@computer:~$ touch new-file-name
user@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-name
user@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-name
user@computer:~$ ls -dl new-file-name
-rw------- 1 user user 0 Apr  1 19:14 new-file-name

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

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

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

umask 007

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

chmod -R o-rwx ~

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

ajmitch
источник
3
Итак, что означают цифры в маске? Почему это 777означает, что группа и другие смогут писать в нее, а 077значит - нет?
Здравствуйте, до свидания,
3
Кроме того, вы говорите, что если Umask 000, разрешение файла будет 777. Таким образом, с маской по умолчанию 022не должны ли права доступа к файлу 755, то есть соответствовать -rwxr-xr-x, а не -rw-r--r--?
Привет, до свидания,
13
Должен признать, это объяснение смутило меня больше, чем помогло.
Коннель Хули,
8
обратите внимание, что Umasntu по умолчанию Umask изменился на 0002 только через месяц после того, как этот ответ был опубликован.
Джефф Пакетт
7
@HelloGoodbye, если umask, 000то никакие разрешения не будут удалены. приложения любят touchи nanoсоздают файлы по умолчанию, 666так что разрешение на файл останется, 666но umask 022удалит биты записи для группы и других, так что 666будет сокращено до 644aka. -rw-r--r--Рассмотрим, mkdirкакой режим создания по умолчанию 777с umask of 022уменьшит разрешения для755
Jeff Puckett
38

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

Умаск и Пам_Умаск

Значение 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_'чтобы найти man-страницы для других). В страницах руководства для pam_umaskотмечаются , что

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

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

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

Хотя в Ubuntu по умолчанию используется значение umask 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 онлайн .

Alex
источник
Похоже, во второй части чего-то не хватает? (USERGROUP_ENABLE?) +1 за обновленную информацию
Лекенштейн
2
@Lekensteyn Как ни странно, настройка в /etc/login.defsэто определенно USERGROUPS_ENAB yesпосле проверки. Синтаксис этого файла немного необычный.
Я только что проверил файл и источник, и вы правы, эти (и некоторые другие) настройки смущенно названы "_ENAB".
Лекенштейн
34

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

Octal value : Permission
0 : read, write and execute
1 : read and write
2 : read and execute
3 : read only
4 : write and execute
5 : write only
6 : execute only
7 : no permissions

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

$ umask 077
$ mkdir dir1
$ touch file
$ ls -ld dir1 file

drwx------ 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)
amrx
источник
3
Я не думаю, что именно так рассчитываются окончательные разрешения, что, если значение немаскировки 077вычитается 666-077в этом случае?
Суфиян Гори
6
@SufiyanGhori Барон объяснение не является полным для разрешения файлов. В вашем случае и в любом будущем расчете, для удобства запоминания, вы должны иметь в виду вычитать их следующим образом: 6-0 6-7 6-7, если какой-либо результат из этих трех равен -1, тогда пусть это будет 0. Таким образом, мы есть окончательный результат 600
Huy.PhamNhu
1
@ Huy.PhamNhu Это тоже не правильно. С базовым разрешением 666 и umask 033 вы точно не получите 633.
Маартин
7
Нет нет нет. Вы не можете использовать вычитание для вычисления umask (он работает с определенными значениями, но не со всеми). Вы должны думать о маске как о «отключенных битах». Смотрите другие ответы Суфияна и Висбуки.
Висбуки
33

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

Во-первых, «Маска» не означает «вычитать» в арифметическом смысле - здесь нет заимствований или переносов, во-вторых, umaskэто маска; это не число, которое нужно вычесть.

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

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

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

umask 077

(разобрать значение в двоичном, 000 111 111)

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

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

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

Посмотрите, как 110изменились оба значения 000.

По аналогии,

directory permission 777 = 111 111 111 
unmask value         077 = 000 111 111
will result in,      700 = 111 000 000
Суфиян Гори
источник
7
это должен быть ответ!
Абделуахаб
@SufiyanGhori Итак, если umask 177(001 111 111), он отключит первые 7 младших битов, если они есть1
Касун Сиямбалапития
это правильно @KasunSiyambalapitiya
Суфиян Гори
1
такова формулаresult = file permission & (!umask)
Эрик Ходгинс
1
@EricHodgins: Да, именно так.
Амит Найду
15

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

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

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

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

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

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

Расчет:

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

  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.

Бонусный расчет:

Если вы действительно хотите понять, что значит «восьмеричные маски вычисляются с помощью побитового И унарного дополнения аргумента с использованием побитового НЕ» , вот несколько логических таблиц, которые могут помочь продемонстрировать. Помните, бит маски 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)

wisbucky
источник