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将其减少为644aka -rw-r--r--考虑使用umask的mkdir默认创建模式会将权限减少至777022755
除了在接受的答案中进行了很好的讨论之外,还值得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
666022(666-022):644 (rw-r–r–)您只需从基本权限中减去umask即可确定目录的最终权限,如下所示:
777 – 022 = 755
777022(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 -00file_mode 022 --- -w- -w-