什么是“ umask”,它如何工作?


190

我相信umask是控制文件权限的工具,但并不完全了解它。

运行后umask 0644终端,我无法读取我用命令行的文本编辑器创建的文件nano。我注意到该文件的权限设置为0022而不是默认权限0755

umask如何工作?我想我可能只是删除每一位从umask的07777 - 6 = 1并且7 - 4 = 3,所以我希望的权限是0133,但显然,这并非如此。

  1. umask到底是什么?向我解释一下,就像我是“ Linux新手”一样
  2. 如何使用umask进行计算?
  3. umask的用例是什么?

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

Answers:


143

umask充当应用程序无法在文件上设置的一组权限。这是用于进程的文件模式创建掩码,不能为目录本身设置。大多数应用程序不会创建具有执行权限集的文件,因此它们的默认值为666,然后由umask对其进行修改。

设置umask除去所有者的读/写位和其他所有者的读位后,诸如777应用程序之类的默认设置将导致文件许可权为133。这意味着您(和其他人)可以执行该文件,而其他人也可以写入该文件。

如果要使所有者以外的任何人都不能读取/写入/执行文件,则应使用umask 077来关闭对组和其他人的那些权限。

相比之下,umask的使用000会使新创建的目录对所有人可读,可写且可归类(权限为777)。这样的umask是非常不安全的,您永远不要将umask设置为000

Ubuntu上的默认umask是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

要将当前shell的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设置由从同一shell启动的进程继承。例如,通过gedit在终端中执行来启动文本编辑器GEdit,然后使用gedit保存文件。您会注意到,新创建的文件受与终端相同的umask设置影响。

用例:多用户系统

如果您使用的系统由多个用户共享,则希望其他人无法读取您的主目录中的文件。为此,umask非常有用。使用以下命令编辑~/.profile并添加新行:

umask 007

您需要重新登录才能使此umask更改~/.profile生效。接下来,您需要通过删除世界的读取,写入和执行位来更改主目录中文件的现有文件许可权。打开一个终端并执行:

chmod -R o-rwx ~

如果要将此umask设置应用于系统上的所有用户,则可以在处编辑系统范围的配置文件/etc/profile


3
那么,umask中的数字是什么意思?为什么777说该小组和其他人能够写,而077不能写?
HelloGoodbye

3
另外,您说如果umask为000,则文件许可权为777。因此,使用默认掩码时022,文件权限不应该是755,即对应于-rwxr-xr-x,不是-rw-r--r--吗?
HelloGoodbye

12
必须承认,这种解释使我感到困惑,而不是帮助我。
康纳尔·胡利

8
请注意,发布此答案仅一个月后,Ubuntu的默认umask更改为0002
杰夫·普基特

7
@HelloGoodbye(如果umask是),000则没有权限将被删除。应用程序喜欢touchnano使用默认666文件创建文件,因此文件权限将保留,666但umask的022将删除组和其他文件的写位,因此666将其减少为644aka -rw-r--r--考虑使用umask的mkdir默认创建模式会将权限减少至777022755
Jeff Puckett

38

除了在接受的答案中进行了很好的讨论之外,还值得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设置放入其中的默认文件为still ~/.profile

Pam_umask是在Ubuntu操作中至关重要的许多重要PAM模块之一(运行apropos '^pam_'以查找其他模块的联机帮助页)。在手册页pam_umask需要注意的是

pam_umask是一个PAM模块,用于设置当前环境的文件模式创建掩码。umask影响分配给新创建文件的默认权限。

关于默认umask的注释

$HOME可以mkdir使用默认的775权限创建新文件夹,touch使用默认的664权限创建文件,即使默认umask为022也是如此。乍一看,这是矛盾的,值得解释。

尽管在Ubuntu上默认的umask是022,但这不是全部,因为其中有一个设置,/etc/login.defs如果满足条件,则允许非root用户将umask设置为002(请参见下面的摘录)。在正常安装中,/etc/login.defs包含设置USERGROUPS_ENAB yes。这是什么

如果uid与gid相同,并且username与primary相同,则允许将非掩码用户的umask组位设置为与所有者位相同(例如:022-> 002、077-> 007)组名。

因此,statmkdir在单个用户系统(如mine)上创建新文件夹时,为什么会看到以下内容(uid和gid相同):

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

有关更多信息,请参见man pam_umask在线Ubuntu联机帮助页


您的第二部分似乎缺少了什么?(USERGROUP_ENABLE?)+1获取更新信息
Lekensteyn

2
@Lekensteyn奇怪的是,其中的设置/etc/login.defs肯定是USERGROUPS_ENAB yes在检查之后进行的。该文件的语法有点不寻常。

我刚刚检查了文件和源,您说得对,此(以及其他一些)设置令人困惑地命名为“ _ENAB”。
Lekensteyn

33

这已经很老了,但是值得一提。计算umask,与文件系统权限不同。八进制umask通过使用按位NOT的参数的一元补码的按位与进行计算。八进制表示法如下:

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)

3
我不认为这是最终许可的计算方式,如果未屏蔽值是那种情况下077如何减去666-077呢?
Sufiyan Ghori 2016年

5
@SufiyanGhori Baron的解释尚未完成文件许可。在您的情况下以及将来的计算中,为了便于记忆,您应该记住以这种方式将它们相减:6-0 6-7 6-7如果这三个结果中的任何一个为-1,则将其设为0。因此我们最终结果为600
Huy.PhamNhu

1
@ Huy.PhamNhu也不正确。具有666的基本权限和033的umask,您肯定不会淘汰633。
maaartinus

7
不不不。您不能使用减法来计算umask(它适用于某些值,但不是全部)。您必须将umask视为“禁用位”。参见Sufiyan和Wisbucky的其他答案。
Wisbucky

33

回答的其他人很好地解释了umasking的概念以及为什么需要它。让我加两分钱,并给您一个有关如何实际计算权限的数学示例。

首先,从算术意义上讲,“遮罩”并不意味着“减” –不涉及借用或携带,其次umask是掩蔽;它不是要减去的数字。

第三,掩码关闭许可位。如果它们已经关闭,则umask不会更改权限,

例如,假设您必须077为文件666和目录的系统默认设置取消屏蔽777

您将使用的命令是,

umask 077

(取消屏蔽二进制值000 111 111

此取消屏蔽将执行的操作是将关闭前六个LSB(最低有效位)中的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
这应该是答案!
Abdelouahab

@SufiyanGhori因此,如果 umask 177(001 111 111),它将如果它们是关闭第一7至少显著位1
Kasun Siyambalapitiya

正确@KasunSiyambalapitiya
Sufiyan Ghori

1
公式也一样result = file permission & (!umask)
Eric Hodgins

1
@EricHodgins:是的,完全正确。
阿米特·奈杜

14

基本概念:

如果您像大多数人一样,并且不理解“通过使用按位NOT的参数的一元补码的按位与”来计算八进制umask的含义,这是我的简单解释:

首先,考虑一下什么是“面具”。面具会挡住东西。想想胶带。在这种情况下,umask就像在创建新文件或目录时屏蔽磁带以阻止/禁用权限。

创建新目录时的默认权限为octal 777 (111 111 111),新文件为octal 666 (110 110 110)。我们将umask设置为阻止/禁用某些权限。

  • 屏蔽位的一种1手段,用于阻止/禁用该权限(将屏蔽带放在该位上)。
  • 掩码位0将允许权限通过(该位上没有掩码带)。

因此,octal 022 (000 010 010)掩码表示禁用group writeothers write,并允许所有其他权限通过。

计算方式:

这是使用022 umask的新文件(默认权限为666)的示例计算:

  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 rwxgroup rxother rx。这意味着禁用group wothers w。如果您运行此命令然后检查umask,您将得到022
  • umask u=rwx,g=,o=表示允许通过user rwx。这意味着禁用对group和的所有访问others。如果您运行此命令然后检查umask,您将得到077

奖金计算:

如果您实际上想了解什么“八进制umask是通过使用按位NOT而不是参数的一元补码的按位AND来计算的”,那么这里有一些逻辑表可以帮助演示。请记住,掩码位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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.