Как рассчитывается umask в Linux?

15

Поэтому я знаю, что umaskможет ограничивать привилегированных пользователей, используя этот формат umask ugo.

Я понимаю, что read = 4, write = 2 и exec = 1. Однако, когда я печатаю umask, он возвращает 4 цифры, которые есть 0022или 0073. Я не понимаю, как это работает сейчас, потому что есть лишняя цифра. Что это за лишняя цифра и что это 0022значит?

Braiam
источник

Ответы:

18

Предположим, маска по умолчанию 0666. umask0022 сделает новую маску 0644 (0666-0022 = 0644), что означает, что группа и другие пользователи имеют права на чтение (без записи или выполнения).

«Дополнительная» цифра (первое число = 0) указывает, что специальных режимов нет.

Если режим начинается с цифры, он будет интерпретирован как восьмеричный, в противном случае он будет символическим.

0 - это цифра, равно как 1 (для фиксированного бита) или 6 (для SGID). Такая команда chmodможет быть вызвана другими методами, например, chmod ug+rw mydirгде вы бы добавили права на чтение и запись для пользователя и группы. Обратите внимание, что режим в этом случае (ug + rw) не начинается с цифры, поэтому он не будет интерпретироваться как восьмеричный, а скорее символический.

См. En.wikipedia.org/wiki/Chmod#Symbolic_examples для символики, а также www.lifeaftercoffee.com/2007/03/20/special-permission-modes-in-linux-and-unix/, чтобы узнать о специальных режимах.

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

Кредит для pinkfloydx33

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

4000 = SUID
2000 = SGID
1000 = sticky bit

Бит SUID, сокращение от set-user-ID, заставляет исполняемую программу запускаться с эффективным идентификатором пользователя (uid) владельца - другими словами, независимо от того, кто его выполняет, программа выполняется с правами владельца. Это обычно наблюдается в программах, которые выполняют действия, требующие прав суперпользователя, но предназначенные для запуска обычными пользователями: passwdодин из таких примеров.

Бит SGID, сокращенно от set-group-ID, очень похож, но работает с эффективным идентификатором группы (gid) владельца.

Слепка немного сложнее, если вы хотите больше информации об этом, вы можете прочитать справочную страницу для sticky.

Эти биты также можно использовать с каталогами, но их значения меняются.

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

Кредит для пользователя470379

Braiam
источник
1
На самом деле, вы не можете указать ненулевое значение, кроме последних 3 цифр. Согласно Posix: «Интерпретация значений режима, которые определяют биты режима файла, отличные от битов разрешения файла, не определена». Согласно man 2 umask(соответствующий системный вызов) «используются только биты прав доступа к файлу mask». В bashumask 1000 выдается ошибка: «восьмеричное число вне диапазона». Так почему лишние 0? Я думаю, что это просто, чтобы показать, что число в восьмеричном.
Ричи
этот пастин не имеет никакого отношения к маскам, так что я не понимаю, насколько это актуально. chmod позволяет устанавливать первые три бита, но umask не позволяет их маскировать. (то есть вы могли бы написать chmod 6777 dropbox. И, кстати, тоже chmod ug+s.)
Ричи
Да, вы правы, не знаю, о чем я думал.
Брайам
@Braiam: Ваша формула для вычисления новой маски неверна, это не 0666-0022так 0666 & ~0022.
cuonglm
1
Я думаю, что возражением является не способ написания чисел, а использование оператора вычитания (-) вместо побитового и (&).
BowlOfRed