1.文件权限

1)权限分类

文件的权限主要针对三类对象进行定义:

owner: 属主, u

group: 属组, g

other: 其他, o

每个文件针对每类访问者都定义了三种权限:

r: Readable

w: Writable

x: eXcutable

wKioL1l7LoKw2xadAAAwsV6Ocs0879.png

2)权限定义

普通文件和目录文件对于权限的定义不太相同:

普通文件:

r: 可以读取文件的内容

     cat less more nano vim 执行脚本

w: 可以修改文件的内容

     nano vim > >> tee gedit

x: 可以执行该文件

    执行脚本

目录文件:

r: 用户可以列出目录下有哪些文件(不能查看文件的详细信息)

w: 只有w无意义。

x: 用户可以进入该目录(如果知道文件名,且有相对应的文件权限 ,可以执行对应的操作)

rx: 用户可以进入目录,且可以长列出。

rw:等于只有r

wx: 能进入,能创建能删除,不能列出。故用户能否删除文件与文件自身权限无关。

rwx: 全部权限。

---null

 (所以一般都是rxrwx---比较常见,比较有用)

 

X 当文件本身没有x权限时,则跳过,一般用于批量修改多个文件、目录的权限时,自动跳过没有执行权限的文件。(只给目录x权限,不给文件x权限)

 

3)权限判断的顺序

先判断是否是文件的所有人,如果是,则执行所属人的权限后结束,如果不是所有人,则判断是否所属组(可以是主组也可以是辅助组),如果是,则执行所属组的权限后结束,如果不是则执行其他人的权限后结束。

  所有人->所有组->其他人

 


2.修改文件的属主和属组

1chown

chown : change owner

     owner.group(同时修改属主属组 .也可以替换成:

   以上只有root才能修改文件的所有人

wKiom1l7LoLgGW2OAABGS35LIFc715.png

   :group .group  文件的owner也可以使用chown修改文件的所属组(owner必须属于目标组)

   -R  递归 (可以直接将目录以及子目录中所有文件都修改掉)

   --reference sourcefile tarfile(可以将tarfile文件的属主属组改成与sourcefile一样)

wKioL1l7LoLgoCuWAABWSyEKbNY358.png

如图,将text的权限也改成了kekelky

 

2chgrp

chgrp : change group

    文件的owner可以修改文件的所属组(owner必须属于目标组)

  -R  递归      

wKioL1l7L4-iSJT7AABX3kRfCaQ292.png

    --reference sourcefile tarfile


3.文件权限

wKiom1l7L4_DAT9-AABeb1q0vG8438.png

rwx三位用二进制来计算转换,有则为1,没有则为0

wKiom1l7MEqSfn0PAAAVvYR4L70460.png

因此,权限一共就可以用三个数字来表示

  例如:

640 rw-r-----

755 rwxr-xr-x


4.修改文件权限

chmod

  只有所属人和root可以更改文件的权限

1)使用字符修改

 人物 动作 行为

   ugo  +-= rwx  uowner  ggroup  oother

 

   可以一次修改很多个人物,如果每个人需要修改的内容不一致,可以分开改,用,隔开。

u=....,g=...,o=...

wKiom1l7L4_Du73tAAAqG4fWQlU838.png

 

 chmod ugo+rwx   如果需要修改的内容一致,就可以放在一块修改

    a=rwx      a代表ugo三个一起

wKiom1l7LoSQosN1AABColLhiNc937.png


2)使用数字修改

也可以根据文件权限的数字来直接修改多个人物的权限。

例如:想要修改成r w x r w - r - -

          1 1 1,1 1 0,1 0 0

            7    6   4

得出三位数字764

wKioL1l7LoTyLLHJAAAp5FGsc2Y960.png

使用764即可修改成功

wKiom1l7LoSjwul-AABA8DfFVa0801.png

同理,777000分别表示全部填满和全部为空。

PS:如果只输入3,则会默认为003,同理输入43即为043

 


5.默认权限

1umask

当我们建立一个目录或档案时,它都会带一个默认的权限:

wKiom1l7LoTin3PLAAAowU75rNg783.png

如图,目录默认为755,文件默认为644。那么,为什么默认值是这样的呢?其实是由umask控制的。

wKioL1l7LoWSGfR3AAAKNY8rqkQ626.png

使用umask命令查询umask值,为022。(暂时先不看第一位)

 

我们知道对于一个目录来说,最高权限为777,对于文件来说,最高权限为666。(因为文件有x是一个有风险是事情,所以默认生成时没有x)。

由此我们可以得出结论了,生成文件或目录时,默认值就是由最高权限减去umask值得到的。755=777-022644=666-022

那么我们来试着修改一下umask

wKioL1l7LoWho9RFAABCNAVMbME967.png

如图将umask修改为642,那我们再创建目录时发现权限果然默认为135,文件的默认权限为024

 

值得注意的是:当umask中全部是偶数时,可以直接减,当umask中包含奇数时,对于目录直接减,对于文件,在奇数所在的位减完后加一。

wKiom1l7LoWDEZ2bAABYlG_CnPs009.png

(因为文件没有x位,而所有奇数一定都带x,因此没法减,每次必定多减了一个x,所以应该加回去,即加一)

wKioL1l7LoWApUQcAAAzh5ZcwZM628.png

如图,可以看到权限确实为756646.

2)模式方式显示

umask 可以直接模式方式显示,不显示数字的方式

wKiom1l7Lobj82r7AAANgcW8ykU538.png

也可以使用-S修改umask,此时设置的为最终权限,不需要减

wKioL1l7LoaxIBR4AAAZVgT0IF4001.png

如图,修改成功


3)复制时的权限

 当我们创建文件时,文件权限为最大权限减umask值,但是当我们复制时,复制出来的文件权限为原文件减umask值。

wKiom1l7LofD81t5AABNUsRMmsw241.png

如图,testfile1的权限为testfile-022.

 

4)永久设置umask

用户设置:

  如果只用命令umask设置umask的值,在退出登录之后又会恢复原来的默认值022。如果想永久的设置umask的值,需要修改.bashrc文件。


wKioL1l7Loey3fDkAAFIfP3Y0C8800.png

如图,在文件中加入代码,保存后即可设置成功。

(注意:设置后不会立即生效,需要重新登录才能生效。如果想让它立即生效,可以输入. .bashrc或者source .bashrc即可生效)

wKiom1l7LofQjQ-RAABwh4mc6y4196.png


还有一种方法可以一次设置所有用户的umask值,修改/etc/bashrc文件

wKioL1l7LoiAhhmjAABVFUJtANA847.png

找到这几行,这一块的意思是普通用户umask值为002root用户umask值为022,因此将002的值修改为需要的值即可。

 



6.关于命令的权限

1)命令权限

有的时候能否使用命令作用于对象的时候,并不只取决于对象是否有权限,还应考虑命令的权限。

命令的属主属组都是root,在正常情况下,命令的权限都是755,因此任何用户都可以使用。如:touchcat这类的命令。

但是有些命令,如groupmems,它的权限为750,因此它只能由root执行。

wKiom1l7LojRhFeIAAAx0vyhzlM534.png

如图,切换到普通用户下,不能执行groupmems命令。

2)三个特殊权限

但是,我们发现/etc/shadow文件的权限为000,理论上仅仅只有root用户能读写(root是天神,没有特殊说明任何文件都在root的管辖之下),那我们是怎么使用其他用户修改密码的呢?

我们在修改密码时需要使用passwd命令,让我们查看一下此命令:

wKiom1l7LojBwwd8AAAXkYCXP3Q776.png

我们发现,在u的第三位上不是x而是s,这就是原因所在了。

这个s代表SUID权限,它的作用是:当对一个可执行的二进制文件作用了SUID权限之后,任何拥有执行该文件权限的人,在执行的过程时都临时拥有该文件所属人的权限。

也就是说我们在执行passwd时,其实是暂时把我们当做root来运行这个命令,因此可以修改/etc/shadow文件了。

同理,在g的第三位也会有s替代x的时候,那个s代表SGID权限,当对一个可执行的二进制文件作用了SGID权限之后,任何拥有执行该文件权限的人,在执行的过程时都临时拥有该文件所属组的权限。当对一个目录作用了SGID权限之后,任何对该目录有wx权限的用户在该目录下创建的文件及目录的所有属组均为该目录的所有组。

同样的,在o的第三位可以加上t,这个t代表Sticky权限,当对一个目录作用了sticky之后(只限制组用户,目录的owner不受影响),该目录下的文件仅其所属人才能删除。

wKioL1l7LomAdOw3AADHCk3ZwVM686.png

3)特殊权限数字法

SUID SGID STICKY

000 0

001 1

010 2

011 3

100 4

101 5

110 6

111 7

前面我们只说了umask值里看后三位,那么第一位代表的就是特殊权限。所以根据上面的表,如果想要只加入SUID权限,即1004,所以第一位应该填4

wKioL1l7LonwzD2qAAAqMK4vFKM723.png

如图所示,设成了SUID权限。

 

4)特殊权限的表示

特殊权限虽然占据了x的位置,但是并不代表替换了x(只是因为没有地方表示了),所以我们需要区分既有x又有特殊权限时怎么区分。

映射表如下:

SUID: user,占据属主的执行权限位

s: 属主拥有x权限

S:属主没有x权限

  SGID: group,占据属组的执行权限位

s: group拥有x权限

Sgroup没有x权限

  Sticky: other,占据other的执行权限位

t: other拥有x权限

Tother没有x权限

wKiom1l7Loqz102yAABDkSTKqRM798.png

如图,本身ug上都没有x位和s位,分别加上SUIDSGID权限,发现它们的S都是大写的,我们试着在u上加上x权限,发现u上的s果然变成了小写。

 


7.隐藏属性

1)查看属性

linux下的文件还有一些隐藏的属性,我们可以用lsattr命令来查看:

2)修改属性

 chattr命令可以改变一个文件的隐藏属性。

chattr

    +i  不能删除不能改

    +a  不能删除,只能追加

wKiom1l7Lorwo6u_AACEwlR5NkI488.png



8. 访问控制列表ACL

1ACL

ACLAccessControl List,可以用来实现灵活的权限管理。除了文件的所有者,所属组和其它人,可以对更多的用户设置权限。

2)开启方式

CentOS7当中,无论是操作系统安装时还是之后手工创建的文件系统(xfsext4)均会开启ACL功能。

CentOS6及之前的版本,仅操作系统安装时创建的文件系统才会默认开启ACL,手工创建的文件系统,需要手工开启ACL功能。

开启方式:

   方法一:mount -o acl /dev/sda7 

       取消的方式,重新挂载时不指定即可

   方法二:tune2fs -o acl /dev/sda7 

       取消的方式 tune2fs -o ^acl /dev/sda7wKioL1l7LouBj2eMAAN-Sw95xrw529.png

3ACL权限判断的顺序

  先判断是否是文件的OWNER,如果是,则执行OWNER的权限后结束,如果不是OWNER,则判断是否是ACLUSER,如果是则执行USER权限后结束,如果不是ACLUSER, 则判断是否属于GROUPACL GROUP,如果是,则取最大权限。如果不属于任何GROUP,则执行OTHER

  所有人->所有组->其他人

4)查看ACL权限

getfacl file|directory   查看ACL

wKiom1l7LozCQehKAAAfifSS8dI109.png

-R  作用在目录上,递归显示目录里每一个文件的ACL权限

wKioL1l7Lozw1IpLAABFXxaSQzA151.png

5)设置ACL权限

setfacl参数

   -m设置后续acl参数

wKioL1l7LoyhVZHBAAA_FxROjeU723.png

如图,设置完之后最后一位会变成+

 

    u:[用户名]:[rwx] 设置某个用户的权限

wKiom1l7Lo3RZvj2AABNsjsmFlQ499.png

                     g:[用户组]:[rwx] 设置某个组的权限

wKiom1l7Lo3yZ68bAAA4hOomE_A664.png

       -R 同样表示递归(可以一次性修改目录以及目录下所有文件的ACL权限)

wKioL1l7NBaz3GrjAAIneUo9XRM232.png


setfacl -m mask:rwx f1 设置MASK

chmod g=rwx f1 一旦设置了ACL权限后,原有的文件GROUP不可再更改,使用chmod即修改ACL MASK

mask只影响除所有者和other的之外的人和组的最大权限Mask需要与用户的权限进行逻辑与运算后,才能变成有限的权限(Effective Permission)

用户或组的设置必须存在于mask权限设定范围内才会生效

   Mask值会限制最大权限。

wKiom1l7NBahsiT9AAE1ZnKxnYI010.png

   ACL MASK随着新的ACL设置会被重置,重置的标准是让该文件上的所有ACL及文件原GROUP上的权限都有效。

   因为MASK随着ACL的设置会变化,因此应该最好最后设置MASK

 

setfacl -m d:u:user:rwx d1  设置ACL默认权限,目录新创建的文件都会被设置成默认权限,当前已创建的文件不变。

setfacl -k d1 删除全部默认权限

 

setfacl -M acl.txt f1[dir1]  acl.txt内容导入文件

   acl.txt内容来自getfacl f1 > acl.txt

如下,先使用>将内容导出到acl.txt

wKioL1l7NBfje1yqAABguytAHfI188.png

删除ACL权限之后用-M导入,发现权限又回去了。

 

 

setfacl -x u:user f1  单独去除一条ACL权限

wKioL1l7NBfzkQhBAAEOXM2lZoA300.png


  setfacl -X aclrm.txt f1[ f2 f3 *] 批量删除

     aclrm.txt内容如下

       u:liubei

       g:shuguo

  同样的,先编辑一个aclrm.txt文件,然后再执行命令。这样就可以设置删除liubeishuguoACL设置。(如果没有shuguo或者liubei就不删除,也不会报错)

 

setfacl -b f1 去除该文件上的ACL属性。

wKiom1l7NBjjpDnsAAIoBPC9gjE241.png

6)备份和恢复ACL

主要的文件操作命令cpmv都支持ACL,只是cp命令需要加上-p 参数。但是tar等常见的备份工具是不会保留目录和文件的ACL信息。

getfacl -R /tmp/dir1 > acl.txt  将目录下的所有文件的ACL属性备份到文件(路径是相对路径)

setfacl -R -b/tmp/dir1      清除目录下所有文件的ACL属性

两种还原方法:

setfacl -R --set-file=acl.txt/tmp/dir1  通过文件还原ACL属性的方法1

setfacl --restore acl.txt         通过文件还原ACL属性的方法2