zoukankan      html  css  js  c++  java
  • 文件权限详解

    一、前言                                

      Linux下所有资源、设备均被视作文件来操作,而文件权限则是决定用户可各文件操作的范围,无论是平时使用Linux,还是写程序均涉及这方面。以下为个人学习的整理,供以后查阅。

    二、 三种权限                             

    1. 普通权限

    权限 文件 目录
    r,读权限 查看文件内容 列出其子目录结构信息(就是可执行 ls 目录 )
    w,写权限 配合r权限,则可对文件进行修改和删除 配合x权限就可以添加、删除和移动内部文件,而删除目录和复制目录内文件则需要配合r和x权限。
    x,执行权限 配合r权限,可执行的权限 可以进入该目录和对其下文件作操作(就是可执行 cd 目录 )

    2. 特殊权限

        场景1:用户A在调用程序B时,且程序B需要修改文件C,而用户A无权修改文件C,那么程序B同样将被拒绝修改文件C。

        原因:程序将使用调用者(就是用户A)的用户标识去对系统作操作,程序的权限与调用者的权限一致。

        需要:让程序使用与调用者无关的用户或用户组标识,那么任何调用者执行该程序时均无差异。

        解决办法:使用特殊权限SUID和GUID。

    权限 文件 目录
    SUID

    注意:仅对二进制可执行文件设置

    二进制可执行文件会以所有者和调用者的用户标识去执行,也就是拥有两者的权限。

    不对目录设置
    GUID

    注意:仅对二进制可执行文件设置

    二进制可执行文件会以所属组和调用者的标识去执行,也就是拥有两者的权限。

    在目录下创建文件、目录等,其所属组与该目录的所属组相同。而不是所有者的用户组了。

       场景2:某用户在执行 rm -rf 目录/* 时,把所有者不是它的文件、目录都误删除了。

       原因:默认情况下,只要用户拥有某目录的wx权限,则可以删除、剪切该目录下的所有文件、目录,即使该用户对该目录下的文件、目录任何权限都没有。

       需求:只删除所有者为自己的文件、目录。

       解决办法:使用特殊权限SBIT。

    权限 文件 目录
    SBIT(stick bit,粘滞位)  不对文件设置 配合wx权限,仅目录的所有者、子目录或文件的所有者和root用户才能删除、移动该目录下的子目录和文件

    3. 隐藏权限

       共13种,仅在文件系统格式为Ext2+才有效。

    三、通过命令了解权限                            

     上一节我们从概念上了解了linux的文件权限的种类,下面通过命令来实干一番。

     1. 查看权限

     输入 ls -l 就可以查看当前目录下所有文件和子目录的权限信息了。

     假设回显信息为  -rwsr-xr-x root root 430540 Dec 20 18:27 /usr/sbin/passwd ,现在逐一分析其内容。

       ①. 首字符-,表示该文件为普通文件。

             -,普通文件;

             d,目录文件;

             l,符号链接;

             c,字符设备文件;

             b,字节设备文件;

             p,先进先出文件;

             s,套接字文件。

      ②. 第2~4个字符,表示所有者(owner)的权限

      ③. 第5~7个字符,表示所属组(group)的权限

      ④. 第8~10个字符,表示其他用户(other)的权限

      ⑤. 第11个字符,表示硬链接数

      ⑥. 是文件所有者的用户名称(owner)

      ⑦. 是文件所属组的用户组名称(group)

      ⑧. 是文件大小,以块为单位,通过 ls -lh 则会以KB,MB作单位

      ⑨. 是最后修改日期

      ⑩. 是文件或目录的绝对路径

      从上述内容我们可以得知Linux下的权限角色有三种,分别是所有者(owner)所属组(group)其他用户(other)

    2. 权限表示形式

      [a]. 符号表示法

      普通权限:

        r,读权限; w,写权限;x,可执行权限。

      特殊权限:

       SUID权限只能设置在②中,s表示二进制可执行文件同时拥有SUID权限和x可执行权限;S表示二进制可执行文件拥有SUID权限但没有x可执行权限。

       SGID权限只能设置在③中,s表示二进制可执行文件或目录同时拥有SGID权限和x可执行权限;S表示二进制可执行文件或目录拥有SGID权限但没有x可执行权限。

       SBIT权限只能设置在④中,t表示目录同时拥有SBIT权限和x可执行权限;T表示目录拥有SBIT权限但没有x可执行权限。

      [b]. 数字表示法

       数字表示法采用二进制形式计算,八进制形式设置的方式。

       二进制形式计算,1代表有权限,0代表无权限:

          所有者 所属组 其他用户
    SUID SGID SBIT R W X R W X R W X
    1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0

       然后每三位为一组转为八进制,例如现在二进制形式为100111101101,那么转为八进制则为4755。

       然后通过 chmod 4755 文件 就可以改变文件的权限, ls -l 回显中权限部分则为rwsr-xr-x。

       注意:1. 若不设置特殊权限时,我们可以直接省去八进制的第一位数,例如: chmod 755 文件 ;

                2. 采用数字表示法设置特殊权限,仅能启动特殊权限,却无法关闭。例如,文件A拥有特殊权限SUID和SGID,执行 chmod 0755 文件A ,但通过 ls -l 查看权限依然为rwsr-sr-x。

    四、通过符号表示法设置权限                      

      通过数组表示法设置权限有时确实不够方便,于是bash为我们提供了符号表示法来设置权限。

      设置普通权限

    复制代码
    // 为所有者、所属组和其他用户添加执行的权限
    chmod +x 文件路径
    // 为所有者、所属组和其他用户删除执行的权限
    chmod -x 文件路径
    
    // 为所有者添加执行的权限
    chmod u+x 文件路径
    // 为所属组添加执行的权限
    chmod g+x 文件路径
    // 为其他用户添加执行的权限
    chmod o+x 文件路径
    // 为所有者、所属组添加执行的权限
    chmod ug+x 文件路径
    
    // 为所有者、所属组和其他用户添加写、执行的权限,取消读权限
    chmod =wx 文件路径
    // 为所有者、所属组添加写、执行的权限,取消读权限
    chmod ug=wx 文件路径
    复制代码

      设置特殊权限

    复制代码
    // 开启、关闭SUID
    chmod u+s 文件名
    chmod u-s 文件名
    
    // 开启、关闭SGID
    chmod g+s 文件名
    chmod g-s 文件名
    
    // 开启、关闭SBIT
    chmod o+t 文件名
    chmod o-t 文件名
    复制代码

    五、改变所有者、所属组                            

      1. 查看用户信息

    复制代码
    // 查看当前用户
    whoami
    
    // 查看当前用户所属组
    groups
    
    // 查看其他用户所属组
    groups 用户1 用户2
    复制代码

      2. 改变所有者、所属组

     仅root用户才有权限执行下列命令。

    复制代码
    // 改变所有者
    chown 用户名 文件路径
    
    // 改变所属组
    chgrp 用户组 文件路径
    
    // 改变所有者和所属组
    chown 用户名.用户组 文件路径
    
    // 递归改变所有者和所属组
    chown -R 用户名.用户组 目录路径
    复制代码

    六、管理用户                                    

     1. 添加用户

         命令: useradd [-u uid] [-g group] [-d home] [-s shell] 用户名 
             -u,用户ID,用户ID是给系统使用的,而用户名是给用户使用的,两者是一一对应的关系
             -g,用户所属的用户组标识
             -d,以已存在的目录作为用户的家目录
             -s,定义shell

         示例:

    // 添加用户标识 garfield
    # useradd garfield

         并通过查看/etc/passwd、/etc/shadow和/etc/group文件内容,检查用户是否创建成功。具体内容如下

         

         注意:在创建用户时,系统会根据/etc/login.defs和/etc/default/useradd文件的内容对新用户做基本设置。

         /etc/login.defs文件内容:

         

         /etc/default/useradd

         

         SKEL选项是指定用户家目录内容是从`/etc/skel`复制过来的。

     2. 设置密码

       命令: passwd 用户名 密码 

     3. 启用、禁用帐号

    // 禁用
    # usermod -L 用户名
    // 启用 
    # usermod -U 用户名

    启用禁用实质就是在`/etc/shadow`文件中该用户名对应的记录上,在用户密码前删除、添加!(感叹号)来实现。

     4. 其他

    复制代码
    // 将用户添加到用户组
    usermod -G 用户组名 用户
    
    // 改变用户的用户组
    usermod -g 用户组名 用户
    
    // 修改用户名
    usermod -l 新用户名 旧用户
    
    // 删除用户
    userdel 用户名
    复制代码

    六、管理用户组                                

    复制代码
    // 添加用户组
    groupadd [-g gid [-o]] [-r] [-f] 用户组名
    
    // 修改用户组名称
    groupmod -n 新用户组名 旧用户组名
    
    // 删除用户组
    groupdel 用户组名
    复制代码

    七、用户、用户组的配置文件                              

    1. /etc/passwd,任何用户都可以读取该文件的内容。存放各个用户的用户名称、加密后的密码(若操作系统采用了shadow技术,则用加密密码在/etc/shadow文件中,这里用x或*表示)、用户ID(一个用户ID可以对应多个用户名,每个用户名拥有独立的口令、家目录和shell,但系统会认为这些用户名是同一个用户。0是超级用户,1~99系统保留,100开始是普通用户,默认从500建普通用户。整体取值范围是0~65535)、用户组ID(对应/etc/group中的一条记录)、注释性描述字符串、家目录、shell程序路径<br/>

    伪用户(psuedousers):shell程序路径为空或为/sbin/nologin,主要用于方便系统管理、满足相应系统进程对文件属性的要求。

    伪用户如下:

      bin,拥有可执行的用户命令文件
      sys,拥有系统文件
      adm,拥有账号文件
      uucp,UUCP使用
      lp,lp或lpd子系统使用
      nobody,NFS使用

    可通过设置"shell程序路径"为某程序,限制某用户进入系统后仅能执行该程序,程序执行结束则退出系统。

    2. /etc/shadow,仅超级用户可以查看和修改,由pwconv命令根据/etc/passwd中的数据自动生成,记录为一对一关系。记录格式为:用户名、加密后的密码(固定长度为13个字符,空则表示没有密码,若含./0-9A-Za-z的字符则无法登录)、最后修改密码的时间(以距离1970年1月1日的天数来计算)、最小时间间隔(修改密码的最小天数)、最大时间间隔(密码有效天数)、警告时间(从系统开始警告用户修改密码到无法登录的天数)、不活动时间(用户没有登录活动,但账号仍保持有效的最大天数)、失效时间(用户名的有效天数)

    3./etc/group,存放用户组名称、用户组加密后的密码(空、*或x表示没有密码)、用户组ID、成员用户名称(成员用户名称间用,隔开)

  • 相关阅读:
    Working with macro signatures
    Reset and Clear Recent Items and Frequent Places in Windows 10
    git分支演示
    The current .NET SDK does not support targeting .NET Core 2.1. Either target .NET Core 2.0 or lower, or use a version of the .NET SDK that supports .NET Core 2.1.
    Build website project by roslyn through devenv.com
    Configure environment variables for different tools in jenkins
    NUnit Console Command Line
    Code Coverage and Unit Test in SonarQube
    头脑王者 物理化学生物
    头脑王者 常识,饮食
  • 原文地址:https://www.cnblogs.com/zhangchengxiang/p/5193816.html
Copyright © 2011-2022 走看看