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

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

我相信 umask 是控制文件权限,但并不完全理解。

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

umask 如何工作?我以为我可以从07777 - 6 = 1和中删除 umask 中的每个数字7 - 4 = 3,因此我期望权限为0133,但显然事实并非如此。

  1. umask 到底是什么?像我这个“Linux 菜鸟”一样向我解释一下
  2. 如何使用 umask 来计算?
  3. umask 的用例有哪些?

答案1

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

答案2

其他回答者已经很好地解释了 umasking 的概念以及为什么需要它。让我补充一下我的看法,并给你一个数学例子来说明权限是如何计算的。

首先,从算术意义上来说,“mask”并不意味着“减去”——不涉及借位或进位。

其次,应该理解“面具”按位而是:对每个位列独立应用逻辑运算。也就是说,权限位序列的第 4 位仅与掩码的第 4 位交互。

三、口罩变离开权限位。如果它们已经关闭,umask则不会对权限进行任何更改,

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

您将使用的命令是

umask 077

(以二进制形式显示隐藏值,000 111 111

此取消屏蔽将执行的操作是,如果前六个 LSB(最低有效位)已关闭,它将关闭其中任何一个,1如果其中任何一个已关闭,它将不做任何更改。

最终许可的计算方法如下:

file permission   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

答案3

除了在接受的答案中进行的良好讨论之外,还值得添加一些有关的观点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 会影响分配给新创建文件的默认权限。

关于默认 umask 的说明

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

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

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

stat因此,当在单用户系统(例如我的系统)上创建新文件夹时,您会看到以下内容mkdir(uid 和 gid 相同):

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

有关详细信息,请man pam_umask参阅 Ubuntu 在线手册页

答案4

基本概念:

如果你和大多数人一样,不明白到底是什么“八进制 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 rwx,,group rxother rx这意味着禁用group wothers w。如果您运行此命令然后检查umask,您将获得022
  • umask u=rwx,g=,o=表示允许通过user rwx。这意味着禁用group和的所有访问others。如果您运行此命令然后检查umask,您将得到077

奖金计算:

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

相关内容