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

前言

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

零、先导

多用户

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

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

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

那如何切换用户呢?

su
是什么

用于切换用户的命令。

怎么用

su [用户名]

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

怎么切换你说完了,但是什么是加入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 ~]#   
    

*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

*身份的匹配从左到右(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的类型是普通文件

注意,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

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

d rwx rwx r-x 2 bacon bacon dir
  • owner(bacon)对目录dir,有rwx权限
  • grouper(bacon)对目录dir,有rwx权限
  • other对目录dir,有r和x权限
- rw- rw- r-- 1 bacon bacon file
  • 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的权限

怎么设置呢?

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的全部身份的权限都被-掉了

设置文件所属的身份

什么是文件所属的身份?

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

怎么设置呢?

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

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 

没有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

那为什么是这样呢?

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

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

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

权限掩码umask
是什么

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

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

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

怎么用

作指令:

  • umask:查看当前权限掩码

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

    默认的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  
    
    • 目录的默认权限是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   
    

    我们把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

可以看到,可执行权限的位置被改成了 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

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


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

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

下期见~

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周杰偷奶茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值