问题描述
我相信umask是控制file permissions的东西,但并不完全理解它。
在terminal中运行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设置,请运行以下命令: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_umask
的manpage中注意到
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_umask
和Ubuntu 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 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符号有一个更简单的方法。当您使用此方法时,您只需指定pass-through位而不是掩码位。
-
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
。
奖金计算:
如果你真的想了解什么“八进制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)