linux文件权限控制命令为chmod
权限数字可以用四位数字表示,常见的如 4764、0742等等,一些拿0764举例说明;
(1)四位数字代表的意义
这四位数字分别表示用户id位,属主权限位,组权限位,其他用户权限位,如4764这个权限值,:
4为用户id位,该字段表明的是特殊含义,下面单独描述。
7为属主权限位,表示文件或文件夹所有者的权限,chmod用u表示(user的首写字母)。
6为组权限位,表示文件或文件夹所有者所在组的权限,chmod用g表示(goup的首写字母)。
4为其他用户权限位,表示其他用户的权限(非所有者,也非所有者所在组 的用户),chmod用o表示(other的首写字母)。
(2) 属主权限位、组权限位、其他用户权限位每一位数字的含义
属主权限位、组权限位、其他用户权限位,只是描述对象不同,其具体的值含义是一样的,用来表明描述对象的读、写、执行权限。
拿4764的属主权限位 7 来举例:
转化为二进制为:111,是一个3位数,分别表示读(r)、写(w)、执行(x)权限,1表示有该权限 0表示没有该权限,这里7表示有读、写、执行的权限(简写为rwx)。
那么4764的组权限为6的含义:
转化为二进制: 011 表示无读的权限,有写的权限和执行的权限。
(3)用户id位
用户id位 ,同样可以分解成三位二进制,
拿4764的用户id位 4 来举例:
转化为二进制: 100,分别表示setuid,setgid,sticky
setuid只能用于可执行文件中,表示在文件执行时,执行文件的用户是否拥有和文件所有者一样的权限。
setgid只能用于文件目录,表示任何用户在此目录下创建的文件是否和该文件夹所有者所在组是同一个组。
sticky用来防止删除,该位设置为1表示所有用户在拥有该文件夹写权限的时候,只能在该文件目录内添加文件,不能删除文件。
那么4(100)表示的含义是: 该文件为二进制文件,在执行文件的时候,用户有和所有者一样的权限,这种设置的意义在哪里呢?
setuid的使用场景:
拿修改密码来说,密码是保存在/etc/shadow,其文件属主是root,业务上有这样的要求:
(1)用户是能修改他自己的密码的,/etc/shadow必须高度保密。
(2)文件所在的组和其他用户,都是不能对文件有写的权限。
(1)和(2)需求,如果仅仅用u、g、o三个权限位来描述权限的话,实际肯定是矛盾的。
这里就引入了setuid这样的东西:在用户修改密码执行修改命令的时候,他会拥有和root一样的权限,修改完毕以后,权限又恢复了。
为了解决这个问题,在命令执行过程中,还引入了实际用户id和有效用户id,这样的机制:
在为执行修改命令是,实际用户id和有效用户id是一样的,在执行修改命令是,有效用户id变为了root,这样就能对/etc/shadow文件进行修改了。
(4)一些特殊的注意点
1.cd到一个文件目录的时候,即使是文件目录拥有者,也必须有执行权限,才能成功cd
2.mkdir创建一个文件指定读写权限以后,有时候会发现新建的文件夹并不是指定的读写权限,
这是因为linux系统中有一个umask设置值(通过umask命令可以获取),实际的权限为你指定的读写权限减去umask的值
(系统设计者估计考虑的是:全局的去掉一个权限,让系统更安全),比如设置了0764,umask为002 那么权限实际值为 0764- 002 为0762.
设计来源于需求,linux的文件权限控制设计看起来还是相当玄妙高深的,这种设计的背后往往是
实实在在的需求,了解了需求,对于设计的思路就能理解透彻了!