权限管理包括普通权限、特殊权限、默认权限、ACL权限。
这些权限都是针对u(owner)、g(group)、o(other)三类定义的。
设置权限时文件和目录不同(此处把文件和目录分开,一般说文件就包含目录(linux思想:一切皆文件))如下图所示,
分别用两个用户分别创建了一个目录一个文件,可以看到同是目录的liutest和test的权限不同,它俩同为目录为啥子权限不一样呢,然后又看了一下两个文件,发现权限也不同,那这是为啥呢?!
别急,小编君这就为你解答:
一:默认权限
这是因为有一个叫umask值的东西存在,因此超级管理员root和普通用户在创建文件和目录时有了默认权限,那啥又是默认权限呢,
默认权限就是在最大权限减去umask值后得到的,那啥又是最大权限呢,最大权限是多少呢?! 目录的默认最大权限为777,文件默认最大权限是666,即
目录 文件
最大权限 777 666
umask(普通用户) 002 002
默认权限 775 664
umask(root) 022 022
默认权限 755 644
如图所示,普通用户umask默认为0002,root默认0022(这里只看后三位,说的时候就是root的umask值为022,普通用户的umask值为002,第一位是特殊权限位,一会儿会详细单独说的),而目录的最大权限是777,文件的最大权限666,所以在创件文件和目录时,先用最大权限减去umask之后,就是其默认权限。
例:
777 rwxrwxrwx 666 rw-rw-rw-
021 —-w—x 021—-w—x
756 rwxr-xrw- 646rw-r–rw-
总结一个规律:当umask值全部是偶数时,可以直接减,当umask值包含奇数时,对于目录直接减,对于文件,减完后再加一。如下图所示dir1的权限是756(777-021),而文件file的权限值为656(666-021+1)
设置umask值:umask #(例:umask 004)
这种设定只在当时生效,要想长期生效,需要在/etc/bashrc(所有用户可以看到)、~/.bashrc (仅用户自己可以看)这两个配置文件里,手动修改。
这里注意区分一下拷贝文件和新建文件时文件的权限区别:
cp拷贝文件时,基于源文件的权限减去umask值;
创建文件时,基于最大权限减去umask值。
二:普通权限:
前面一直说权限,那接下来就来看一下,每一位具体的意思吧:
r: 文件:可查看(读取)文件内容
目录:可以用ls查看此目录下的文件列表(不能查看详细信息)
w: 文件:可以修改文件内容
目录:单独使用没意义,与x结合使用时,可在此目录下创建、删除文件
x:文件:可以执行
目录:可以进去此目录,与r结合使用,可以查看此目录下文件的详细信息(ls -l)
X:当文件本身没有x权限时,则跳过,一般用于批量修改多个文件、目录的权限时,自动跳过没有执行权限的文件。(一般只给目录,不给文件。)
权限分两种方式:
1.字符:
chmod u/g/o+r/w/x file
chmod a=rwx file(a=ugo)
2.数字:
0:—
1:–x
2:-w-
3:-wx
4:r–
5:r-x
6:rw-
7:rwx
组合:rwxr-xr– 754
chmod用于修改权限,此功能只有root和所属人有权限
例:chmod754 file
chmod –reference file1 file2复制file1的权限给file2
(chown –reference file1 file2复制file1的所属人和所属组给file2)
(chgrp –reference file1 file2复制file1的所属组给file2)
有的人会有疑问,权限位是四位,怎么一直说三位啊,第一位是啥?
三:特殊权限位
第一位呢,是特殊权限位,由suid、sgid、sticky组成,下面有个总结,就是有点长,但是比较完整,其实重点是最后一句。
suid
当对一个可执行的二进制文件作用了SUID权限之后,任何拥有执行该文件权限的人,在执行的过程时都临时拥有该文件所属人的权限。
sgid
当对一个可执行的二进制文件作用了SGID权限之后,任何拥有执行该文件权限的人,在执行的过程时都临时拥有该文件所属组的权限。
当对一个目录作用了SGID权限之后,任何对该目录有wx权限的用户在该目录下创建的文件及目录的所属组均为该目录的所有组。
sticky
当对一个目录作用了sticky之后(只限制组用户,目录的owner不受影响),该目录下的文件仅其所属人才能删除。
一些常用命令:
用字符:
chmod u+s file 权限值为4***,即只有suid
chmod g+s file 权限值为2***,即只有sgid
chmod o+t file 权限值为1***,即只有sticky
也可以用数字:
chmod 3*** file 既有sticky又有sgid
chmod 5*** file 既有sticky又有suid
chmod 6*** file 既有suid又有sgid
chmod 7*** file 都有,all
若文件本身带有x权限时,为s、t,反之,则是S、T
如下图所示:
四:ACL权限
ACL(Access Control List)访问控制列表
CentOS7当中,无论是操作系统安装时还是之后手工创建的文件系统(xfs、ext4)均会开启ACL功能。
CentOS6及之前的版本,仅操作系统安装时创建的文件系统才会默认开启ACL,手工创建的文件系统,需要手工开启ACL功能。
1.mount -o acl /dev/sda7 取消的方式,重新挂载时不指定即可
2.mount -o remount,acl /dev/sda7
以上两种方式开启的ACL可以通过 mount |grep sdaX 查看
3.tune2fs -o acl /dev/sda7 取消的方式 tune2fs-o ^acl /dev/sda7
使用以上方式开启的ACL可以通过
tune2fs-l /dev/sda7 |grep option查看
以上很少用到,这里就不做演示了。
ACL权限判断的顺序
先判断是否是文件的OWNER,如果是,则执行OWNER的权限后结束,如果不是OWNER,则判断是否是ACL的USER,如果是则执行USER权限后结束,如果不是ACL的USER, 则判断是否属于GROUP或ACL GROUP,如果是,则取最大权限。如果不属于任何GROUP,则执行OTHER。
即:所有人->所有组->其他人
ACL的设置:(设置权限后,ll查看到权限位的末尾有+号,代表已经设置了ACL权限,这时再想查看权限就用getfacl file查看,当然ll也还能用,只是看不到ACL的权限而已)
setfacl-m u/g:user/group:r/w/x file
首先创建目录
然后设置ACL权限,并观察其权限处的变化
然后:通过getfaclfile查看ACL:
设置默认的ACL:
setfacl-m d:u/g:user/group:r/w/x file
(仅影响新创建的文件及子目录,对当前目录没影响)
删除一条ACL权限:
setfacl-x u/g:user/group file
仅删除一条默认的ACL权限:
setfacl-x d:user/group file
删除所有ACL权限
setfacl-b file
删除默认的ACl权限:
setfacl-k file
以上操作常与-R连用,递归设置对目录及其子目录的操作
主要的文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p 参数。
getfacl-R /PATH/TO > acl.txt连同其子目录文件的ACL权限一同导入acl.txt
setfacl-R -b /tmp/dir1连同子目录的ACL全删除
setfacl-R –set-file=acl.txt /tmp/dir1(两种还原)
setfacl–restore acl.txt(第二种)
注意:
设置过ACL权限后,操作chmod g+/- r/x/w file这条命令,用ll命令查看权限时也能看到所属组位权限的变化,但是,用getfacl file查看所属组位没变化,实际上改变的只是mask值。但chmod u+/- r/x/w所属人权限无论使用ll查看还是,getfacl file查看,都会变成设置的值、
这里的mask是所有除所有者OWNER和root外的user和group的权限的并集。
也可以使用setfacl -mmask::r/w/x file设置其权限值
另外涉及到一些特殊权限:
chattr+i file 不能file进行删除、修改,改名等
chattr-i file 取消这种权限限制
chattr+a file 只能追加内容
chattr -a file 取消这种权限限制
OK,内容目前到此,小编君刚学Linux不久,学识有限,若有出入,请多多指教,若总结的不到位,望海涵。
原创文章,作者:M.Sun,如若转载,请注明出处:http://www.178linux.com/83422