1. 文件权限

1. 文件权限

文件权限插图

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

owner 属主, u group 属组, g other 其他, o

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

r Readable w Writable x eXcutable

1.3. 文件:

r 可使用文件查看类工具获取其内容 w 可修改其内容 x 可以把此文件提请内核启动为一个进程

1.4. 目录:

r 可以使用ls查看此目录中文件列表 w 可在此目录中创建文件,也可删除此目录中的文件 x(小写) 可以使用ls -l查看此目录中文件元数据(须配合r),可以cd进入此目录 X(大写) 只给目录x权限,不给文件x权限

1.5. 注意点1:

  1. 当判断一个用户对一个文件有什么权限时(先不考虑后面的ACL权限),是从左往右先看是否是属主,再看是否是属组,再看是否属于其他用户。
  2. 只要判断出当前用户是属主,则不再往后看后面的权限,即使后面属组设置的权限比属主还大(这样设置本身就不合理)
  3. 同理 属组和其他用户也是这样判断,都是从左往右看,判断当前用户属于文件的哪一个ugo身份,则就拥有哪一个身份的权限。

2. 修改文件的属主—{chown}

chown [OPTION]... [OWNER][:[GROUP]] FILE... 用法说明: OWNER OWNER:GROUP :GROUP - 注意:上面分别是更改属主,属组,其中冒号也可用.替换 -R: 递归 - 注意:递归修改这个命令如果不小心敲错,比如命令中在/后面多敲了一个空格,则有可能把根/下面的所有文件的所属修改掉了,则造成无法挽回的后果,慎用!! chown [OPTION]... --reference=RFILE FILE... - 参靠RFILE的属主属组来设置FILE的属主属组

3. 修改文件的属组—{chgrp}

chgrp [OPTION]... GROUP FILE... chgrp [OPTION]... --reference=RFILE FILE... -R 递归

4. 修改文件权限—{chmod}

4.1. 1.模式法:

chmod [OPTION]... OCTAL-MODE FILE... -R: 递归修改权限 chmod [OPTION]... MODE[,MODE]... FILE... MODE: 修改一类用户的所有权限 u= g= o= a= ug= uo= go= u=,g=,o= 修改一类用户某位或某些位权限 u+ u- g+ g- o+ o- a+ a- + - (不用a和用a都一样,都是ugo全部进行+-权限) chmod [OPTION]... --reference=RFILE FILE... 参考RFILE文件的权限,将FILE的修改为同

4.2. 2.数字法:

文件权限插图1

4.3. 注意点2:

  1. 如果所有者的权限什么都没有,那么当是这个文件的所有者进行访问或者操作这个文件时,即使后面的属组和其他有权限也无法操作(具体原因在注意点1中已经解释,就从左往右进行判断身份之后再赋予权限的原因);
    • 但因为这个文件属于所有者,他可以先把文件的权限给更改后再进行操作即可.
  2. 文件的所有者可以更改文件的权限(也就是ugo的rwx权限),但是不能更改文件的属主和属组。
  3. chmod a-x /bin/chmod :这个命令将会改掉chmod权限,则无法再使用这个进程,没事别这样乱用(当然可以用ACL权限重新赋予)

4.4. 修改权限示例

chgrp sales testfile chown root:admins testfile chown zhang testfile chown .zhang testfile chmod u+wx,g-r,o=rx file chmod -R g+rwX /testdir chmod 600 file chmod a= file (改为什么权限都没有)

5. 权限操作的注意点(重要知识点)

5.1. 文件权限

  1. 文件如果只有写的权限,则可以往里面写内容,但是不能看,可以用 >> 重定向写入,但是nano ,cat打不开它。注意和下面文件夹的相关权限区分。
  2. 注意如果用户对一个文件没有w权限,则用户不能修改这个文件的内容;但是对于用户能不能删除(或者重新创建)这个文件,则要看包含这个文件的目录对于用户来说的wx权限是否拥有。
    • 也就是说文件的内容修改文件的创建删除是两个不同的权限设置;前者是文件本身的w权限相关,后者是包含这个文件的目录的wx权限相关
    • 更加详细的看下面的文件夹部分解释。
  3. 要用cp复制一个文件(目录也是),对于**被复制(注意不是复制后的目标目录)**的文件(或者目录)的最小权限是要有读权限,其他权限可以不需要

5.2. 文件夹权限

  1. 在文件夹中,能不能创建和删除一个文件,是要看这个文件夹对于当前登录用户的w权限,而不需要看这个需要创建或者删除的文件的权限(不论它对于任何人是什么权限,哪怕是属于其他人的文件,只要当前登录的用户对这个文件夹有写的权限,都可以创建和删除这个文件夹里面的任何文件)(前提是对这个文件夹必须要有x权限,不然即便有了w权限也无法操作
    • 原因是删除和创建文件相当于在目录文件的索引节点对应的数据块位置存放位置修改数据(也就是索引节点中的指针对应的存放数据块位置);
    • 而文件夹(目录)对应的数据块内存储的数据内容的形式,就是文件夹内的文件名称和对应的节点编号(类比于文件的话,就相当于是文件中的字符);因为用户对于文件夹(目录)有写的权限,所以可以删除和创建
  2. 相应的,在文件夹中,能不能查看和修改一个文件内容,则是要看这个文件本身的r和w权限的;当然前提是也同样是要对这个包含这个文件的文件夹要有x权限(必须有且仅只需要x权限即可
  3. 用户对文件夹只有x执行权限的话,可以cd进入文件夹,但是不能用ls查看里面的文件列表(相当于ls ~,因为没有r权限,肯定不行).
    • 但是如果已经知道里面的文件名,可以用ll 文件名 命令来查看这些已知文件的元数据
  4. 但是如果用户对于文件夹没有x权限,则无法cd进入,并无法用ll查看里面的文件的元数据即使提前知道它里面文件的文件名也不行;当然也无法进行其他的对于它里面的文件的修改删除等操作(但是对目录有r权限的话可以看文件名,下面有解释)
  5. 如果对于文件夹有了wx没有r,则可以有创建文件和删除文件的能力(修改文件的话是和文件的w权限相关的,要注意).
  6. 如果对于一个文件夹只有r权限没有x权限,则可以用ls命令查看这个目录,会显示出此目录内的文件名,ll命令也可以使用,但无法查看里面文件的各种元数据(需要x权限)
  • 例如下面命令
  • 这里用ls 目录 或者 ll 目录,前面的报错信息就是因为没有x权限,
  • 后面显示了文件名是只有r权限的原因,也至少能读文件名了
  • 其实没有x权限没有什么意义,只能看文件名,里面的文件也不能查看其中的内容(想要查看文件的内容必须能进入文件夹,也就是必须有x权限)
```
04:07[root@centos7 /data]# chmod o=r dirautest/

04:09[zhang@centos7 /data]$ ls dirautest/
ls: cannot access dirautest/11.t: Permission denied
ls: cannot access dirautest/22.t: Permission denied
ls: cannot access dirautest/33.t: Permission denied
11.t  22.t  33.t

04:08[zhang@centos7 /data]$ ll dirautest/
ls: cannot access dirautest/11.t: Permission denied
ls: cannot access dirautest/22.t: Permission denied
ls: cannot access dirautest/33.t: Permission denied
total 0
-????????? ? ? ? ?            ? 11.t
-????????? ? ? ? ?            ? 22.t
-????????? ? ? ? ?            ? 33.t
```
  1. 如果想要查看目录的元数据 ll 目录 -d ,则要看当前用户对此目录的上一级目录权限有没有x权限,原理同上(因为目录也是个文件,相当于上一级目录里面的一个文件)(并不需要对上一级目录的r权限,r权限可以用ls和ll不查看元数据只查看文件名列表,w权限可以创建删除;)
  • 注意只有r权限没有x权限,和rx权限都有的区别;看上面的7的举例可知
  1. root账号不受任何权限限制,除了文件的x执行权限之外

5.3. 总结1(文件夹权限)

  1. 目录的x执行权限:可以cd进入目录,可以对文件夹内的文件进行ls ll查看详细信息(元数据);(比如ll命令查看文件夹内文件的元数据,但注意一定要用ll 或者 ls文件名的方式进行;)
    • 如果直接用ll 或者 ls 此目录名,则并不仅仅是x权限,还有r权限也会影响结果,查看上面的7和8注释的解释
  2. 对于文件夹想要w写的权限,必须前提有x;也就是说对于文件夹单独只有w权限没有意义,wx必须结合使用;
  3. 有了x可以cd进去和用ll查看已知文件名的文件元数据,这个命令的实现不需要考虑要查看的文件本身的权限,只需考虑这个文件夹对于当前用户的权限即可(要查看的文件本身的权限r对应的是查看这个文件内保存的信息,w修改它保存的信息,x则是二进制执行);同时没有x只有r则只能查看文件名列表,看不到元数据,也无法对里面的文件进行其他的任何操作(比如查看里面文件的内容),就只能看个名(相当于没有意义,只有r没有x的话)。

6. 权限相关举例1

例如:对于cp /etc/fstab /data/dir,最小需要什么权限?fstab是个文件,dir是个目录 1,cp要有x权限 2,etc要有x权限 ,fstab要有r权限 3,data要有x权限,dir要有wx权限

7. 权限相关举例2

  • 附加操作:恢复被删除的家目录
    ### 删除前可以先新创建一个用户观察家目录里面有的文件和权限 1. 先创建一个同名家目录文件夹 2. cp -a /etc/skel/. /home/同名家目录文件夹 ### 前两步也可以直接cp -a /etc/skel /home/同名家目录文件夹 3. chown -R 用户名.组名 同名家目录文件夹 4. chmod 700 /home/同名家目录文件夹

7.1. 总结2:

  1. 拷贝的时候,对于要拷贝的文件只要有r权限即可,前面的文件夹都只需要有x权限;对于要拷贝到的地方目录要有wx权限,它上级的目录都要有x权限;(可以看出不论要对文件夹里面的文件作出任何操作,比如cp read write 执行等等,都要上级文件夹有x权限)
  2. 同理:假设目标目录文件夹有了wx权限且它的上级目录有了x权限,经过测试发现:cp -a 命令 拷贝一个文件夹到目标目录文件夹的时候
    • 对于要拷贝的文件夹本身,不需要任何权限,这个文件夹可以直接在要拷贝到的目标目录里创建一个同名空文件夹,并保留原来的属性(前提是目标目录没有这样的同名文件夹)
    • 然后对于要拷贝的文件夹里面的文件,如果想要拷贝首先对这个文件夹要有x权限,然后文件要有r权限;而对于文件夹里面的次级子文件夹同理,不需要任何权限会直接创建一个新的空文件夹,但拷贝文件需要文件夹x和文件r权限,和上面的同理)
    • 由此可见对于文件夹的拷贝,创建空文件夹并不需要任何权限,只是对于里面的文件则要这个文件夹本身x,文件要r,递归的文件也是这个规则)
  3. 由此可以解释之前的cp -f命令为何就算不是root,普通用户也能强行覆盖一个文件:
    • 这个命令本质是删除再创建,只看文件夹的wx权限,不看这个要覆盖的文件的权限

7.2. 上面仅仅列出了cp ,cat 等,其他命令也同理

  • 也就是说对于父目录只要有执行权限x就能进去,便可对其内部的文件进行各种操作(除了创建删除等等);同时又由于没有r权限,则不能用ls ll等命令看到其目录内的详细内容列表;
  • 但如果本身知道目录内有什么文件和文件夹,就没有影响了,可以进行各种操作(除了创建删除等等)
  • 这样做的好处就是可以隐藏文件夹内部分文件,比如网站建设的时候等等

8. 特殊权限1—{X权限}

  1. X(大写):利用递归添加文件夹的执行权限命令 chmod -R [ugoa]+X 文件夹
    • 只增加文件夹的x权限而不增加文件的x权限避免风险
    • 要注意如果文件本身的ugo中的三个x权限中如果其中已经至少有了一个x权限,则当递归添加文件夹X权限的时候也会加上文件的x权限;
    • 它是根据文件本身是否有其他的x权限来判断的,如果文件本身原来就至少有一个x权限,则递归添加文件夹X权限的时候,也会相对应的添加文件的x权限。

9. umask

  • umask用来控制当前用户默认创建文件的权限值

  • 文件夹:umask+default=777

  • 文件: umask+default=666, 但注意如果default计算结果中存在奇数,则每个奇数+1;计算结果的偶数位保持不变;

  • 默认

    • 非特权用户umask是 002
    • root的umask 是 022
    umask : 查看当前用户的umask值 umask munber : 设定umask(内存中设置,退出无法保存) 示例: umask 002 umask u=rw,g=r,o= umask –S :模式 方式显示 umask –p :输出 可被调用 举例: # umask -p umask 0022 # umask -S u=rwx,g=rx,o=rx
  • 修改默认的umask值,登录生效:

    例如: umask -p >> ~/.bashrc 如果.bashrc中有多个umask,则后面的生效,因为把前面的覆盖了 全局设置: /etc/bashrc (这里面也可以查看到之前的umask默认设置) 用户设置: ~/.bashrc (echo umask ### >> .bashrc 或者 umask -p >> .bashrc 或者用文件编辑器vim等等, 然后用 source ~/.bashrc) 注意: 1. 用户设置的优先级要高于全局设置(用户设置的配置文件比全局设置的配置文件要更晚进行执行,因此全局设置的参数等等会被用户设置的相同的参数给覆盖掉); 2. 同时在同一个文件内,越往下面越在后面执行的命令或者配置会把前面执行的配置给覆盖掉;

10. 特殊权限2—{SUID,SGID,Sticky}

  • 分别对应u g 的x位置,换为s;o的位置 则替换为t
  • suid 4 sgid 2 sticky 1 ,写在普通权限前面
  • 比如用户可以间接用命令passwd修改shadow,但是不能对shadow直接任何操作(比如cat,nano等命令查看shadow文件就会被拒绝),本来参照fd的安全上下文,是不能访问的
    • 原因就是用户对于文件的权限,只看用户的权限而不看用户使用的程序工具的权限;
    • 因此这里的s权限才是特殊的权限
11:32[root@centos7 /data]# ll `which passwd` -rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd

10.1. 1.Linux安全上下文

  • 前提:进程有属主和属组;文件有属主和属组
  1. 任何一个可执行程序文件(二进制文件,这里暂不考虑脚本)能不能启动为进程,取决发起者对这个程序文件是否拥有执行权限
  2. 启动为进程之后,这个进程的属主为发起者(注意并不是这个被执行的程序文件的属主,而是执行这个程序文件的发起者),属组也同样),进程的属组为发起者所属的组
  3. 进程访问文件时的权限,取决于进程的发起者,(进程的发起者也就是这个进程的属主属组)
    1. 进程的发起者,同文件的属主:则应用文件属主权限
    2. 进程的发起者,属于文件属组;则应用文件属组权限
    3. 否则就应用文件“其它”权限
  • 二进制可执行程序文件加上s属性后,SUID,SGID会改变上面的过程中进程的属主或者属组,被更改成了这个可执行程序文件本身的属主和属组

10.2. 2.可执行文件上SUID权限

  • 任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
  • 启动为进程之后,其进程的属主为原程序文件的属主
  • SUID只对二进制可执行程序有效
  • SUID设置在目录上无意义
  • 权限设定:
chmod u+s FILE... chmod u-s FILE... chmod 4XXX FILE...

10.3. 3.可执行文件上SGID权限

  • 任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
  • 启动为进程之后,其进程的属组为原程序文件的属组
  • 权限设定:
chmod g+s FILE... chmod g-s FILE... chmod 2XXX FILE...

10.4. 4.目录上的SGID权限

  • 默认情况下,用户创建文件时,其属组为此用户所属的主组
  • 一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组
  • 通常用于创建一个协作目录
  • 权限设定:
chmod g+s DIR... chmod g-s DIR... chmod 2XXX DIR...

10.5. 5.目录上的Sticky 位

  • 具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权
  • 在目录设置Sticky 位,只有文件的所有者或root可以删除该目录内的文件
  • sticky 设置在文件上无意义
  • 权限设定:
chmod o+t DIR... chmod o-t DIR... chmod 1XXX DIR...
  • 例如:
ls -ld /tmp drwxrwxrwt 12 root root 4096 Nov 2 15:44 /tmp

11. SUID和SGID注意点:

  1. s或者t小写表示进程所属有x权限,大写表示没有
  2. 大写的S则是没有执行权限,就是x没有,但它因为本来就是为了执行二进制程序用的,所以基本上没有大S这种,没有意义.
  3. 对于可执行二进制程序文件来说,当u上有s的时候,则任何人利用这个程序的时候就会将上文属主切换到程序所有者,然后根据这个所有者来判断是否有权限操作;g上的s同理
  4. SUID和SGID作用在二进制可执行文件上才有意义,一般不作用于脚本文件上;

12. Sticky注意点:

  1. Sticky 则是作用于目录的o上的执行位置上表现为t,为了让目录里面的文件只能自己删自己的,不能删除别人的。注意小t是把原来的x权限给遮住了,但是x权限仍然存在。/tmp 就是这种文件夹
  2. 注意,在不修改用户主组的前提下,如果用户在这种包含了t权限的文件夹内创建一个文件,则它的所属永远是属于这个用户以及这个用户的主组

12.1. sticky应用场景举例:

如果新开一个工程小组,创建一个文件夹并把它当做存放资料的目录,同时想要这个小组之内的用户之间相互修改这个文件夹内的文件中的数据,则:

  1. 不能对这个工程文件夹赋予o+w,因为这样的话所有的其他人也能随意删除或者重建这个目录内的各种他人的文件了;我们只想让这个小组的人员能够创建和删除这个工程文件夹内的文件而已;

  2. 同时也不能对这个文件夹内的文件赋予o+w权限,因为这样的话所有的其他人也能随意修改这些文件了;而我们只想要这个小组的人能够修改这些文件;

  3. 所以可以创建一个小组(group),把这个文件夹内的文件属于这个组,然后把参与这个工程项目的用户也添加到这个组内,只修改组的权限即可,具体也就是

    1. 用groupadd命令创建工程组,并把工程内的所有用户添加到这个组内(这里这小组的用户可以把这个组只当做附加组就行,因为判断用户对一个文件的权限时,这个用户所有加入的组都能使用,同时虽然用户默认创建的文件的属组都是属于用户主组,但可以通过g+s可以解决这个问题,下面有解释)
    2. 对于这个工程的文件夹,把这个文件夹的属组改为新创建的工程组,同时注意把工程组内的文件夹权限加上g+小s;这样的话就能解决组内的成员新创建的文件仍然属于它自己的主组的问题,不可能每次新建一个文件就改文件属组,只需加上s权限即可;
    3. 同时对于这个工程的文件夹,还要加上o+t权限;这样就让这个小组内的成员不能随意删除不属于它自己创建的文件了。
  4. 唯一需要注意点就是如果在这个工程文件夹内新创建子文件夹,这个新创建的文件夹,虽然能继承sgid的权限,但是t权限则不会继承,于是在这个子文件夹内的文件虽然属于这个小组,但是用户可以删除其他人的文件了(前提是这个子文件夹创建时有了w权限)

    12:09[root@centos7 ~]# groupadd devops 12:09[root@centos7 ~]# useradd zhang1 12:10[root@centos7 ~]# useradd zhang2 12:10[root@centos7 ~]# useradd zhang3 12:10[root@centos7 ~]# usermod -aG devlops zhang1 12:10[root@centos7 ~]# gpasswd -a zhang2 devlops Adding user zhang2 to group devlops 12:11[root@centos7 ~]# groupmems -g devlops -a zhang3 12:19[root@centos7 ~]# groupmems -g devlops -l zhang1 zhang2 zhang3 12:11[root@centos7 ~]# mkdir /data/devposdir 12:15[root@centos7 ~]# ll /data/devposdir -d drwxr-xr-x. 2 root root 6 Mar 14 12:15 /data/devposdir 12:22[root@centos7 ~]# chmod g+ws,o=rxt /data/devposdir/ 12:22[root@centos7 ~]# ll /data/devposdir/ -d drwxrwsr-t. 2 root devlops 6 Mar 14 12:15 /data/devposdir/

13. 特殊权限2总结

  • suid:
    作用于二进制可执行的文件的所有者位上,功能:执行此文件的用户将临时继承此文件所有者的权限,做用于目录无意义

  • sgid:
    1)作用于二进制可执行的文件的所属组位上,功能:执行此文件的用户将临时继承此文件所属组的权限
    2)作用于目录的所属组位上(其实它也必须得包含x执行功能),功能:此目录中新建文件的所属组将继承此目录的所属组

  • sticky: 作用于目录,功能:此目录的文件只能被所有者(或超级管理员root)删除,作用于文件无意义

  • 注意:root账号不受限制

14. 对于所有用户包括root账户限制,设置特殊属性(限制root权限,保证文件安全)—{chattr,lsattr}

chattr +i 文件或目录:不能删除,改名,更改,可以查看 chattr +a 文件或目录:只能追加内容 lsattr 文件或目录:显示特定属性 去掉可以用-号

14.1. 注意点3:

  1. 注意上面所说的文件的各种rwx等等权限都是依赖于文件系统的(比如fat32就没有各种权限);它并不是linux的特性而是文件系统的(ext4,xfs等)的特性

15. 访问控制列表—{setfacl,getfacl}

  • ACL:Access Control List,实现灵活的权限管理
  • 除了文件的所有者,所属组和其它人,可以对更多的用户设置权限
  • CentOS7默认创建的xfs和ext4文件系统具有ACL功能
  • CentOS7之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加
    • tune2fs –o acl /dev/sdb1
    • mount –o acl /dev/sdb1 /mnt/test
  • ACL生效顺序:所有者,ACL自定义用户,所有组和ACL自定义组,其他人

15.1. 注意点4

  1. ACL判断权限的时候只要找到了靠前的所属,后面的就不再寻找了,直接使用靠前的所属的权限,和判断默认权限的方法相同
  2. 判断顺序:先判断是否是文件的OWNER,如果是,则执行OWNER的权限后结束,如果不是OWNER,则判断是否是ACL的USER,如果是则执行USER权限后结束,如果不是ACL的USER,则判断是否属于GROUP,如果是,则取组的权限,然后停止,如果不是则判断是否是ACL GROUP,是的话就执行ACL组权限,如果不属于任何GROUP,则执行OTHER。
  3. 修改了ACL之后,在ll中的g的三位显示的则是umask值,如果用chmod g 来修改,则更改的是umask值,这时候已经改不了group权限了

15.2. 指令:

为多用户或者组的文件和目录赋予访问权限rwx mount -o acl /directory setfacl -m o::#### file | directory : 其他人设置权限(other都设置了,更别提属主和属组了) getfacl file |directory setfacl -m u:wang:rwx file|directory setfacl -Rm g:sales:rwX directory:递归设置文件夹下面的权限,这样的好处是可以暂时设置某用户权限,然后不用的时候再全部取消,十分方便。 setfacl -M file.acl file|directory:从文件中设置,按照格式 setfacl -m g:salesgroup:rw file| directory setfacl -m d:u:wang:rx directory:设置目录默认权限,则目录内新建的文件都会继承这个acl权限,类似于SGID(注意目录内原来已经存在的旧文件不作任何改变) setfacl -dRm u:wang:rx directory: 同上,递归设置目录的默认权限,同时也设置目录内的所有子目录的默认权限;注意这里目录内的所有子文件的权限不会有任何改变,因为默认d权限只能设置在目录上。 setfacl -x u:wang file |directory:删除权限,即使全部删除,ll仍然会有+号,所以最好用setfacl -b file 或者setfacl -bR directory setfacl -b file 或者setfacl -bR directory :清除所有ACL权限 setfacl -X file.acl directory:按照格式删除acl getfacl 可看到特殊权限:flags

15.3. 其他一些特殊命令和注意点5:

  1. ACL文件上的group权限是mask 值(自定义用户,自定义组,拥有组的最大权限),而非传统的组权限

  2. 通过ACL的-d默认设置,赋予了目录默认x权限;

    • 赋予的时候,不论赋予目录什么权限(包括rwx等等)目录内原有的文件还是以前的权限并不会改变
    • 这个目录内新创建的文件也不会继承在ACL中设置的某个用户或者组对于这个目录的设置的x权限(因为在ACL中设置用户对于目录的x权限是为了能让这个用户进入到这个目录中进行各种操作,而新创建的文件并不需要x权限),这点要注意
    • 在这个目录内新创建的子目录则仍然会完全继承父目录中设置的-d的默认ACL权限。
  3. base ACL 不能删除 4. setfacl -k dir 删除默认ACL权限,对应-d设置目录ACL权限的那个命令

  4. setfacl -Rm d:x:xxx:xxx dirsetfacl -dRm x:xxx:xxx dir:默认选项的权限只是针对文件夹dir内新创建的文件(以前存在的文件不会改变),它可以与对文件夹本身的权限不同,比如:

    文件夹对于组apps是rwx权限,里面新创建的文件对于组apps则只有rw权限(继承了这个ACL权限) setfacl -Rm g:apps:rwx /testdir/dir setfacl -Rm d:g:apps:rw /testdir/dir 也就是说-d的ACL权限和不加-d的ACL权限是两个不同的权限,即使是针对同一个用户或者同一个组
  5. setfacl –b file1清除所有ACL权限

  6. getfacl file1 | setfacl --set-file=- file2 复制file1的acl权限给file2

  7. cp -a 或者cp -p复制包含ACL的文件,不丢失ACL属性

  8. mask只影响除文件所有者和other的之外的人和组的最大权限

  9. Mask需要与用户的权限进行逻辑与运算后,才能变成有限的权限(Effective Permission),用户或组的设置必须存在于mask权限设定范围内才会生效 setfacl -m mask::rx file

  10. --set选项会把原有的ACL项都删除,用新的替代,需要注意的是一定要包含UGO的设置,不能象-m一样只是添加ACL就可以

    • 示例:setfacl --set u::rw,u:wang:rw,g::r,o::- file1
  11. setfacl -m d:u:wang:rx directory也可setfacl -d -m u:wang:rx directory这样设置; 注意只有目录才有default的ACL权限,文件不能设置default的ACL权限

15.4. 常用举例:备份和恢复ACL

  • 主要的文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p 参数。但是tar等常见的备份工具是不会保留目录和文件的ACL信息
    步骤: 0. cd /tmp/dir1 #进入要备份的目录,然后后面的命令中这个目录都用点.来代替;这样做就避免了这个目录CP到其他机器上之后用了绝对路径进行备份导致也必须放在和原机器上相同的路径才能恢复备份的问题;下面各项的命令进行修改 1. getfacl -R /tmp/dir1 (可换成.) > acl.txt #备份ACL权限 2. setfacl -R -b /tmp/dir1 (可换成.) #清除需要被打包的文件的ACL权限 3. tar -cpvf back.tar /tmp/dir1(可换成.) 进行打包 4. 拷贝back.tar到另外的机器上,然后解包 tar -xvf back.tar 5. setfacl -R --set-file=acl.txt /tmp/dir1 (可换成.) #还原ACL权限 或者用 setfacl --restore acl.txt 注意!!用这个命令进行还原时候 acl.txt必须在要还原的目录下,同时用getfacl备份的时候最好也在要还原的目录下面进行相对路径备份,上面的0中解释过了 5. getfacl -R /tmp/dir1 (可换成.) #查看还原后的ACL权限 6.具体注意点看下面解释

15.5. 注意点5:

  1. getfacl -R 目录 :其中目录书写的时候,如果用绝对路径则会把目录前面的绝对路径也书写出来
    • 因此如果想要备份文件的ACL权限,最好不用绝对路径的方式,因为被拷贝的文件在其他机器上备份的时候不一定还放在和当前机器相同的目录下面
    • 因此备份的时候可以先进入要备份的文件夹,然后用命令getfacl -R . > acl.txt的方式进行备份,并写入当前文件夹中的acl.txt文件中
    • 这样恢复备份的时候也同样进入这个文件夹,利用上面的setfacl -R --set-file=acl.txt .命令或者setfacl --restore acl.txt 即可
最后修改日期: 2021年7月7日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。