Для чего на самом деле umask
нужна команда в *nix OS?
Каков ее рабочий механизм и полезность? Например
$ umask 022
Спасибо большое, прежде чем
решение1
umask
— это встроенная команда большинства оболочек, которая является просто интерфейсом к системному umask()
вызову, и вы найдете ее описание в документации вашей оболочки (будьте осторожны, man umask
она может направить вас к документации системного umask()
вызова вместо umask
встроенной команды оболочки, отличной от вашей).
Маска пользователя — это атрибут процесса (наследуемый от родителя к дочерним процессам и сохраняющийся при выполнении команды), который определяет, какие разрешения автоматически предоставляются файлам по умолчанию при их создании.
Утилита umask
позволяет вам установить маску пользователя процесса оболочки для управления разрешениями файлов, созданных любыми командами, запущенными в сеансе оболочки.
Все umask
оболочки принимают маску как восьмеричное число, в то время как в некоторых оболочках, включая все оболочки POSIX, ее также можно указать в символической форме, например, для chmod
.
Маска определяет, какие биты разрешений должны бытьочищенокогда файл создан. Например umask 777
, где 0777 - это 511 или 0b111_111_111 приведет к созданию файлов без разрешения, так как все 9¹ бит разрешений на файлы Unix (3 ( r
read, w
rite, e x
excute) дляпользователь, 3 длягруппа, 3 длядругой) будет очищен.
Символическая форма определяет, какие биты должнынетбыть очищен. Так же umask 777
будет umask u=,g=,o=
.
Как правило, вам нужно, чтобы по крайней мере umask включал бит w
для o
thers, поскольку вы не хотите, чтобы создаваемые вами файлы были доступны для записи всем ( umask 002
или umask u=rwx,g=rwx,o=rx
).
Вероятно, вам также понадобится установить w
бит для g
roup, по крайней мере, в системах, где основная группа пользователя не является личной (она общая для других пользователей): umask 022
или umask u=rwx,g=rx,o=rx
.
Или гарантирует umask 077
, umask u=rwx,g=,o=
что все создаваемые вами файлы будут приватными для вас (недоступными для кого-либо еще). Вы часто видите это в скриптах, которые создают временные файлы, иногда в подоболочке, как в:
(umask 077; echo test > "$tmpfile")
Установка umask
битов для u
ser может вызвать проблемы, так как в итоге вы можете создать файлы, которые даже вы не сможете открыть.
Обратите внимание, что применена маска пользователянаверхуразрешений, запрашиваемых приложениями, когда они open()
или creat()
файл. Если они делают это, creat("file", 0666)
пока umask
есть 022
( u=rwx,g=rx,o=rx
), разрешения в конечном итоге будут 0644
( u=rw,g=r,o=r
). Приложения по-прежнему могут вызывать fchmod()
или chmod()
впоследствии, чтобы изменить разрешения по своему усмотрению (и umask не имеет никакого эффекта там).
umask
без аргументов выводит текущую маску пользователя в восьмеричной форме. umask -S
в некоторых оболочках выводит ее в символьной форме. umask -p
в bash
или fish
выводит код оболочки, который после интерпретации установит ту же маску пользователя.
Это можно использовать для восстановления предыдущего umask после его изменения:
previous_umask=$(umask)
umask 077
# create some private files
umask "$previous_umask"
¹ Технически, существует 12 бит разрешений, из которых 3 дополнительных — это специальные биты, используемые для различных целей в зависимости от типа файла и иногда в сочетании с другими битами разрешений (например, битами setuid, setgid для исполняемых файлов, t
битом для каталогов...). В некоторых системах эти биты игнорируются при запросе в open()
/ creat()
и в любом случае, когда они устанавливаются приложениями (обычно скорее через chmod()
впоследствии), на это есть веская причина, поэтому обычно нецелесообразно включать их в , umask
и umask()
системный вызов все равно их проигнорирует.