在终端中运行
umask 0644
后,我无法读取使用命令行文本编辑器nano
创建的文件。我注意到该文件的权限设置为0022
而不是默认的0755
。umask如何工作?我以为我可以从
0777
,7 - 6 = 1
和7 - 4 = 3
删除umask中的每个数字,所以我希望权限为0133
,但显然不是这种情况。是umask吗?向我解释一下,就像我是“ Linux新手”一样如何使用umask进行计算?
umask的用例是什么?
#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 write
和others write
,并允许所有其他权限通过。 > 计算:
这是一个使用022 umask的新文件(默认666权限)的计算示例: >这样一来,当您创建一个新文件时,最终得到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
。奖金计算:
如果您实际上想了解什么“八进制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
评论
app_mode 666 rw- rw- rw- umask 644 --0 -00 -00 file_mode 022 --- -w- -w-askubuntu.com/q/186747/459652