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

我相信umask是控制文件权限的东西,但不完全理解它。

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

umask是如何工作的? 我想我可以从0777 7 - 6 = 17 - 4 = 3删除umask中的每个数字,所以我希望权限为0133 ,但显然,情况并非如此。

  1. 什么是umask? 向我解释,就像我是一个“Linux noob”
  2. 我如何用umask计算?
  3. umask的用例是什么?

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

由于您已设置umask以删除所有者的读/写位以及其他人的读取位,因此应用程序中的默认值(例如777 )将导致文件权限为133 。 这意味着您(和其他人)可以执行该文件,而其他人则可以写入该文件。

如果您想让除了所有者之外的任何人都不能读取/写入/执行文件,您应该使用像077这样的umask来为该组和其他人关闭这些权限。

相比之下, 000的umask将使新创建的目录对每个人都可读,可写和可下载(权限将是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 

查看和修改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启动的进程inheritance。 例如,通过在终端中执行gedit启动文本编辑器GEdit,并使用gedit保存文件。 您会注意到新创建的文件受到与终端中相同的umask设置的影响。

使用案例:多用户系统

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

 umask 007 

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

 chmod -R o-rwx ~ 

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

除了在接受的答案中的良好讨论之外,值得添加一些关于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_'来查找其他模板的联机帮助页)。 在pam_umask的联机帮助页中 , pam_umask注意

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

关于默认umask的注释

$HOME新文件夹可以由mkdir创建,默认775权限和使用默认664权限touch创建的文件,即使默认的umask是022.这看起来似乎是矛盾的,值得解释。

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

如果uid与gid相同,则允许将umask组位设置为与所有者位(例如:022 – > 002,077 – > 007)相同,并且用户名与主用户名相同团队名字。

因此,当在单个用户系统(例如我的)上使用mkdir创建新文件夹时,为什么你会看到以下带有stat (uid和gid是相同的):

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

有关更多信息,请参阅man pam_umask和Ubuntu联机帮助页 。

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

 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) (777-022) 755 (rwxr-xr-x)

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

首先,“掩模”并不意味着“减去”,在算术意义上 – 没有借用或携带,其次, umask是掩模; 它不是要减去的数字。

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

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

你将使用的命令是,

 umask 077 

(取消掩码二进制值, 000 111 111

这个unmask将做的是它将关闭前六个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 

基本概念:

如果你像大多数人一样,并且不明白什么是“八进制umasks是通过使用按位NOT的参数的一元补码的按位AND来计算”的意思,这是我的简单解释:

首先,想想什么是“面具”。 面具阻挡了什么。 想想遮蔽胶带。 在这种情况下,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通过。 这意味着禁用groupothers所有访问权限。 如果您运行此命令然后检查umask ,您将获得077

奖金计算:

如果你真的想要理解“通过使用按位NOT的参数的一元补码的按位AND来计算八进制umasks”的意思,这里有一些逻辑表可以帮助演示。 请记住,掩码位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)