[TOC]
在了解linux权限时发现了一篇关于umask非常不错的文章,但他是用英语写的,对英语要求不用太高就能看懂,感兴趣的可以看原文。前面说了英语要求不高,所以我干这个不是为了彰显什么我的英语水平(有些句子都还需靠谷歌翻译...),纯属无聊和对这篇文章的喜欢,有错虚心接受,没有错最好!
以下翻译后的所有内容:
关于umask
返回或设置系统文件模式创建掩码的值
具体描述
在Linux和其他类Unix的操作系统中,新的文件被创建是会有一系列默认权限设置。特别的,通过一个应用名为umask设置掩码,特别的限制一个新文件的权限。umask命令用来设置掩码,或者获取它当前的值。
umask命令语法格式
umask [-s] [mask]
选项
选项 | 含义 |
---|---|
-s | 接受或返回一个代表掩码的符号 |
mask | 如果指定了一个合理的掩码,这个umask就将被设置为这个值。如果没有指定掩码,返回当前的掩码值 |
什么是权限,它们是怎么工作的
我们都知道系统里的每个文件都被绑定一系列权限去保护文件,一个文件的权限决定了那个用户能操作它,能进行什么操作。
大体上有三种用户类别:
- 文件的拥有者(“User”)
- 和文件拥有者一组的组员(“Group”)
- 除了root和以上两种的其他用户(“Other”)
反过来,对于这几类的用户,有三种对文件的操作分类:
- 查看文件内容的权限--读(“Read”)
- 改变文件内容的权限--写(“Write”)
- 在系统中将文件内容作为一个程序运行的权限--执行(“Execute”)
因此,对于每一类的用户,都有三种权限,这些信息加在一起构成了文件的权限。
如何表示权限
有两种方法表示一个文件的权限:符号表示(用像“r”对应读,“w”对应写,“x”对应执行这样的符号)或者用一个八进制数值表示。
比如,当用下面的命令行列出一个目录下的内容
ls -l
你能看到(在其他别的信息中)每个文件的文件权限信息,通过符号的方式显示,向下面这样:
-rwxr-xr--
有十个符号,第一个横线“-”表示这是一个“普通”文件,不是一个目录(或者其他快文件或者其他之类的)。其余的九个符号代表的是用户权限:rwxr-xr--。这从九个符号左到右其实就是三组对应于三类用户的文件权限:
符号 | 含义 |
---|---|
rwx | 文件所有者可以读、写或者执行文件 |
r-x | 组员可以读或者执行这个文件,但是不能修改 |
r-- | 其他用户可以读这个文件,但是不能写或者执行这个文件 |
用符号指定新建文件的掩码
组成掩码的符号通常如下所示:
[user class symbol(s)][permissions operator][permission symbol(s)][,]...
权限符号可以是r(读),w(写),x(执行)的任意组合,就像上面的那样。
用户类别符号可以是以下的一个或者多个:
符号 | 含义 |
---|---|
u | User(文件所有者) |
g | Group(在文件定义组中的任一成员) |
o | Other(其他成员) |
a | All(相当于ugo) |
权限操作符可能是以下的一种:
符号 | 含义 |
---|---|
+ | 允许赋予指定用户指定的文件权限(没有指定的权限在掩码中是不能被改变的) |
- | 禁止特定的文件权限被赋予给某一种用户类别(没有指定的权限在掩码中是不能被改变的) |
= | 赋予一种用户拥有其他某种用户的文件权限(在文件创建时没有指定的权限将会被禁止被掩码赋予给用户) |
比如下面的这个umask命令行:
umask u+w
就是设置掩码去赋予创建文件的用户(也就是文件拥有者)写的权限。其他的文件权限将不能被系统默认的所改变。
一次可以通过几组逗号隔开的符号(而不是空格)指定多个权限:
umask u-x,g=r,o+w
这个命令可以设置掩码这样后面新建的文件我们就能有下面的这样的权限:
- 禁止文件所有者的写的权限,而其他所有者权限没有改变;
- 赋予了组员读文件权限,而禁止了其写和执行的权限;
- 赋予其他用户写的权限,而其他权限没有改变
值得注意的是如果你用了“=”却没有指定权限如下面这样:
umask a=
将会设置掩码让文件对所有用户没有任何操作权限!
用数字指定新建文件的掩码
新建文件的掩码也能通过用八精制数字表示。当使用这些八进制文件表示时,特定我的狮子代表特定的权限,而且这些数字通过相互加减来代表最终的权限组合值,特别是数字1,2和4分别代表以下权限:
数字 | 权限 |
---|---|
4 | read |
2 | write |
1 | execute |
用这些数字是因为这三个数字组成的值都是独一无二的,下表演示的就是他们组成的值:
读 + | 写 + | 执行= | 组合值 | 对等的符号 |
---|---|---|---|---|
0 | 0 | 0 | 0 | |
0 | 0 | 1 | 1 | x |
0 | 2 | 0 | 2 | w |
0 | 2 | 1 | 3 | wx |
4 | 0 | 0 | 4 | r |
4 | 0 | 1 | 5 | rx |
4 | 2 | 0 | 6 | rw |
4 | 2 | 1 | 7 | rwx |
即读 + 写 + 运行 = 组合值,读是4,写是2, 执行时1,既能读又能写就是2+4=6,以此类推.
对于每种用户来说,一个数字就可以代表他们的权限;上面的例子我们能代表想rwxr-xr-- 这样的符号表示,使用三个八进制数字754,每个个数字的代表的顺序是:User,Group,Other。
其他权限数
在八进制代表文件权限方法的表示中,却有有四个数字。其中后三个数字是我们需要重点谈论的,而第一个数字是一个特殊文件权限表示符。出于(for the purpose of)讨论的目的我们暂且将其认为是0.因此现在开始(from here on out)我们讨论文件权限为777时,表示的是0777。
所以Umask是具体是怎么工作的呢?
The umask masks permissions by restricting them by a certain value.
umask通过权将权限限制为某个值来屏蔽权限(from google translate)
实质上(Essentially),umask的每个数字都会被系统自带的默认值“减去”来达到你所定义的默认值。不是真的减去;技术上来说(technically),掩码的补码(它的按位补码bitwise compliment
)然后它的将被使用逻辑and操作去做默认权限。结果就是在创建文件时umask告诉系统哪些权限位关闭。因此这不是真的减法,但是是相似的概念,把它想成减法有助于理解。
在linux中,一个普通文件的默认权限值是666,文件夹的是777。当创建一个文件或文件夹时,内核(kernel)会调用默认值“减去”umask值,去得出新文件的权限。
这个列表展示的是umask中每个数字对应的文件或文件夹的权限:
umask数字值 | 默认的文件权限 | 默认的文件夹权限 |
---|---|---|
0 | rw | rwx |
1 | rw | rw |
2 | r | rx |
3 | r | r |
4 | w | wx |
5 | w | w |
6 | x | x |
7 | (no permission allowed) | (no permission allowed) |
因此,如果umask的值是022,默认新文件的有默认权限值是644(666-022)。类似的(Likewise),新新文件夹的权限就是755(777-022)
umask 例子
查看当前umask的值,输入命令行:
umask
会返回你系统四位八进制的umask值。
再者,第一个0是个特殊权限值而且不可忽视,在这里对我们来说,0002相当于002。
我们可以在后面加上-S标签查看其符号表示
umask -S
会显示符号信息:
上面的u表示的是user,g表示group,o就表示其他用户。这告诉我们如果我们创建一个文件,会有默认权限664,是由666-002得出的!
我们用touch命令新建一个文件测试下:
umask -S
touch testfile
ls -l testfile
译者注:rw就等于6,所以上面显示的-rw-rw-r--的八进制表示就是664(即 666 - 002得出!)
正如预期的那样,新文件的权限为-rw-rw-r--,或者是664,owner和group能读和写,other只能读。
现在修改umask,通过以下命令行设置umask为022
umask 022
这个和运行umask 0022是一样的;如果你只指定三个数字,第一个数字将会被假设为0。让我们验证这个改变的发生:
umask
再创建一个文件:
touch testfile2
现在我们可以看下列出的文件信息,使用通配符去看所有testfile开头的文件:
ls -l "testfile*"
如图,testfikle2的权限就成为了644。
下面是一些其他umask的命令行:
umask a+r
设置掩码让所有用户能读新文件,其他的权限不能从默认修改。
umask a-x
设置掩码让所有用户都不能执行这个新文件,其他的默认权限不能从默认中修改!
umask u=we,go=
设置文件拥有者能读写但不能执行新文件,组成员其他用户不能操作此文件。
umask 777
设置文件不能被所有用户操作
umask 000;
让新建的文件可被所有用户读写和执行,然而这是个坏主意,最好不要这样做!
相关命令
chmod --- 改变文件或文件夹的权限
csh --- C chell命令解释器
ksh --- Korn . . .
sh --- Bourne shell . . .
网友评论