文件权限详解

本文省略了对linux文件权限和umask基本知识的介绍,有需要的了解的博友可以参看其他资料。

刚开始接触Linux时对于文件权限的理解并不是很透彻,这里详细介绍一下数字文件权限和字母文件权限的对应关系,以帮助Linux入门初学者尽快的完成对文件权限的理解,尽快学习Linux系统更深层次内容。

Linux下,查看某路径下用(ls -l)查看所有文件的详细属性列表时,会看到文件的操作权限,类似“drwxr-xr-x”的字符串。

这串字符可以分成4段理解,结构为“d + 文件所有者操作权限 + 文件所有者所在组操作权限 + 其余人的操作权限”:

1,第一段:例子中字母“d”,表示文件所在目录

2,第二段:例子中字符串“rwx”,表示文件所有者对此文件的操作权限

3,第三段,例子中字符串“r-x”,表示文件所有者所在组对些文件的操作权限

4,第四段,例子中字符串“r-x”,表示除2、3两种外的任何人对此文件的操作权限

通常用三个数字来表示文件的读取、写入、执行权限:

执行:1

写入:2

读取:4

随便写个数字:755,这个3位数分别对应前面所说的分段:7对应第二段,5对应第三段,5对应第四段。

含义:

7:表示文件所有者的权限,4+2+1=7,即文件所有者对该文件有生杀大权,读、写、执行随便。

5:表示文件所有者所在组的权限:4+1=5,即文件所有者所在组对文件有读、执行权限,没有写权限。

5:同上,其余人对该文件只有读、执行权限,没有写权限。

具体使用——例 :  chmod 755 文件名。

 

 

1)简单好用的加减法计算(老男孩推荐)

特别说明:第一种计算法简单、易用、好记,但是由于大部分网友都直接用减法(不考虑此方法的特殊性而被批判)或被某些书籍误导甚至不相信不敢用这个方法了。其实,学习就是一个记忆的思路而已,没有对错,就是多思考多实践,然后,总结一个小技巧结论,有利于自己学习记忆就够了。

最后,老男孩想说的是学习总结结论不是做科学,所以,未必就需要那么严谨,有伪科学的小结论很正常(但追求严谨的心态必须要有),例如:nginx服务配置的标准是什么,mysql优化的标准是什么,装linux系统选择安装包的标准是什么,给系统分区的标准是什么,其实,这些都是没标准答案的,但是这不影响我们学好linux运维,这就是老男孩传导给大家的思维。

文件权限计算小结论:

创建文件默认最大权限为666 (-rw-rw-rw-),默认创建的文件没有可执行权限x位。

对于文件来说,umask的设置是在假定文件拥有八进制666的权限上进行的,文件的权限就是666减去umask(umask的各个位数字也不能大于6,如,077就不符合条件)的掩码数值;重点在接下来的内容,如果umask的部分位或全部位为奇数,那么,在对应为奇数的文件权限位计算结果分别再加1就是最终文件权限值。

创建目录默认最大权限777(-rwx-rwx-rwx),默认创建的目录属主是有x权限,允许用户进入。
   
对于目录来说,umask的设置是在假定文件拥有八进制777权限上进行,目录八进制权限777减去umask的掩码数值。

文件权限的一般计算方法:

默认文件权限计算方法

1)假设umask值为:022(所有位为偶数)

6 6 6    ==>文件的起始权限值

0 2 2 -   ==>umask的值

---------

6 4 4

2)假设umask值为:045(其他用户组位为奇数)

6 6 6    ==>文件的起始权限值

0 4 5 -   ==>umask的值

---------

6 2 1  ==>计算出来的权限。由于umask的最后一位数字是5,所以,在其他用户组位再加1

0 0 1 +

---------

622 ==>真实文件权限


默认目录权限计算方法

 7 77     ==>目录的起始权限值

 0 22 -    ==>umask的值

---------

 7 55

规范成图表如下:

文件权限详解_第1张图片
实例一:umask所有位全为偶数时,多数读者对这个例子无疑问

[root@oldboy oldboy]# umask

0022 #→umask当前数值

[root@oldboy oldboy]# umask 044 #→更改为044

[root@oldboy oldboy]# umask

0044

[root@oldboy oldboy]# mkdir umask_test #→建目录测试

[root@oldboy oldboy]# ls -ld umask_test

drwx-wx-wx 2 root root 4096 Nov 12 19:21umask_test #→对应数字权限为733,是不是符合上面的计算方法?

[root@oldboy oldboy]# touchumask_test.txt

[root@oldboy oldboy]# ls -lumask_test.txt

-rw--w--w- 1 root root 0 Nov 12 19:21umask_test.txt #→对应数字权限为622,是不是符合上面的计算方法?

实例二:umask值的部分或全部位为奇数时,这个是读者疑问最大的

umask值的其他属组位为奇数时

[root@oldboy oldboy]# umask 0023

[root@oldboy oldboy]# mkdir dir

[root@oldboy oldboy]# touch file

[root@oldboy oldboy]# ls -l

总计 4

drwxr-xr-- 2 root root 4096 11-15 01:04dir  #→对应数字权限为754

-rw-r--r-- 1 root root    0 11-15 01:04 file #→对应数字权限为644

提示:根据前面的计算方法,当umask为0023时,dir的权限应该是754,而file的权限应该为643,但是由于umask的其他组位为奇数,因此最终权限为其他组位加1,即643加001(对应实践结果644)。注意:umask为偶数的位不要加1。

实例三:umask值的所有位为奇数时

 [root@oldboy oldboy]# umask 0551

[root@oldboy oldboy]# umask

0551

umask 为0551根据掩码方法计算:目录权限为226,文件权限115,而实际文件权限为226(umask的三个权限位都是奇数,所以,每个位分别加1就是正确的权限)

[root@oldboy oldboy]# mkdir dir5

[root@oldboy oldboy]# touch file5

[root@oldboy oldboy]# ls -l

总计 4

d-w--w-rw- 2 root root 4096 11-15 01:27dir5  #→目录对应数字权限为226

--w--w-rw- 1 root root    0 11-15 01:27 file5 #→目录对应数字权限为226

再来一例验证下:

[root@oldboy oldboy]# umask 0333

[root@oldboy oldboy]# umask

0333

umask 为0333根据掩码方法计算:目录权限为444,文件权限333,而实际文件权限为444(umask的三个位都是奇数,所以,每个位分别加1就是正确的权限)

[root@oldboy oldboy]# mkdir dir3

[root@oldboy oldboy]# touch file3

[root@oldboy oldboy]# ls -l|grep 3

dr--r--r-- 2 root root 4096 11-15 01:30dir3  #→目录对应数字权限为444

-r--r--r-- 1 root root    0 11-15 01:30 file3 #→目录对应数字权限为444

2)通过8进制字母符号计算(记忆此法也可)

拿上面的实例3验证。

[root@oldboy oldboy]# umask 551

umask值为551,对应的权限为-r-xr-x--x,即所有的文件和目录都取消权限中的-r-xr-x--x权限。

文件权限:【-rw-rw-rw---r-xr-x--x=--w--w--rw-=226(文件的x位上没有x,就不用取消了)

目录权限:【-rwxrwxrwx--r-xr-x--x=--w--w--rw-=226(目录的x位上有x,直接取消即可)

继续拿前面的例子验证:

[root@oldboy oldboy]# umask 333

umask值为333,对应的权限为-wx-wx-wx,即所有的文件和目录都取消权限中的-wx-wx-wx权限。

文件权限:【-rw-rw-rw---wx-wx-wx=-r--r--r--=444(文件的x位上没有x,就不用取消了)

目录权限:【-rwxrwxrwx--wx-wx-wx=-r--r--r--=444(目录的x位上有x,直接取消即可)

3)通过二进制方法计算(不好记忆不推荐)

通过进制之间转换,八进制转成二进制来计算。

0022

0   2   2      

----------  #→八进制转换二进制

0   10  10

说明:把umask值八进制转换成二进制

 

6   6   6

------------    #→八进制转换二进制

110 110 110

说明:把文件默认最大权限值八进制转换成二进制

 0 10  10      #→umask二进制

-------------       #→与运算

110 110 110     #→文件最大权限二进制

-------------

000 010 010

-------------       #→转换八进制

 0 2   2

说明:最后得到的值是022,然后使用666减去022,那么文件的创建权限就是644

[root@oldboy oldboy]# umask 551

[root@oldboy oldboy]# umask

0551

5   5     1

-------------       #→转换二进制

101 101 001     #→umask二进制

-------------       #→与运算

110 110  110       #→文件最大权限二进制

-------------      

100 100  000

-------------       #→转换八进制

4   4   0

说明:最后得到的值是440,然后使用666减去440,那么文件的创建权限就是226。

你可能感兴趣的:(嵌入式,Linux)