答案1
umask 是一组应用程序无法对文件设置的权限。它是文件模式创建掩码,用于进程并且不能为目录本身设置。大多数应用程序不会创建设置了执行权限的文件,因此它们的默认值为666
,然后由 umask 进行修改。
由于您已将 umask 设置为删除所有者的读/写位和其他人的读位,因此777
应用程序中的默认设置将导致文件权限为133
。这意味着您(和其他人)可以执行该文件,而其他人将能够写入该文件。
如果您希望文件不能被所有者以外的任何人读取/写入/执行,则应使用 umask 来077
关闭组和其他人的相应权限。
相反,umask 为000
时,新建的目录对所有人都是可读、可写、可继承的(权限为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
从 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
查看和修改 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 启动的进程继承。例如,通过gedit
在终端中执行来启动文本编辑器 GEdit,然后使用 gedit 保存文件。您会注意到,新创建的文件受到与终端中相同的 umask 设置的影响。
用例:多用户系统
如果您的系统由多个用户共享,则希望其他人无法读取您主目录中的文件。为此,umask 非常有用。编辑~/.profile
并添加新行:
umask 007
您需要重新登录以使此 umask 更改~/.profile
生效。接下来,您需要通过删除所有人的读取、写入和执行位来更改主目录中文件的现有文件权限。打开终端并执行:
chmod -R o-rwx ~
如果您希望将此 umask 设置应用于系统上的所有用户,您可以编辑系统范围的配置文件/etc/profile
。
答案2
其他回答者已经很好地解释了 umasking 的概念以及为什么需要它。让我补充一下我的看法,并给你一个数学例子来说明权限是如何计算的。
首先,从算术意义上来说,“mask”并不意味着“减去”——不涉及借位或进位。
其次,应该理解“面具”按位而是:对每个位列独立应用逻辑运算。也就是说,权限位序列的第 4 位仅与掩码的第 4 位交互。
三、口罩变离开权限位。如果它们已经关闭,umask
则不会对权限进行任何更改,
例如,假设您必须077
从系统默认值中取消屏蔽文件的666
和目录的777
。
您将使用的命令是
umask 077
(以二进制形式显示隐藏值,000 111 111
)
此取消屏蔽将执行的操作是,如果前六个 LSB(最低有效位)已关闭,它将关闭其中任何一个,1
如果其中任何一个已关闭,它将不做任何更改。
最终许可的计算方法如下:
file permission 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
答案3
除了在接受的答案中进行的良好讨论之外,还值得添加一些有关的观点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 会影响分配给新创建文件的默认权限。
关于默认 umask 的说明
$HOME
即使默认的 umask 为 022,也可以使用默认的 775 权限在 中创建新文件夹mkdir
,使用默认的 664 权限创建文件。touch
乍一看,这似乎是矛盾的,值得解释一下。
虽然 Ubuntu 上的默认 umask 是 022,但这并不是全部,因为 中有一个设置/etc/login.defs
允许非 root 用户的 umask 在满足条件时为 002(见下文摘录)。在正常安装中,/etc/login.defs
包含设置USERGROUPS_ENAB yes
。这就是
对于非 root 用户,如果 uid 与 gid 相同,并且 username 与主组名相同,则允许将 umask 组位设置为与所有者位相同(例如:022 -> 002、077 -> 007)。
stat
因此,当在单用户系统(例如我的系统)上创建新文件夹时,您会看到以下内容mkdir
(uid 和 gid 相同):
Access: (0775/drwxrwxr-x) Uid: ( 1000/username) Gid: ( 1000/username)
有关详细信息,请man pam_umask
参阅
Ubuntu 在线手册页。
答案4
基本概念:
如果你和大多数人一样,不明白到底是什么“八进制 umask 是通过使用按位非对参数的一元补码进行按位与来计算的”意思是,这是我的简单解释:
首先,想想什么是“掩码”。掩码会阻挡某些东西。想想遮蔽胶带。在这种情况下,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
。
奖金计算:
如果你真的想了解什么“八进制 umask 是通过使用按位非对参数的一元补码进行按位与来计算的”意思是,这里有一些逻辑表可以帮助演示。请记住,掩码位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)