umask历史

就是起源、发展之类的

umask 指令

umask (显示设定值)
umask nnn (设定umask,设定值为000~777的整数)

umask 指令的功能是用来“限定”每一个新增的档案、目录的基本使用权限(permission)。譬如说当使用者以编辑器新产生的档案,或者是从系统的某处拷贝来的新档案,或者是以输出重导向的方式产生的新档案,或是以指令 mkdir 新建的目录等等,一切新产生的档案、目录,它们的最初使用权限,均会受到这个内建指令 umask 的设定值所影响。就是我所说的“限定”。

指令里的 nnn 所代表的意义与 chmod 指令的 nnn 相似。不同的是 chmod 指令 nnn 是“给於”使用或者是将要改变的许可权限,而 umask 则是“取消”nnn 的使用许可权限。这点是根本性的差异,使用者必须分清楚。

指令 umask 的设定值以三个八进位的数字“nnn”代表。第一个设定数字给使用者自己(owner user),第二个则是设定给用使用者所属的群体(group),第三个给不属於同群体的其它使用者(other)。每一位数字的设定值都是三项不同权限的数值加总,read 权限数值为 4;write 权限数值为 2;execute 权限数值为 1。结合了前三者的权限数值,单一的数字可设定的范围是 0 ~ 7;整体的可设定范围是 000 ~ 777。

要知道设定后会得到什麼结果。原则上,方法很简单。就是用最大值减去设定值即可得到你想要知道的结果。对目录而言最大值是 777;对档案而言,最大值则是 666。这个方法对目录而言完全正确;但对档案而言会有无法应付的意外。

以下为了说明上的方便,我将以实际运用上,不可能会采用的设定值 067 作为本节例子来加以说明。

譬如当你设定 umask 为 670 ,使用档案的最大值 666 减去设定值 670,得到的是数值是 负4,已超出数值的定义范围变成没有任何意义的数值。但真正使用者会得到的结果却是档案对 other 开放 rw 权限;对 owner 与 group 关闭所有权限。所以使用者无法使用减去的方法来获得完全正确的结果。

表面上,C shell 让系统使用者使用 umask 时只需输入一组 3 个数字的设定值。但是,这组设定值对於目录及档案却有著不同的作用结果。所以农夫我打算更进一步地说明其中运作的细节,让看官们能完全的理解。

对系统程式而言,内建指令 umask 的设定值实际上是群组化的参数,也就是 S_IRWXU、S_IRWXG、S_IRWXO。代表的群组情况如下:

S_IRWXU = S_IRUSR | S_IWUSR | S_IXUSR
S_IRWXG = S_IRGRP | S_IWGRP | S_IXGRP
S_IRWXO = S_IROTH | S_IWOTH | S_IXOTH
也就是说 umask 所设定的三个数字,其实包含了九个不同意涵的参数,用来对映九种不同的使用权限,这些参数会被要产生档案的程式,或者是要产生目录的程式带入并执行出结果。一个 C shell 的使用者必须要有能力完全掌握 umask 的设定,并演算出设定后所得到的结果。

系统在产生一个新目录,会完全使用到上述的九种权限的参数,所以最大值是 777 ,这对 umask 内建指令而言,可以很容易地使用减去权限的方法来获得正确的结果。但在产生一个新档案时,就不是如此。

系统在产生一个新档案时,creat function 只取用 read 与 write 权限相关参数,也就是 access permission bits 里的 S_IRUSR, S_IWUSR, S_IRGRP, S_IWGRP, S_IROTH, S_IWOTH 来定义产生的档案应该具有何种程度的权限。由於 read(数值 4) 与 write(数值 2) 的权限相加的结果是 6。所以最大的有效数值为 666。至於所有的 execute 权限(数值 1)在此被忽略(access permission bits 为 S_IXUSR, S_IXGRP, S_IXOTH),所以 creat function 在输出时一律定义为 0,也就是无执行的权限。会对档案如此限制的理由其实很容易理解。因为几乎不可能有一个使用者他的所有档案都绝对必要被固定成为给予 execute 权限(档案包含的型态相当多,如文字档、资料档、图形档、执行档等等),如果功能被如此设定的话,反而会造成相当多的系统漏洞,所以必须管制成必要时再由使用者自己来打开 execute 权限(这就是为什麼每当你新编辑完成的 C Shell script ,还要用指令 chmod 来加上可执行使用权限才能执行的原因)。

明了上述的原因之后,看官们您能理解,指令 umask 的设定值里面,如果包含了 excute 权限,又运算产生档案的使用权限时,应该要先减去(或者应该称为 disable),才来作运算。所以当设定值为 670,其中是第二位数字是奇数,明显的包含了 S_EXGRP 的数值,所以先减去 1,所已有效设定为 660。此时使用最大值 666 减去 660,得到的便是正确的档案使用权限。

农夫我使用最大值减去设定值的方式来说明,对一般的使用者应该能较容易理解与运用。在前一版的文字说明中,我曾经提到计算的方式此用的是 XOR 运算法则,它才是实际上程式的运算法则。也就是设定值被程式拆成参数后的参数演算法则。我想学习过逻辑运算的人都清楚 XOR 的运算方式(如右图所示)。

以下我使用设定值 067 当作例子,以 XOR 的演算法则来实际设定会应该得到的结果。

希望看官们,能理解以上的说明(农夫我发觉改写后的版本,看起来实在相当罗唆)。以下提供一些比较常用的设定值供看官们参考:

档案权限的最大值
设定值 结果 代表的使用权限
666 002 664 rw-rw-r--
666 022 644 rw-r--r--
666 037 640 rw-r-----
666 077 600 rw-------
目录权限的最大值
设定值 结果 代表的使用权限
777 002 775 rwxrwxr-x
777 022 755 rwxr-xr-x
777 037 740 rwxr-----
777 077 700 rwx------

顺便附上单一设定值与档案及目录的互动对照表,如下:

umask
设定值
档案
使用许可权
目录
使用许可权

0
rw-
rwx

1
rw-
rw-

2
r--
r-x

3
r--
r--

4
-w-
-wx

5
-w-
r--

6
---
--x

7
---
---

假如使用者想要显示 umask 的设定值,可键入指令 umask,设定值即会显示出:

% umask
22

以上所显示的设定值“22”即代表“022”。因第一个数字为“0”时不显示。假如显示值为“2”则代表“002”,显示值为“0”则代表“000”。一般系统的常用的设定值有“002”、“022”、“037”或“077”等几种。

接著我们实际来设定指令并观看其使用结果:

5 % umask 022 ; umask
22
6 % ls -l > aa ; ls -l aa
1 -rw-r--r-- 1 akira 61 Aug 31 11:32 aa
7 % mkdir dd ; ls -l
total 2
1 -rw-r--r-- 1 akira 61 Aug 31 11:32 aa
1 drwxr-xr-x 2 akira 512 Aug 31 11:33 dd/

一般而言如果使用者要自行设定或更改这个指令的设定值,最好的方式是将这个指令放在“~/.cshrc”档案中,让 C Shell 来为你执行。如果 login 后还有须要更动,可直接在指令行模式下键入指令重新设定之。如果使用者不自行设定则系统会给於系统的设定值,一般均为“022”。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2007-06-04
其实,这只不过是一个函数而已,并没有什么历史好说的。
以下这些可能会对您有些帮助:

这是Linux中的umask函数

我们创建文件的默认权限是怎么来的?如何改变这个默认权限呢?

umask是什么?

当我们登录系统之后创建一个文件总是有一个默认权限的,那么这个权限是怎么来的呢?这就是umask干的事情。umask设置了用户创建文件的默认权限,它与chmod的效果刚好相反,umask设置的是权限“补码”,而chmod设置的是文件权限码。一般在/etc/profile、$ [HOME]/.bash_profile或$[HOME]/.profile中设置umask值。

如何计算umask值?
umask命令允许你设定文件创建时的缺省模式,对应每一类用户(文件属主、同组用户、其他用户)存在一个相应的umask值中的数字。对于文件来说,这一数字的最大值分别是6。系统不允许你在创建一个文本文件时就赋予它执行权限,必须在创建后用chmod命令增加这一权限。目录则允许设置执行权限,这样针对目录来说,umask中各个数字最大可以到7。

该命令的一般形式为:umask nnn
其中nnn为umask置000 - 777。

我们只要记住u m a s k是从权限中“拿走”相应的位即可。下表是umask值与权限的对照表:
umask 文件 目录
--------------------
0 6 7
1 6 6
2 4 5
3 4 4
4 2 3
5 2 2
6 0 1
7 0 0
--------------------

如:umask值为022,则默认目录权限为755,默认文件权限为644。
相似回答