权限就是对文件或目录“加锁”,有不同权限的人才能进去不同的入口……
其中rw-r--r--.就是这个文件的权限了,而后边的root root代表文件的属主和数组。
我们先来看一下权限用什么代表:
所属:
rw-r--r--9个位,分为三段,每段三个位,依次为r,w,x权限,三段分别为属主,属组,其他人三种类别的权限。
属主具有读写权限,属组有读权限,其他人有读权限,如果显示为-,则代表该类人没有此权限。那么root用户对此文件有读和写的权限,但是没有执行权限,什么是执行权限呢,比如说我们的Windows中的exe文件,能双击执行的就为可执行的,那么linux中,x则代表可执行,一般为脚本文件,或者是二进制文件(比如说ls命令)。
root组的用户对这个文件有只读权限,也就是不能更改和执行了,。对于不是root用户,和不属于root组的用户,则也是只有只读权限。
那么如何才能有自己想有的权限呢,就要所属用户或者root用户来设置了。
权限设置有两种方法:
1.2.1模式法
对象+-=权限
对象:ugoa——a相当于ugo三种类别的人
权限:rwx
[[email protected] app]#chmod a-x dir/ #去掉dir所有对象的执行权限
[[email protected] app]#ll
drwxr-xr-x. 2 root root 6 May 29 19:48 di2
drw-r--r--. 2 root root 6 May 29 19:48 dir #dir的全部对象的执行权限已经去掉
[[email protected] app]#chmod u+x dir/ #给属主添加执行权限
drwxr-xr-x. 2 root root 6 May 29 19:48 di2
drwxr--r--. 2 root root 6 May 29 19:48 dir #已经有属主执行权限了
还可以复制其他文件的权限
[root@centos7 ~]#chmod --reference=dir dir2 #参考dir的权限,为dir2设置权限
1.2.2数字法
数字也可以代表权限,r使用4表示,w使用2表示,x使用1表示,1、2、4看着有规律啊,不错,的确rwx使用二进制表示的话,有权限使用1表示,没有使用0,那么如下图:
具体只要在相应位上有权限,则二进制为1,则三个位组合起来,再从二进制转化为十进制则数字可计算出来权限。
[[email protected] app]#chmod 754 dir/
#用数字法给dir的属主赋予rwx权限,属组为rx权限,其他人为只读r权限
[[email protected] app]#ll
drwxr-xr-x. 2 root root 6 May 29 19:48 di2
drwxr-xr-. 2 root root 6 May 29 19:48 dir
umask值用来消除创建文件时的相应位上的权限(从二进制方面理解);
新建文件: 666 - umask值就是新建文件的默认权限,因为新建文件默认没有执行权限的(没有1权限,所以只要有奇数权限则代表有执行权限),所以得到的权限必定是偶数,如果umask为奇数,则用666减去将得到奇数权限,如果所得结果某位存在奇数权限,则将其权限+1(因为从二进制方面理解,如果相应位没有权限,则多减了1,故要加上1来弥补这个权限);
[root@CentOS7 ~]# umask
0022
[root@CentOS7 ~]# umask 135 #将当前umask设为135,
[root@CentOS7 ~]# umask
0135 #修改成功
[root@CentOS7 ~]# touch f2
[root@CentOS7 ~]# ls -l f2
-rw-r---w-. 1 root root 0 Jun 3 20:45 f2#按理说666-135=531,但是奇数权限加上1,则成为642
新建目录: 777 - umask值就是新建目录的默认权限;
管理员的umask 是 022
普通用户的umask是 002
[[email protected] app]#umask #查看当前用户的umask值
0022 #root的umask值是002
[[email protected] app]#umask 002 #把当前用户的umask值改为002
[[email protected] app]#umask
0002 #修改成功
[[email protected] app]#umask -S #模式方式显示
u=rwx,g=rwx,o=rx
[[email protected] app]#umask -p #显示全部,输出可被程序调用
umask 0002
X的作用(x权限特殊形式)
针对目录增加x权限
对文件
1 无执行的文件,不会增加x权限
2 任意三种人有执行权限,也会增加x权限
目录
[root@CentOS7 ~]# chmod 600 tmp/
[root@CentOS7 ~]# ls -ld /root/tmp/
drw-------. 2 root root 38 Jun 3 16:02 /root/tmp/
[root@CentOS7 ~]# chmod u+X tmp/
[root@CentOS7 ~]# ls -ld tmp/
drwx------. 2 root root 38 Jun 3 16:02 tmp/
文件:
[root@CentOS7 ~]# chmod 000 f1 #去掉文件的所以权限,以便看的更清楚
[root@CentOS7 ~]# ls -l f1
----------. 1 root root 1098 Jun 3 19:34 f1
[root@CentOS7 ~]# chmod u+X f1 #赋予X权限
[root@CentOS7 ~]# ls -l f1 #并没有权限x被赋予
----------. 1 root root 1098 Jun 3 19:34 f1
[root@CentOS7 ~]# chmod 100 f1#一旦赋予任何一类人x权限
[root@CentOS7 ~]# chmod a+X f1
[root@CentOS7 ~]# ls -l f1
---x--x--x. 1 root root 1098 Jun 3 19:34 f1#则所以位都被赋予x权限
对目录的权限意义:
只有读:只能查看目录文件列表,不能访问文件,也不能cd目录(查看,删除)
只有执行:可以cd进去,不能ls,可以访问目录中的文件。执行是基础权限
写权取:配合x权限才生效
SUID权限代表不管是谁执行此程序,将继承此程序所有者的权限
比如修改密码命令passwd,因此每个用户都可以用此命令修改自己的密码,由于其继承的是属主root用户的权限。
[root@CentOS7 ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
创建一个文件,赋予s权限
[root@CentOS7 ~]# touch f3
[root@CentOS7 ~]# ll f3
-rw-r---w-. 1 root root 0 Jun 3 21:17 f3
[root@CentOS7 ~]# chmod u+s f3
[root@CentOS7 ~]# ll f3
-rwSr---w-. 1 root root 0 Jun 3 21:17 f3 #此处为S权限
#由于其没有x权限,S并不能代表SUID权限,必须赋予x权限使其成为可执行程序,此时将自动变为s
[root@CentOS7 ~]# chmod u+x f3
[root@CentOS7 ~]# ll f3
-rwsr---w-. 1 root root 0 Jun 3 21:17 f3
SGID作用于目录或可执行程序,作用于目录代表在此目录创建的文件或目录,默认的属组继承此目录的属组
[root@CentOS7 ~]# ls -ld tmp/ 查看权限
drwx------. 2 root bin 58 Jun 3 21:32 tmp/
[root@CentOS7 ~]# chmod g+s tmp #赋予此目录的g有s权限
[root@CentOS7 ~]# ll -d tmp
drwx--S---. 2 root bin 58 Jun 3 21:32 tmp
[root@CentOS7 ~]# chmod g+wx tmp
[root@CentOS7 ~]# ll -d tmp
drwx-ws---. 2 root bin 58 Jun 3 21:32 tmp
[root@CentOS7 ~]# touch tmp/ #验证权限
f1 f2 functions profile
[root@CentOS7 ~]# touch tmp/f3
[root@CentOS7 ~]# ll tmp/f3
-rw-r--r--. 1 root bin 0 Jun 3 21:40 tmp/f3 #发现属组为bin,成功
粘贴位权限,只能作用于目录上,只有自己才能删除自己创建的文件.使用t来表示,同样需要执行权限x,否则表现为T
有这样的需求,如果多人合作,希望整个团队的人都能更改这个目录的文件,但是这个目录的文件 不能被其他人删除,比如说系统的/tmp目录,这个目录每个用户都可以在里面创建文件,但是不能删除其他用户创建的文件,除了root
ll /tmp -d
drwxrwxrwt. 27 root root 4096 Jun 3 21:40 /tmp
[root@CentOS7 ~]# touch /tmp/f1
[root@CentOS7 ~]# ls /tmp/f1
/tmp/f1
[root@CentOS7 ~]# ls /tmp/f1 -l
-rw-r--r--. 1 root root 0 Jun 3 21:48 /tmp/f1
[root@CentOS7 ~]# chown xiaoming:xiaoming /tmp/f1
[root@CentOS7 ~]# su - chenxuliang
Last login: Sat Jun 3 21:35:11 CST 2017 on pts/0
[chenxuliang@CentOS7 ~]$ echo "aaa" > /tmp/f1
-bash: /tmp/f1: Permission denied #当然此处需要赋予其他用户可w权限。
[chenxuliang@CentOS7 ~]$ rm -f /tmp/f1
rm: cannot remove ‘/tmp/f1’: Operation not permitted
#此处tmp其他用户拥有rwx权限,却不能删除其中的文件,则就是因为加了粘贴位sticky权限的原因。(删除文件与文件本身的权限无关)
特殊权限:
SUID:4
SGID:2
Sticky:1
[[email protected] app]#ll #查看当前目录文件列表和文件属性
drwxr-xr-x. 2 root root 24 May 30 19:46 dir
[[email protected] app]#chmod 1755 dir/ # 为dir目录设置权限,1表示Sticky权限,755表示普通权限
[[email protected] app]#ll #查看当前目录文件列表和文件属性
drwxr-xr-t. 2 root root 24 May 30 19:46 dir #在其他用户权限的x位上出现了t,表示Sticky权限添加成功
SUID只能作用于二进制可执行程序,不能作用于目录,因为其对应的是程序,程序需要能执行
为什么对于一个文件有读写执行权限,依然不能删除呢,因为删除文件要看其父目录是否有权限。删除的是目录项中的文件名(详细请看我的inode博客)
因为文件权限管理职能对三类人有效,在生产中远远不能满足要求,ACL则应运而生
[root@CentOS7 ~]# getfacl f1
# file: f1
# owner: root
# group: root
user::--x
group::--x
other::--x
举例:
[[email protected] app]#setfacl -m u:admin:rw dir/ #为admin设置权限
[[email protected] app]#getfacl dir/ #查看权限
# file: dir/
# owner: root
# group: root
user::rwx
user:admin:rw- #设置的admin的权限
group::r-x
mask::rwx #mask值是acl权限的上线,mask是除了所有者和其他的之外的人和组的最大权限
#在设置了acl权限之后文件的属组权限和mask值是绑定的
other::r-x
[email protected] app]#getfacl dir |setfacl -set-file=- dir2
[[email protected] app]#getfacl -R dir > acl.txt #把dir目录和子文件的acl权限备份至acl.txt文件
[[email protected] app]#setfacl -R --set-file=acl.txt dir #恢复acl权限
[[email protected] app]#setfacl --restore acl.txt #第二种方法