当前位置: 首页>>技术教程>>正文


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

, ,

问题描述

我相信umask是控制file permissions的东西,但并不完全理解它。

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

umask如何工作?我想我可以从07777 - 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设置,请运行以下命令:open a terminal

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设置的影响。

用例:multi-user系统

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

umask 007

您需要re-login以使~/.profile中的此umask更改生效。接下来,您需要通过删除世界的读,写和执行位来更改主目录中文件的现有文件许可权。 Open a terminal并执行:

chmod -R o-rwx ~

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

次佳解决思路

除了被接受的答案中的良好讨论之外,值得再补充一点关于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是Ubuntu操作中至关重要的许多重要PAM modules中的一个(运行apropos '^pam_'以查找其他页面的联机帮助页)。在pam_umaskmanpage中注意到

pam_umask is a PAM module to set the file mode creation mask of the current environment. The umask affects the default permissions assigned to newly created files.

关于默认umask的说明

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

虽然Ubuntu上的默认umask为022,但这不是全部内容,因为/etc/login.defs中的设置允许在符合条件时允许umask为002(请参阅下面的摘录),以便non-root用户使用umask。在正常安装中,/etc/login.defs包含设置USERGROUPS_ENAB yes。这是什么

Enables setting of the umask group bits to be the same as owner bits (examples: 022 -> 002, 077 -> 007) for non-root users, if the uid is the same as gid, and username is the same as the primary group name.

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

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

有关更多信息,请参阅man pam_umaskUbuntu manpages online

第三种解决思路

这是相当古老的,但这是值得一提的。计算umask,与文件系统权限不同。八进制umasks是通过使用按位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)

第四种思路

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

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

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

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

您将使用的命令是,

umask 077

(在二进制中取消屏蔽值,000 111 111)

如果它们是1,它将会关闭前六个LSB(最低有效位)中的任何一个,并且如果它们中的任何一个已经关闭,它们将不会改变。

以下是最终权限的计算方式:

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是通过使用按位不”来表示的一元补数来计算的,那么这里是我的简单解释:

首先,考虑一下”mask”是什么。面具阻塞了一些东西。想想美化磁带。在这种情况下,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符号有一个更简单的方法。当您使用此方法时,您只需指定pass-through位而不是掩码位。

  • 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

奖金计算:

如果你真的想了解什么“八进制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)

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/322.html,未经允许,请勿转载。