什么是“umask”,它是如何工作的?
我相信umask是控制文件权限的东西,但不完全理解它。
在终端中运行umask 0644
之后,我无法使用命令行文本编辑器nano
读取我创建的文件。 我注意到该文件的权限设置为0022
而不是默认的0755
。
umask是如何工作的? 我想我可以从0777
7 - 6 = 1
和7 - 4 = 3
删除umask中的每个数字,所以我希望权限为0133
,但显然,情况并非如此。
- 什么是umask? 向我解释,就像我是一个“Linux noob”
- 我如何用umask计算?
- 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 write
和others 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 rx
,other rx
。 这意味着禁用group w
,others w
。 如果你运行这个命令然后检查umask
,你将得到022
。 -
umask u=rwx,g=,o=
表示允许user rwx
通过。 这意味着禁用group
和others
所有访问权限。 如果您运行此命令然后检查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)