Lek*_*eyn 216 permissions umask
我相信 umask 是控制文件权限的东西,但并不完全理解它。
运行后umask 0644在终端,我无法读取我用命令行的文本编辑器创建的文件nano。我注意到该文件的权限设置为0022而不是默认的0755.
umask 是如何工作的?我以为我可以从0777, 7 - 6 = 1and 中删除 umask 中的每个数字7 - 4 = 3,所以我希望权限是0133,但显然,情况并非如此。
ajm*_*tch 165
umask 充当应用程序无法在文件上设置的一组权限。它是进程的文件模式创建掩码,不能为目录本身设置。大多数应用程序不会创建具有执行权限集的文件,因此它们的默认值为666,然后由 umask 修改。
由于您已将 umask 设置为删除所有者的读/写位和其他人的读位,777因此应用程序中的默认值将导致文件权限为133. 这意味着您(和其他人)可以执行该文件,而其他人将能够写入该文件。
如果你想让文件不能被除所有者之外的任何人读/写/执行,你应该使用像 umask 这样的 umask077来关闭组和其他人的这些权限。
相比之下,umask of000将使新创建的目录对每个人都可读、可写和可继承(权限为777)。这样的 umask 是非常不安全的,您永远不应该将 umask 设置为000.
Ubuntu 上的默认 umask022意味着每个人都可以读取新创建的文件,但只能由所有者写入:
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
Run Code Online (Sandbox Code Playgroud)
从 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
Run Code Online (Sandbox Code Playgroud)
要查看您当前的 umask 设置,请打开终端并运行以下命令:
umask
Run Code Online (Sandbox Code Playgroud)
要将当前 shell 的 umask 设置更改为其他内容,例如 077,请运行:
umask 077
Run Code Online (Sandbox Code Playgroud)
要测试此设置是否有效,您可以创建一个新文件(现有文件的文件权限不会受到影响)并显示有关该文件的信息,运行:
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
Run Code Online (Sandbox Code Playgroud)
umask 设置由从同一 shell 启动的进程继承。例如,通过gedit在终端中执行来启动文本编辑器 GEdit并使用 gedit 保存文件。您会注意到新创建的文件受到与终端中相同的 umask 设置的影响。
如果您在一个由多个用户共享的系统上,则希望其他人无法读取您的主目录中的文件。为此,umask 非常有用。编辑~/.profile并添加一个新行:
umask 007
Run Code Online (Sandbox Code Playgroud)
您需要重新登录才能使此 umask 更改~/.profile生效。接下来,您需要通过删除全局的读取、写入和执行位来更改主目录中文件的现有文件权限。打开终端并执行:
chmod -R o-rwx ~
Run Code Online (Sandbox Code Playgroud)
如果您希望将此 umask 设置应用于系统上的所有用户,您可以在/etc/profile.
Suf*_*ori 42
其他回答已经很好地解释了 umasking 的概念以及为什么需要它。让我加上我的两分钱,并给你一个关于如何实际计算权限的数学示例。
首先,在算术意义上,“掩码”并不意味着“减法”——不涉及借位或进位。
其次,“掩码”应该被理解为按位:独立地对每个位列应用逻辑运算。也就是说,许可位序列的第 4 位仅与掩码的第 4 位交互。
第三,掩码关闭权限位。如果它们已经关闭,则umask不会更改权限,
例如,假设您必须077从系统默认的文件 is666和目录中取消屏蔽777。
您将使用的命令是
umask 077
Run Code Online (Sandbox Code Playgroud)
(以二进制形式取消掩码值,000 111 111)
此取消屏蔽的作用是关闭前六个 LSB(最低有效位)中的任何一个(如果它们是),1并且如果它们中的任何一个已经关闭,则不会进行任何更改。
以下是最终权限的计算方式:
file permission 666 = 110 110 110
unmask value 077 = 000 111 111
will result in 600 = 110 000 000
Run Code Online (Sandbox Code Playgroud)
观察两个110值如何变为000。
相似地,
directory permission 777 = 111 111 111
unmask value 077 = 000 111 111
will result in 700 = 111 000 000
Run Code Online (Sandbox Code Playgroud)
小智 39
除了在已接受的答案中进行了很好的讨论之外,还值得添加更多关于 的观点umask,参考 12.04 及以后版本的管理方式。
Umask 和 pam_umask
默认 umask 现在是 in/etc/login.defs而不是 in /etc/profile,正如官方注释中/etc/profile所写:
# The default umask is now handled by pam_umask.
# See pam_umask(8) and /etc/login.defs.
Run Code Online (Sandbox Code Playgroud)
Pam_umask下面简单解释一下,应该说,用户放置自定义umask设置的默认文件仍然是~/.profile.
Pam_umask是许多重要的PAM 模块之一,对 Ubuntu 的操作至关重要(运行apropos '^pam_'以查找其他模块的联机帮助页)。在手册页的pam_umask需要注意的是
pam_umask 是一个 PAM 模块,用于设置当前环境的文件模式创建掩码。umask 影响分配给新创建的文件的默认权限。
关于默认 umask 的说明
即使默认 umask 为 022 ,$HOME也可以mkdir使用默认 775 权限创建新文件夹,并touch使用默认 664 权限创建文件。乍一看,这似乎是矛盾的,值得解释。
虽然 Ubuntu 上的默认 umask 是 022,但这并不是全部,因为/etc/login.defs如果满足条件,有一个设置允许非 root 用户的 umask 为 002(参见下面的摘录)。在正常安装中,/etc/login.defs包含设置USERGROUPS_ENAB yes. 这是什么
对于非 root 用户,如果 uid 与 gid 相同,且用户名与主用户相同,则启用 umask 组位的设置与所有者位相同(例如:022 -> 002, 077 -> 007)团队名字。
因此,为什么在我这样的单用户系统上stat创建新文件夹时会看到以下内容mkdir(uid 和 gid 相同):
Access: (0775/drwxrwxr-x) Uid: ( 1000/username) Gid: ( 1000/username)
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参阅man pam_umask和
Ubuntu 联机帮助页。
amr*_*mrx 37
这是相当古老的,但这是值得一提的。为umask 计算,不同于文件系统权限。八进制 umasks 是通过使用按位非的参数的一元补码的按位与来计算的。八进制符号如下:
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
Run Code Online (Sandbox Code Playgroud)
然后您可以计算设置 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
Run Code Online (Sandbox Code Playgroud)
您可以简单地从基本权限中减去 umask 以确定文件的最终权限,如下所示:
666 – 022 = 644
Run Code Online (Sandbox Code Playgroud)
666022(666-022):644 (rw-r–r–)您可以简单地从基本权限中减去 umask 以确定目录的最终权限,如下所示:
777 – 022 = 755
Run Code Online (Sandbox Code Playgroud)
777022(777-022):755 (rwxr-xr-x)wis*_*cky 23
基本概念:
如果你和大多数人一样,不明白“八进制 umasks 是通过使用按位非参数的一元补码的按位 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)
Run Code Online (Sandbox Code Playgroud)
所以这就是你在创建新文件时得到 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=表示允许通过 for user rwx。这意味着禁用所有访问group和others。如果你运行这个命令然后检查umask,你会得到077.奖金计算:
如果您真的想了解“八进制 umasks 是通过使用按位 NOT 的参数的一元补码的按位 AND 计算出来的”的意思,这里有一些逻辑表可以帮助演示。请记住,掩码位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)
Run Code Online (Sandbox Code Playgroud)
如果你用 制作表格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)
Run Code Online (Sandbox Code Playgroud)
所以它的公式是: result = perm AND (NOT mask)