• 【Linux02-基本权限】“root的霸权”


    前言

    上期我们学习了使用Linux的基本指令,现在已经能初步使用Linux这个系统了。本期进一步讲解,拨开权限的迷雾。

    零、先导

    多用户

    我们了解过,Linux是一个多用户系统,但对这个“多用户”不太了解。

    用户方面,只有三种用户:

    • root 超级管理员 (不受任何权限约束)
    • 加入“sudoers”的“白名单用户”
    • 普通用户

    那如何切换用户呢?

    su
    是什么

    用于切换用户的命令。

    怎么用

    su [用户名]

    • root 切换到 其他用户:直接切
      [root@VM-12-5-centos ~]# su bacon
      [bacon@VM-12-5-centos root]$ 
    
    • 1
    • 2
    • 非root用户之间的切换:输入要切换至的用户的密码
    [bacon@VM-12-5-centos ~]$ su root
     Password: 
    [root@VM-12-5-centos bacon]# 
    
    • 1
    • 2
    • 3
    • 回到上个用户:exit/[ctrl+d]
    [root@VM-12-5-centos ~]# exit
    logout
    [bacon@VM-12-5-centos ~]$ 
    
    • 1
    • 2
    • 3

    怎么切换你说完了,但是什么是加入sudoers的“白名单用户”我还不知道呢?

    我们需要先了解 “sudo” 这个命令。

    sudo
    是什么

    用来短暂提权的命令。

    怎么用

    sudo [root才能执行的命令]

    • sudo + 命令:提权执行命令

    • sudo -i:sudoer切换到root用户(输入sudoers的密码)

      [bacon@VM-12-5-centos ~]$ sudo -i  
      [sudo] password for bacon:    
      [root@VM-12-5-centos ~]#   
      
      • 1
      • 2
      • 3

    *sudo过后一小段时间提权才失效

    有了以上了解,可以大概明白,sudoers就是可以执行sudo的人。

    【那怎么成为sudoer呢?】

    打开 /etc/sudoer,找到对应位置,添加用户名。具体的操作见下篇基本开发工具

    权限是什么意思?

    简单理解:某个人能不能做某件事。

    如,在某视频app上,你不是会员,就不能看“VIP专属电影”。


    一、是什么

    有了前面的基础,Linux下的权限就好理解多了。

    研究Linux下的权限,首先要明确Linux的设计哲学:一切皆文件! 那么谈论Linux下的一切权限,就都是在谈论对文件的权限!

    文件的权限又是什么呢?我们讲过:文件 = 文件内容 + 文件属性。“文件属性”就是本篇要谈的。但除了“文件属性”,还有一个重要的点:用户身份

    所以权限的意思迁移到Linux下,就是:

    Linux下的权限 = 用户身份 + 文件属性

    意思就是,某个身份对某个文件有没有r/w/x的权限

    用户身份

    分三种:

    1. owner:文件/目录的拥有者
    2. grouper:文件/目录的所属组
    3. other:除了owner和grouper外的其他人
    -rw-rw-r-- 1 bacon bacon    0 Oct 30 12:13 file
    
    bacon bacon 和 bacon bacon 就是dir和file的owner和grouper
    
    • 1
    • 2
    • 3

    *身份的匹配从左到右(owner => grouper,你无法同时拥有两个身份

    【为什么有所属组?】

    为了团队协作:只有拥有者和其他人,太绝对,团队协作类的事情就做不了。

    【怎么理解所属组?】

    比如,你给家里买了台电脑,家里的人都能用,但是外边的陌生人不能随便进来用。你就是owner,家人就是grouper,外边的人就是other。

    文件属性

    文件属性分为 文件类型 和 文件权限

    文件类型
    标识符名字具体文件
    -普通文件源文件 库文件 可执行文件 文件压缩包等
    d目录-
    c字符设备文件键盘显示器等
    b块设备磁盘等
    m链接文件快捷方式
    p管道文件-
    [bacon@VM-12-5-centos 2-limits-of-power]$ ll
    total 4
    drwxrwxr-x 2 bacon bacon 4096 Oct 30 12:13 dir
    -rw-rw-r-- 1 bacon bacon    0 Oct 30 12:13 file
    
    开头的 d 和 - 代表dir的类型是目录,file的类型是普通文件
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    注意,Linux系统本身不用后缀名作区分,但是不排除有些软件会用,而且写后缀名也易于区分,所以还是写上。

    文件权限值
    权限值字符表示二进制表示八进制表示
    r(read)001(只读)4(只读)
    w(write)010(只写)2(只写)
    执行x(execute)100(只执行)1(只执行)
    权限的意义
    • 文件
      • 文件的读:读文件的内容
      • 文件的写:向文件写内容
      • 文件的执行:执行文件
    • 目录
      • 目录的读:查看目录下内容
      • 目录的写:在目录下创建内容
      • 目录的执行:进入目录(cd)

    这些意义理解记忆。

    【为什么可以用二进制表示?】

    因为权限这东西只有两种状态:有/无。所以可以用1/0分别表示有/无。

    而八进制就是由二进制转换来的:1个二进制位 = 3个八进制位(可以快速计算:[读=4] + [写=2] + [执行=1] = 7)

    [bacon@VM-12-5-centos 2-limits-of-power]$ ll
    total 4
    drwxrwxr-x 2 bacon bacon 4096 Oct 30 12:13 dir
    -rw-rw-r-- 1 bacon bacon    0 Oct 30 12:13 file
    
    rwx rwx r-x 和 rw- rw- r-- 就是dir和file的权限值
    从左到右对应的身份是 owner、grouper、other
     ---    ---    ---
    owner grouper other
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    结合文件属性和用户身份来理解

    d rwx rwx r-x 2 bacon bacon dir
    
    • 1
    • owner(bacon)对目录dir,有rwx权限
    • grouper(bacon)对目录dir,有rwx权限
    • other对目录dir,有r和x权限
    - rw- rw- r-- 1 bacon bacon file
    
    • 1
    • owner(bacon)对普通文件file,有rw权限
    • grouper(bacon)对普通文件file,有rw权限
    • other对普通文件file,有r权限

    二、为什么

    Linux是多用户的系统,不同身份不同权限更利于安全管理。


    三、怎么设置

    设置文件权限方面,我们可以设置 某身份对文件的权限文件所属的身份。

    设置某身份对文件的权限

    什么是某身份对文件的权限?

    drwxrwxr-x 2 bacon bacon 4096 Oct 30 12:13 dir
    rwx是owner的权限 | rwx是grouper的权限 | r-x是other的权限
    
    • 1
    • 2

    怎么设置呢?

    chmod
    是什么

    是用来修改某身份对文件的权限的指令。

    怎么用
    1. chmod [身份][+/-][权限标识符] [文件名]
    2. chmod [八进制表示] [文件名]
    • 身份
      • u:拥有者(owner/user)
      • g:所属组(grouper)
      • o:其他人(other)
      • a:所有人(all)
    [bacon@VM-12-5-centos 2-limits-of-power]$ chmod a+rwx dir
    [bacon@VM-12-5-centos 2-limits-of-power]$ ll
    total 4
    drwxrwxrwx 2 bacon bacon 4096 Oct 30 12:13 dir
    #这里可以看到,dir的all被+上了rwx
    [bacon@VM-12-5-centos 2-limits-of-power]$ chmod o-w dir
    [bacon@VM-12-5-centos 2-limits-of-power]$ ll
    total 4
    drwxrwxr-x 2 bacon bacon 4096 Oct 30 12:13 dir
    #这里可以看到,dir的other被-掉了w
     
     2.
    [bacon@VM-12-5-centos 2-limits-of-power]$ chmod 000 file
    [bacon@VM-12-5-centos 2-limits-of-power]$ ll
    total 4
     ---------- 1 bacon bacon    0 Oct 30 12:13 file
     #这里可以看到,file的全部身份的权限都被-掉了
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    设置文件所属的身份

    什么是文件所属的身份?

    drwxrwxr-x 2 bacon bacon 4096 Oct 30 12:13 dir
    第一个bacon是owner,第二个bacon是grouper,没显示的全是other
    
    • 1
    • 2

    怎么设置呢?

    chown & chgrp
    是什么

    chown:修改文件的owner

    chgrp:修改文件的grouper

    了解怎么用之前,我们先想想:给别人一个东西的时候,需要经过别人的同意吗?

    1˚“不用吧,我给你打1个w,还需要经过你的同意吗?”

    2˚ “臭家伙,来!臭掉的牛奶,喝!”

    保险起见,还是需要的……

    但是每次要改一下owner就要发送请求,直到预备owner同意,才能改好,那不是太费劲了吗?

    这时候root来了:”你们这也太费劲了!都闪开,我来改!“

    当root没空,就sudo:“root大哥让我来办点事……”

    怎么用

    chown [要修改至的用户名] [要修改的文件名]

    [bacon@VM-12-5-centos 2-limits-of-power]$ ll 
    total 4 
    drwxrwxr-x 2 bacon bacon 4096 Oct 30 12:13 dir
    ---------- 1 bacon bacon    0 Oct 30 12:13 file 
    [bacon@VM-12-5-centos 2-limits-of-power]$ sudo chown user dir 
    [sudo] password for bacon:  
    [bacon@VM-12-5-centos 2-limits-of-power]$ ll 
    total 4 
    drwxrwxr-x 2 user  bacon 4096 Oct 30 12:13 dir
    ---------- 1 bacon bacon    0 Oct 30 12:13 file
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    chgrp [要修改至的用户名] [要修改的文件名]

    [bacon@VM-12-5-centos 2-limits-of-power]$ sudo chgrp user file 
    [bacon@VM-12-5-centos 2-limits-of-power]$ ll 
    total 4 
    drwxrwxr-x 2 user  bacon 4096 Oct 30 12:13 dir
    ---------- 1 bacon user     0 Oct 30 12:13 file 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    没有choth?own和grouper变了,other自动变,而且other也不需要专门改。

    四、谁决定默认权限

    我们创建一个文件(目录/文件)的时候,它默认的权限是这样的:

    [bacon@VM-12-5-centos 2-limits-of-power]$ mkdir defalut_dir
    [bacon@VM-12-5-centos 2-limits-of-power]$ touch defalut_file
    [bacon@VM-12-5-centos 2-limits-of-power]$ ll
    total 8
    drwxrwxr-x 2 bacon bacon 4096 Oct 30 17:45 defalut_dir
    -rw-rw-r-- 1 bacon bacon    0 Oct 30 17:45 defalut_file
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    那为什么是这样呢?

    文件的默认权限由两个东西决定:文件/目录设定的默认权限 + 权限掩码。

    默认权限
    • 文件的默认权限:666(为什么就没执行?因为大多普通文件本来就不具有可执行属性)
    • 目录的默认权限:777(默认可以查看、创建、进入)

    也不对啊,有一些权限是没有的啊。是因为有权限掩码……

    权限掩码umask
    是什么

    用来“掩盖”掉原权限的一串码。

    umask中出现的,在原权限的对应位置去掉

    这样讲有点抽象,放到实例中看看

    怎么用

    作指令:

    • umask:查看当前权限掩码

       [bacon@VM-12-5-centos 2-limits-of-power]$ umask   0002  
      
      • 1

      默认的umask是002(第一个0是为说明后面的数是八进制数),也就是默认去掉other的写权限。

      再次看看“刚出炉的文件”权限值对了没:

      [bacon@VM-12-5-centos 2-limits-of-power]$ ll
      total 8
      drwxrwxr-x 2 bacon bacon 4096 Oct 30 17:45 defalut_dir
      -rw-rw-r-- 1 bacon bacon    0 Oct 30 17:45 defalut_file  
      
      • 1
      • 2
      • 3
      • 4
      • 目录的默认权限是777 = rwx rwx rwx,umask是002 = --x

        umask出现的地方对应去掉 rwx rwx rw**-** ,这就对了

      • 文件的默认权限是666 = rw- rw- rw-,umask是002 = --x

        umask出现的地方对应去掉 rw- rw- r**-** - ,这就对了

    • umask xxx:修改权限掩码为 xxx

      [bacon@VM-12-5-centos 2-limits-of-power]$ umask 222   
      [bacon@VM-12-5-centos 2-limits-of-power]$ mkdir nonWdir   
      [bacon@VM-12-5-centos 2-limits-of-power]$ ll   
      dr-xr-xr-x 2 bacon bacon 4096 Oct 30 18:06 nonWdir   
      
      • 1
      • 2
      • 3
      • 4

      我们把umask设置成222,代表每个身份都“掩盖”掉w(写权限),果然成功。

    【umask是怎么实现“掩盖”的?】

    直接相减?

    目录的默认权限“掩盖”时直接相减:777 - 002 = 775(other可读可执行)?并不是。

    那是怎么操作的?

    位运算:xxx & (~umask)

    • umask要“掩盖的”是1,取反后,要“掩盖”的是0
    • 或——0是老大,有0的地方都变成0

    五、粘滞位

    多人协作时,常常创建一个共享的tmp文件夹,用来管理各自的临时文件。那这个tmp,应该设置什么样的权限呢?

    777,每个人都能读写执行看起来就挺不错的,真的吗?

    万一我的代码写得好,别人把我代码移到自己的目录了咋办?万一别人看我不爽,把我代码删了咋办?

    粘滞位这不就来了嘛~

    是什么

    是一种权限,使得只有root和owner可以 移动/删除文件

    怎么用

    粘滞位设置给谁呢?文件?不是的,互删文件的错误由目录产生,所以给目录设置粘滞位——粘滞位是一种目录权限

    [bacon@VM-12-5-centos 2-limits-of-power]$ mkdir tmp
    [bacon@VM-12-5-centos 2-limits-of-power]$ ll
    drwxrwxr-x 2 bacon bacon 4096 Oct 30 18:44 tmp
    
    [bacon@VM-12-5-centos 2-limits-of-power]$ chmod +t tmp
    
    [bacon@VM-12-5-centos 2-limits-of-power]$ ll
    drwxrwxr-t 2 bacon bacon 4096 Oct 30 18:44 tmp
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    可以看到,可执行权限的位置被改成了 t,这就代表这个目录被设置了粘滞位

    [user@VM-12-5-centos tmp]$ whoami
    user
    [user@VM-12-5-centos tmp]$ ll
    total 0
    -rw-rw-r-- 1 bacon bacon 0 Oct 30 18:50 t1.txt
    -rw-rw-r-- 1 bacon bacon 0 Oct 30 18:50 t2.txt
    [user@VM-12-5-centos tmp]$ rm -rf *
    rm: cannot remove ‘t1.txt’: Permission denied
    rm: cannot remove ‘t2.txt’: Permission denied
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    此时切换用户,user不是owner或者root,所以就算他气急败坏地“rm -rf *”,也没用。(嘻嘻嘻


    Linux下的权限是一个关键概念,如有讲得不透彻、不清楚,或有错漏之处,望请斧正!

    本期的分享就到这里啦,这里是培根的blog,期待和你共同进步!

    下期见~

  • 相关阅读:
    【Note】二叉树的遍历
    Blender与Substance Painter从头到尾制作科幻飞行器视频教程
    mysql基础语法速成版
    人才资源开发杂志人才资源开发杂志社人才资源开发编辑部2022年第15期目录
    python+pygame+opencv+gpt实现虚拟数字人直播(一)
    西部数据硬盘查询
    Spring IOC源码:obtainFreshBeanFactory 详解(中)
    【JavaEE初阶】 HTML基础详解
    AWS SAP-C02教程11-解决方案
    SUSE12安装SAP HANA 2.0内存数据库
  • 原文地址:https://blog.csdn.net/BaconZzz/article/details/127756823