Linux文件权限管理

一. 修改文件属主和属组

  •  chown :  设置文件的所有者
  •  chgrp:    设置文件的属组信息
  1. 修改文件属主 : chown 
格式:chown [OPTION]... [OWNER][:[GROUP]] FILE...   (只用root用户有权限修改文件属主;命令中的 : 可用 . 替换)
用法:
     OWNER               例子:   chown duan filename         修改 filename 的属主(只有root用户可修改)
     OWNER:GROUP         例子:   chown  duan:wang filename   修改 filename 的属主和属组(只有root用户可修改)
     :GROUP              例子:   chown :wang filename        修改filename 的属组 (用户必须是这个文件的属主且属于wang组才可修改;root可修改)
     -R: 递归       例子:   chown -R duan dirname       递归修改dirname目录下所有文件的属主(包括目录本身),但不修改目录下的 .. 目录(父目录)的属主
     chown [OPTION]... --reference=RFILE FILE...            
例子:  chown --reference=f1.file app1        按照 f1.file 的属主和属组修改 app1的属主和属组( 修改属主必须是root用户;修改属组,用户必须是两文件的属主,且用户属于f1.file 文件的属组才可以修改app1的属组)

            注意: chown -R duan  dirname/.*   (禁用!!!这会修改 dirname 目录下 .. 目录(父目录)下所有文件的属主,若修改目录的父目录是 /目录,则会将系统中所有文件的属主  都修改,造成严重损失!!) 

                        chown -R duan /*                   (禁用!!!!会修改系统中所有文件的属主)

        2.  修改文件的属组:  chgrp

     格式:  chgrp [OPTION]... GROUP FILE...          例子:  chgrp duan filename          修改 filename 的属组(用户必须是这个文件的属主且属于 duan 组才可修改)
            chgrp [OPTION]... --reference=RFILE FILE...   按照RFILE的属组修改FILE的属组(用户必须是FILE文件的属主,且属于RFILE属组中才可以修改)
            -R 递归                       递归修改目录下所有文件的属组(包括目录本身),但不修改目录下的 .. 目录(父目录)的属组

          注意: chgrp -R duan  dirname/.*             (禁用!!!这会修改 dirname 目录下 .. 目录(父目录)下所有文件的属组,若修改目录的父目录是 /目录,则会将系统中所有文件的属组都修改,造成严重损失!!)

                       chgrp -R duan /*                             (禁用!!!!会修改系统中所有文件的所属组)

二.  文件权限

  1.   普通权限划分 

          文件:

    •  r:    文件读权限(可使用文件查看类工具获取其内容)
    •  w:        文件写权限(可修改文件内容 )
    •  x:    文件可执行权限(可以把此文件提请内核启动为一个进程 )
         目录:
    •     r:         目录读权限(可以使用ls查看此目录中文件列表)
    •     w:       目录写权限(在目录下新建、删除文件、子目录的权限)
    •     x:        目录的可执行权限(可以使用ls -l查看此目录中文件列表,可以cd进入此目录 ;是目录的基础权限)
                   注:对目录没有执行权限,不能cd进入目录,不能查看目录里面文件的详细属性(只能看文件名),也不能查看文件内容;也不能新建、删除文件,给文件重命名,但可以覆盖已有文件(具有对文件写权限)
        X权限: 不会对没有执行权限的文件加执行权限,一般递归时使用(给目录递归设置可执行权限时,一定用'X',否则会给所有文件都设置可执行权限; 与 -R 一起使用)
                   例子:chmod -R +X dirname       #给dirname目录及目录下的子目录和可执行文件(具有执行权限的文件)添加可执行权限,非可执行的文件不会添可加执行权限
                   注:r 权限和w权限对root用户无效,目录的x权限对root用户无效,二进制可执行程序(文件三种用户权限类型中,任意一种有x权限)对root用户x权限设置无效,root 可执行;非二进制可执行程序文件(件三种用户权限类型中,都没有x权限),root 用户不可执行
 
            
          2.    修改文件权限 chmod 命令
格式:
     方式一(八进制表示法,数字表示法): chmod [OPTION]... OCTAL-MODE FILE...      
          r : 4 (100);  w : 2(010); x : 1(001)     括号里代表二进制,有权限为1,无权限为 0
             例子: chmod 666 filename              权限为 rw-rw-rw-
     方式二(mode法):chmod [OPTION]... MODE[,MODE]... FILE...
          MODE:
             修改一类用户的所有权限:      u: 文件所有者 ;g: 文件所属组用户; o: 其他用户; a :代表所有用户
                 u= g= o= ug= a= u=,g=             重新设置权限
             修改一类用户某位或某些位权限    u: 文件所有者 ;g: 文件所属组用户; o: 其他用户; a或空 :代表所有用户
                 u+ u- g+ g- o+ o- a+ a- + -       添加或去除权限
             -R: 递归修改权限             
                chmod [OPTION]... --reference=RFILE FILE...            参考RFILE文件的权限,将FILE的修改为同RFILE
               注:
      1.  文件的权限只有root用户和文件属主可以修改
      2. 用户对文件进行操作时,首先判断该用户是否是所有者,是 ->具有所有者权限;不是->判断是否属于文件所属组,是->具有所属组权限;不是->具有其他用户权限
                    权限优先级(不是指权限大小): 文件所有者权限 > 文件所属组权限 > 其他用户权限
           3. 文件的元数据(权限、所有者、所属组等)决定于Linux的文件系统 (ext4 文件系统 、xfs文件系统支持)
      4. chmod -R MODE /*     (禁用!!!!会破环系统所有文件的权限)
        
         3.  新建文件和目录的默认权限(umask)
    umask 本质取消对应权限
        新建目录默认权限
          umask + default(默认权限) = 777  
        新建文件默认权限
          umask + default(默认权限) = 666            默认权限结果  奇数位加1,偶数位不变 (防止新建的文件默认具有可执行权限,不安全)
        非特权用户umask是 002;root的umask 是 022
        umask:                查看umask值    
        umask设定:             例子:  umask 002        临时设置umask值为002
        umask –S 模式方式显示   显示结果:u=rwx,g=rx,o=x
        umask –p 输出可被调用   显示结果:umask 0026       可将输出结果追加到.bashrc配置文件中使用
        全局设置: /etc/bashrc  用户设置:~/.bashrc
        
         4.  Linux 文件系统上的特殊权限
    1. 二进制可执行程序访问资源文件的权限
       前提:进程有属主和属组;文件有属主和属组
         (1) 任何一个可执行程序文件能不能启动为进程,取决发起者对程序文件是否拥有执行权限
         (2) 启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属的组
         (3) 进程访问文件时的权限,取决于进程的发起者
               (a) 进程的发起者,同文件的属主:则应用文件属主权限
               (b) 进程的发起者,属于文件属组;则应用文件属组权限
               (c) 应用文件“其它”权限
    2.  SUID 权限
          加SUID权限的可执行二进制程序访问资源文件的权限:
          (1)任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
          (2)启动为进程之后,其进程的属主为原程序文件的属主
        (3) 进程访问文件时的权限,取决于进程的属主
               (a) 进程的属主,同文件的属主:则应用文件属主权限
               (b) 进程的属主,属于文件属组;则应用文件属组权限
               (c) 应用文件“其它”权限
         权限设定: 
            chmod u+s FILE... | chmod 4MODE FILE...               给二进制可执行程序添加SUID权限       MODE 为文件普通权限
            chmod u-s FILE...  | chmod  MODE FILE...              给二进制可执行程序去除SUID权限
         注意:
          1. SUID只对二进制可执行程序有效
        2. SUID设置在目录上无意义
        3. 本质:继承二进制可执行程序的属主对文件资源的访问权限
    3. SGID权限
        i.加SGID权限的可执行二进制程序访问资源文件的权限:
                  (1)任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
                  (2)启动为进程之后,其进程的属组为原程序文件的属组
           权限设定: 
              chmod g+s FILE... | chmod 2MODE FILE...               给二进制可执行程序添加SGID权限       MODE 为文件普通权限
              chmod g-s FILE...  | chmod  MODE FILE...              给二进制可执行程序去除SGID权限
        ii.  给目录设置SGID权限
                默认情况下,用户创建文件时,其属组为此用户所属的主组
                一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组
           权限设定:
              chmod g+s DIR... | chmod 2MODE DIR          给目录添加SGID权限    MODE 为目录普通权限
              chmod g-s DIR...  | chmod  MODE DIR         给目录去除SGID权限
    4. Sticky 位
         具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权
         在目录设置Sticky 位,只有文件的所有者或root可以删除该文件
            sticky 设置在文件上无意义
          权限设定:
             chmod o+t DIR... | chmod 1MODE DIR        给目录设置Sticky 位    MODE 为目录普通权限
             chmod o-t DIR...  | chmod  MODE DIR       给目录去除Sticky 位
    5. 权限位映射
          SUID: user,占据属主的执行权限位
                     s: 属主拥有x权限
                     S:属主没有x权限
          SGID: group,占据属组的执行权限位
                     s: group拥有x权限
                     S:group没有x权限
          Sticky: other,占据other的执行权限位
                     t: other拥有x权限
                     T:other没有x权限
        
         5.  设置文件特定属性(对root 用户也有效)
     chattr +i   filename       不能删除,改名,更改              去除 :chattr -i filename
     chattr +a  filename        只能追加内容                  去除 :chattr -a filename
     chattr +A filename         锁定不能更新atime时间 
     lsattr  filename           显示特定属性
         6.  访问控制列表(ACL)
     除了文件的所有者,所属组和其它人,ACL可以对更多的用户设置权限  
          CentOS7 默认创建的xfs和ext4文件系统具有ACL功能
          CentOS7 之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加
                      tune2fs –o acl /dev/sdb1
                      mount –o acl /dev/sdb1  /mnt/test
    1.  ACL生效顺序:所有者,自定义用户,自定义组(用户属于多个组时,权限累加),文件组权限(mask权限)、其他人
    2.  为多用户或者组的文件和目录赋予访问权限rwx(设置ACL权限后,文件详细信息权限后面会有‘+’)
            • mount -o acl /directory
            • getfacl file |directory                                 显示文件或目录ACL权限设置
            • setfacl -m u:wang:rwx file|directory                    添加自定义用户权限
            • setfacl -Rm g:sales:rwX directory                       给目录递归添加自定义组权限  注意:递归添加可执行程序用 'X'
            • setfacl -M file.acl file|directory                      读取文件批量添加自定义权限
            • setfacl -m g:salesgroup:rw file| directory              添加自定义组权限
            • setfacl -m d:u:wang:rx directory                        添加目录默认自定义权限(在此目录下新建的文件,默认具有此ACL权限)
            • setfacl -x u:wang file |directory                       去除自定义用户权限
            • setfacl -X file.acl directory                           读取文件批量去除自定义权限
               setfacl -k  dir                                        删除默认ACL权限
               setfacl –b  file1                                      清除所有ACL权限
               getfacl  file1 | setfacl --set-file=-   file2          复制file1的acl权限给file2
    3. mask (文件属组权限)
        mask是自定义用户和自定义组权限的上限(所有者和other之外最大的权限,等同于文件属组权限)
            设置 mask 权限
              setfacl -m mask::MODE filename       设置 filename 的mask 权限 ,会将filename的属组权限也一起改变;同时ACL权限中大于mask 权限的会失效(文件所有者和other除外),设置为mask 权限相同(MODE为设置的权限值)
            注:若新添加的自定义用户权限和自定义组权限高于原来mask的权限,会将mask更新为新定义的高权限,同时会相应影响之前失效的权限
    4.   备份和恢复ACL
            主要的文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p 参数。但是tar等常见的备份工具是不会保留目录和文件的ACL信息
            getfacl -R /tmp/dir1 > acl.txt                      将目录中所有文件的ACL权限重定向到 acl.txt文件中
            setfacl -R -b /tmp/dir1                             将目录中所有文件的ACL权限清空
            setfacl -R  --set-file=acl.txt  /tmp/dir1           恢复指定文件ACL权限
            setfacl --restore acl.txt                           恢复acl.txt中保存的所有文件的ACL权限
            getfacl -R /tmp/dir1                                显示目录下所有文件的ACL权限(包括目录本身)
原文地址:https://www.cnblogs.com/Dlg-Blog/p/8834984.html