Answers:
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
要将当前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
。
777
说该小组和其他人能够写,而077
不能写?
000
,则文件许可权为777
。因此,使用默认掩码时022
,文件权限不应该是755
,即对应于-rwxr-xr-x
,不是-rw-r--r--
吗?
000
则没有权限将被删除。应用程序喜欢touch
并nano
使用默认666
文件创建文件,因此文件权限将保留,666
但umask的022
将删除组和其他文件的写位,因此666
将其减少为644
aka -rw-r--r--
考虑使用umask的mkdir
默认创建模式会将权限减少至777
022
755
除了在接受的答案中进行了很好的讨论之外,还值得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设置放入其中的默认文件为still ~/.profile
。
Pam_umask
是在Ubuntu操作中至关重要的许多重要PAM模块之一(运行apropos '^pam_'
以查找其他模块的联机帮助页)。在手册页的pam_umask
需要注意的是
pam_umask是一个PAM模块,用于设置当前环境的文件模式创建掩码。umask影响分配给新创建文件的默认权限。
关于默认umask的注释
$HOME
可以mkdir
使用默认的775权限创建新文件夹,touch
使用默认的664权限创建文件,即使默认umask为022也是如此。乍一看,这是矛盾的,值得解释。
尽管在Ubuntu上默认的umask是022,但这不是全部,因为其中有一个设置,/etc/login.defs
如果满足条件,则允许非root用户将umask设置为002(请参见下面的摘录)。在正常安装中,/etc/login.defs
包含设置USERGROUPS_ENAB yes
。这是什么
如果uid与gid相同,并且username与primary相同,则允许将非掩码用户的umask组位设置为与所有者位相同(例如:022-> 002、077-> 007)组名。
因此,stat
当mkdir
在单个用户系统(如mine)上创建新文件夹时,为什么会看到以下内容(uid和gid相同):
Access: (0775/drwxrwxr-x) Uid: ( 1000/username) Gid: ( 1000/username)
有关更多信息,请参见man pam_umask
和
在线Ubuntu联机帮助页。
这已经很老了,但是值得一提。计算umask,与文件系统权限不同。八进制umask通过使用按位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
022
(666-022)
:644 (rw-r–r–)
您只需从基本权限中减去umask即可确定目录的最终权限,如下所示:
777 – 022 = 755
777
022
(777-022)
:755 (rwxr-xr-x)
077
如何减去666-077
呢?
回答的其他人很好地解释了umasking的概念以及为什么需要它。让我加两分钱,并给您一个有关如何实际计算权限的数学示例。
首先,从算术意义上讲,“遮罩”并不意味着“减” –不涉及借用或携带,其次umask
是掩蔽;它不是要减去的数字。
第三,掩码关闭许可位。如果它们已经关闭,则umask
不会更改权限,
例如,假设您必须077
为文件666
和目录的系统默认设置取消屏蔽777
。
您将使用的命令是,
umask 077
(取消屏蔽二进制值000 111 111
)
此取消屏蔽将执行的操作是将关闭前六个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
umask 177
(001 111 111),它将如果它们是关闭第一7至少显著位1
result = file permission & (!umask)
基本概念:
如果您像大多数人一样,并且不理解“通过使用按位NOT的参数的一元补码的按位与”来计算八进制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是通过使用按位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)
如果您使用创建表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)
app_mode 666 rw- rw- rw-
umask 644 --0 -00 -00
file_mode 022 --- -w- -w-