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

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

umask如何工作?我以为我可以从07777 - 6 = 17 - 4 = 3删除umask中的每个数字,所以我希望权限为0133,但显然不是这种情况。是umask吗?向我解释一下,就像我是“ Linux新手”一样
如何使用umask进行计算?
umask的用例是什么?


评论

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

askubuntu.com/q/186747/459652

#1 楼

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

设置umask会删除以下内容的读/写位:所有者和其他用户的读取位,应用程序中的默认值(例如777)将导致文件权限为133。这意味着您(和其他人)可以执行该文件,而其他人也可以写入该文件。

如果要使文件,除了所有者之外,任何人都不能读取/写入/执行,则应使用077之类的umask来关闭该组和其他用户的权限。是000)。这样的umask是非常不安全的,您永远不要将umask设置为777。Ubuntu上的默认umask是000,这意味着新创建的文件可以被所有人读取,但只能由所有者写: br />
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放宽到022,这扩大了对所有者组的写访问权限:

查看和修改umask

要查看当前的umask设置,请打开终端并运行以下命令:

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


要将当前shell的umask设置更改为其他值,例如077,请运行:新文件(现有文件的文件权限不会受到影响)并显示有关文件的信息,请运行:

umask


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

用例:多用户系统

如果您在系统上由多个用户共享,希望其他人无法读取您的主目录中的文件。为此,umask非常有用。编辑gedit并添加新行,并添加以下内容:接下来,您需要通过删除世界的读取,写入和执行位来更改主目录中文件的现有文件许可权。打开终端并执行:

umask 077


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

评论


那么,umask中的数字是什么意思?为什么777表示该小组和其他人将能够写信,而077则意味着他们不能。

–你好再见
16年1月22日在5:21

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

–你好再见
16年1月22日在5:28

必须承认,这种解释使我感到困惑,而不是帮助我。

– Connel Hooley
16年5月2日在12:11

请注意,发布此答案仅一个月后,Ubuntu的默认umask更改为0002。

– Jeff Puckett
16 Dec 14'在3:13

@HelloGoodbye,如果umask为000,则不会删除任何权限。诸如touch和nano之类的应用程序会使用默认666创建文件,因此文件权限将保留为666,但是umask 022将删除该组和其他用户的写位,因此666减少为644,即-rw-r--r mkdir,默认创建模式为777,umask为022,会将权限减少到755

– Jeff Puckett
16 Dec 14'3:20

#2 楼

除了在接受的答案中进行了很好的讨论之外,还值得参考umask并在12.04及更高版本中对其进行管理的方式添加一些要点。

Umask和pam_umask

默认的umask现在位于/etc/login.defs中,而不是/etc/profile中,因为/etc/profile中的官方注释显示为:用户放置其自定义umask设置的默认文件仍然是Pam_umask

~/.profile是许多重要的PAM模块之一,这些模块对Ubuntu的操作至关重要(运行Pam_umask来查找其他手册页)。在apropos '^pam_'的手册页中,请注意,


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


关于默认umask的说明具有默认775权限的pam_umask和使用具有默认664权限的$HOME创建的文件,即使默认umask为022也是如此。乍一看,这是自相矛盾的,值得解释。 Ubuntu,这不是全部,因为mkdir中有一​​个设置,如果满足条件,则允许非root用户将umask设置为002(请参见下面的摘录)。在正常安装中,touch包含设置/etc/login.defs。这就是


使非根目录的umask组位的设置与所有者位相同的
(示例:022-> 002,077-> 007)用户,如果uid与gid相同,并且username与主要组名称相同。


因此,当在单个用户系统(例如mine(uid和gid相同))上使用/etc/login.defs创建新文件夹时,为什么在USERGROUPS_ENAB yes上看到以下内容: br />
# The default umask is now handled by pam_umask.
# See pam_umask(8) and /etc/login.defs.


有关更多信息,请参见stat和在线
Ubuntu联机帮助页。

评论


看起来您的第二部分缺少什么? (USERGROUP_ENABLE?)+1获取更新信息

– Lekensteyn
13年4月2日在16:17

@Lekensteyn奇怪的是,/ etc / login.defs中的设置经过检查后肯定是USERGROUPS_ENAB是。该文件的语法有点不寻常。

–user76204
2013年4月2日在16:24

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

– Lekensteyn
13年4月2日在19:20

#3 楼

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

首先,在数学意义上,“掩码”并不意味着“减法” –没有。借用或携带,其次是掩膜;

第三,掩码关闭许可位。如果已经关闭,则umask不会更改权限,例如,假定您必须将umask文件和077目录的系统默认值取消屏蔽666

您将使用的命令是

umask 077


(取消掩码二进制值777

unmask会做的是,如果它们是000 111 111,它将关闭前六个LSB(最低有效位)中的任何一个,并且如果它们中的任何一个已经关闭,则不会进行任何更改。计算方法:

file permisison 666 = 110 110 110 
unmask value    077 = 000 111 111
will result in, 600 = 110 000 000


观察两个1值如何更改为110

类似地,

directory permission 777 = 111 111 111 
unmask value         077 = 000 111 111
will result in,      700 = 111 000 000


评论


这应该是答案!

– Abdlouahab
16 Dec 18'在14:10

@SufiyanGhori因此,如果umask 177(001 111 111),则如果它们为1将关闭前7个最低有效位

– Kasun Siyambalapitiya
17年9月20日在4:38

那是正确的@KasunSiyambalapitiya

– Sufiyan Ghori
17年9月20日在6:32

公式结果=文件权限&(!umask)

–埃里克·霍金斯(Eric Hodgins)
19年7月18日在15:27

@EricHodgins:是的,完全正确。

–阿米特·奈杜(Amit Naidu)
19年7月18日在23:15

#4 楼

这已经很老了,但是值得一提。计算umask,与文件系统权限不同。八进制umask通过使用按位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来确定文件的最终权限,如下所示:

$ 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



文件基本权限:666

umask值:022

减去以获得新文件的权限(666-022)644 (rw-r–r–)


计算目录的最终许可

您只需从基本许可中减去umask即可确定目录的最终许可,如下所示:

666 – 022 = 644



目录基本权限:777

umask值:022

减去以获取新目录的权限(777-022)755 (rwxr-xr-x)



评论


我不认为这是最终许可的计算方式,如果unmask值为077,在这种情况下如何减去666-077呢?

– Sufiyan Ghori
16年5月5日在14:18

@SufiyanGhori Baron的解释不完整以获得文件许可。对于您的情况和将来的计算,为了便于记忆,您应该记住以这种方式将它们相减:6-0 6-7 6-7如果这三个结果中的任何一个为-1,则将其设为0。最终结果600

–Huy.PhamNhu
16-10-28在19:35

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

– maaartinus
17年8月11日在21:35

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

– Wisbucky
17-10-6在21:15

#5 楼

基本概念:

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

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

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


1的mask位意味着阻止/禁用该权限(将屏蔽带放在该位上)。 0的某个位将允许该权限通过(该位上没有屏蔽带)。

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

这是一个使用022 umask的新文件(默认666权限)的计算示例: >这样一来,当您创建一个新文件时,最终得到644的结果。

更简单的方法:

但是如果反掩码计算只是使您感到困惑,使用符号umask表示法的更简单方法。使用此方法时,仅指定传递位而不是掩码位。这意味着禁用umask u=rwx,g=rx,o=rxuser rwx。如果运行此命令,然后检查group rx,将得到other rx

group w表示允许others w通过。这意味着禁用对umask022的所有访问。如果运行此命令,然后检查umask u=rwx,g=,o=,则会得到user rwx

奖金计算:

如果您实际上想了解什么“八进制umask是通过使用按位NOT进行参数的一元补码的按位AND运算得出的”,那么下面的一些逻辑表可以帮助您进行演示。请记住,掩码位group表示禁用,others表示通过。 />
  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)


所以它的公式是:umask