Linux权限

目录

1. shell运行原理

2. Linux权限

2.1. root用户和普通用户如何互相切换

2.2.权限

2.3. 权限的修改

 2.3.1. 如何理解文件的所属组

2.3.2 如何表达一个文件的权限: 

2.3.3. 如何操作

2.3.3.1. 更改属性

  2.3.3.1.1. 方案一(利用ugoa+rwx) 

 2.3.3.1.2. 方案二(八进制方案)

2.3.3.1.3. 如果一个文件没有权限是什么样子的呢

2.3.3.2. 更改人

 2.3.3.2.1. sudo的解释

2.4. 目录的权限

2.4.1. 粘滞位

2.5. umask


1. shell运行原理

Linux 严格意义上说是一个操作系统,我们称之为 核心( kernel ,但我们一般用户,不能直接使用 kernel 。 而是通过kernel 外壳 程序,也就是所谓的 shell ,来与 kernel 沟通。如何理解?为什么不能直接使用 kernel

首先,假设下面的图是我们计算机体系的结构

 第一个问题:这里的用户可以直接访问操作系统吗?

首先答案是,不可以,不论你是图形化界面还是指令,这些都不是在直接访问操作系统;

为什么 ?

在这里举一个例子,假设我现在要去银行存钱,我们不是直接跑到银行的钱库,把钱存进去,而是找到银行的工作人员,跟工作人员进行交互,完成一系列的举措把这个钱存入我的账户里;同样,如果我是去取钱,我也不会跑到银行的钱库直接把钱给拿出来,而是跟银行的工作人员进行互动完成我的取钱工作。

那为什么我们去存/取钱的时候,需要一个中间的事物(在这里就是银行的工作人员)帮助我完成存/取钱这件事呢?原因有两个,其一,是因为我们并不擅长银行存钱/取钱的业务逻辑,需要一个熟悉这些业务逻辑的人帮助我完成这些工作;其二,如果是我们直接去银行的钱库去取钱或者存钱,那么怎么取/存钱,如果我只存了100,结果却取走了10000,这合理吗?这不合理,显然如果我们直接去操作这些我们不熟悉的业务,在操作的过程是有安全隐患的。而作为银行的管理者对于这些隐患是不可忍受的,因此银行的工作人员也是必不可少的。

上面的例子对应到计算机,那么我们就是计算机的用户,钱库就是计算机的操作系统;

那么会跟上面的例子同样有两个问题:

1. 用户是不善于直接使用操作系统的。

2. 如果让用户直接与操作系统进行各种交互,a. 操作成本极高;b. 用户是人,而只要是人就会犯错,存在安全隐患。 

结论:系统设计者,不会让用户直接操作OS

OK,既然你告诉我,用户是不可以直接和OS进行交互的。那么请你告诉我,用户是如何访问操作系统的呢? 那么图形化界面和指令操作究竟是什么东西呢?

我们知道,我们人类对客观事物的理解是三个常见问题:是什么? 为什么? 怎么办?

在这里再举一个例子:

  

过年了, 工作了一年的李四回到家中,而我们的村长也就是说李四的父亲就对李四说:李四啊,你看你现在也找到工作了,你呢,也年纪不小了,是时候成家立业了,你看,你有没有中意的人啊?李四说:嗯,我有喜欢的人,就是隔壁家的翠花。但是呢,作为闷骚且害羞的程序员,李四呢不善于和女生打交道,李四的父亲一听:没事,我帮你找人去说媒。第二天,我们的村长先生,就去找到了村西头的王婆家:我的儿子喜欢一个女孩,你能不能帮我去说一下媒?王婆作为这个地方十公里之内说媒的头号招牌,自然是来者不拒。于是就满口答应了下来,说,村长,没问题。于是王婆就先去了村长的家中,找到了李四:李四啊,听说你要找女朋友?你有没有一些要求啊?李四说:我没啥要求,我就只喜欢从小跟我一起长大的那个女孩:翠花,其他的我都不要;王婆听了之后说:no problem,等我好消息。于是王婆就去了翠花家,对翠花说:翠花啊,跟你一起从小找大的隔壁李四对你很有好感,你觉得他这个人怎么样啊?翠花一听:李四?没听说过啊?是谁啊?于是就谢绝了王婆,王婆就去找了李四:哎,李四啊,别人不认识你啊。

根据上面的例子,我们对应到计算机里就是:李四就相当于用户,翠花就相当于操作系统,李四不善于和女生打交道就相当于用户不善于直接使用操作系统,于是就引入了一个新角色--- 王婆对应到我们的Linux操作系统就是bash(也就是我们所说的shell外壳程序);李四将他的需求告诉了王婆相当于用户将需求告诉了我们的bash,王婆将李四的需求告诉了翠花相当于bash将需求交给我们的操作系统,然后翠花拒绝了王婆提出的请求相当于操作系统拒绝了bash请求,王婆告诉了李四的说媒结果相当于bash将失败结果返回给了用户。

在这里就有一个简单的结论:我们所用到的图形化界面或者指令操作本质上是操作系统提供的外壳程序,统称shell,在Linux(centos)具体为bash;

# 用户向bash提供了一个请求,bash将这个请求交给了操作系统,操作系统经过分析处理
[Xq@VM-24-4-centos 8_27]$ lllllll
# 得到这个请求是一个非法行为,返回给bash
# 再由bash将错误结果(在这里就是 command not fount)返回给用户
-bash: lllllll: command not found
[Xq@VM-24-4-centos 8_27]$

故事还在继续,当王婆将结果返回给李四时,李四人傻了:诶,怎么可能呢?我和翠花是从小到大一起玩大的啊?这时李四突然灵光一现,原来是李四和翠花小时候都不叫大名,而是叫的小名,李四叫翠花是小花,翠花叫李四是小李;王婆一听:原来是这样啊,于是王婆就又以小李的身份去到翠花家了:翠花啊,刚刚那个人,大名叫李四,小名叫小李,你俩一起长大的,你记起来了吗?翠花一听:哦!原来是他啊,但是不好意思啊,虽然他很优秀,是一个好人,但是我不喜欢他。于是翠花就又拒绝了媒婆的请求。媒婆只好又回到了李四的家中,并如实的将结果告诉了李四。就好比如下的例子:

[Xq@VM-24-4-centos 8_27]$ ll
total 0
[Xq@VM-24-4-centos 8_27]$ touch test.c
[Xq@VM-24-4-centos 8_27]$ man chmod
[Xq@VM-24-4-centos 8_27]$ chmod 000 test.c
[Xq@VM-24-4-centos 8_27]$ ll
total 0
---------- 1 Xq Xq 0 Aug 27 21:07 test.c
# 虽然这些指令操作系统都认识,但是因为此时这个文件是没有写权限的,这个请求依然被OS拒绝了
# 就好比此时翠花是认识李四的,也承认和李四从小一起长大,但翠花就是不喜欢李四
# 因为此时李四不符合翠花的要求
# 返回给上层用户的就是 Permission denied
[Xq@VM-24-4-centos 8_27]$ echo "haha" > test.c
-bash: test.c: Permission denied
[Xq@VM-24-4-centos 8_27]$

故事依旧在继续, 李四听到王婆反馈的结果,仍旧不甘心,对王婆说:王婆啊,我真的很喜欢翠花,你能不能再去给我说一下。王婆听了之后:哎,行吧,我再去帮你说一次吧。于是王婆就去了翠花家,刚到翠花家的门口,发现翠花此时正在和一个大帅哥在一起谈笑风生,王婆一看,于是又返回到了李四的家中:哎,李四,算了吧,王婆再给你另找一个,不要再去找翠花了,你看怎么样?李四一听:不行,王婆,我只喜欢翠花一个人,你能不能再去帮我说一下。然而,王婆此时已经知道了翠花早已心有所属,于是在王婆这一层就明确拒绝了李四的请求(实际上已经是非法请求了)。

在王婆拒绝李四的这个非法请求的时候,是不是间接的保护了翠花?是的。对应到OS

当bash拒绝了用户的非法请求,也就间接的为OS提供了一层保护。        

外壳程序shell的意义:

1. 是用户和操作系统交互的中间软件层。

2. 可以在一定程度上,起到保护操作系统的作用。

故事仍在继续。这时候,该轮到我们的村长出场了,村长对王婆:你怎么回事?你是不是不去?我可是村长,你必须把这件事给我办了,给你一天的考虑时间。这时候,王婆就非常的头大。要知道,王婆可是十里八乡的说媒的招牌。可不能因为这李四的事情把招牌给砸了,于是王婆就绞尽脑汁的想办法,突然,王婆会心一笑,第二天,王婆就拟好了一份招聘广告,招来了一批的实习生。王婆就对村长说:村长啊,我已经跟翠花打了几次照面了,不太好办了,你看这样,我呢,给你找来了一个我的得意门生,我让他去试试,如果他不行,我再换人去,绝对把这件事给你搞定。村长一听:那行,我不管你如何做,只要做了就行 。此时呢,王婆就不用自己出面去干这件棘手的事了,把这件事情交给了她的实习生,而实习生对这件事情的完成情况此时在王婆看来已经不重要了,不论是这个实习生最后说媒成功了还是失败了对王婆自身的招牌没有丝毫影响。哪怕此时这个实习生和李四发生了较为严重的问题,对于王婆而言也没有太大的影响,大不了把这个实习生开除,再换一个。也就是说,只要此时我王婆不倒,这件事也就会一直向前推进。

上面的例子对应到计算机来说王婆对应的就是Linux上的bash,对于李四的说媒请求王婆交给了她的实习生对应到操作系统就是bash会创建子进程,让子进程来进行具有风险的事情。

根据上面的故事和例子,我们可以知道,用户是不会和操作系统直接交互的,而是通过中间的一层软件曾,统称为shell外壳程序,不论你是图形化界面还是指令操作都属于外壳程序,而在Linux上shell外壳程序具体为bash。

[Xq@VM-24-4-centos 8_27]$ echo $BASH
/bin/bash
[Xq@VM-24-4-centos 8_27]$ ll /bin/bash
-rwxr-xr-x 1 root root 964536 Apr  1  2020 /bin/bash
[Xq@VM-24-4-centos 8_27]$

bash和shell的关系:如果bash就是我们故事中的王婆,那么shell就是媒婆。

shell是所有外壳程序的统称。bash是一个具体化的外壳程序。 

从技术角度,Shell的最简单定义:命令行解释器(command Interpreter)主要包含:

将使用者的命令翻译给核心( kernel )处理。
同时,将核心的处理结果翻译给使用者。

对比 windows GUI ,我们操作 windows 不是直接操作 windows 内核,而是通过图形接口,点击,从而完成我们的操作(比如进入D 盘的操作,我们通常是双击 D 盘盘符 . 或者运行起来一个应用程序)。
shell 对于 Linux ,有相同的作用,主要是对我们的指令进行解析,解析指令给 Linux 内核。反馈结果在通过内核运行出结果,通过shell 解析给用户。

2. Linux权限

Linux 下有两种用户:超级用户( root )、普通用户。
Linux下可以同时存在多个用户,Linux是一个多用户操作系统。
超级用户:只有一个,具有Linux下的最高权限(一般不受权限的约束)
普通用户:可以有很多个,在 linux 下做有限的事情,受到权限的约束。
超级用户的命令提示符是 “#” ,普通用户的命令提示符是

2.1. root用户和普通用户如何互相切换

命令 su [ 用户名 ]
功能 :切换用户。
例如,要从 root 用户切换到普通用户 user ,则使用 su user 。 要从普通用户 user 切换到 root 用户则使用 su -或者su root(root也可以省略)。

root用户  <---切换--->  普通用户,潜台词就是在切换我当前的权限。

如何切换?

[Xq@VM-24-4-centos 8_27]$ whoami
# 普通用户
Xq
# 切换到root
[Xq@VM-24-4-centos 8_27]$ su -
# 注意: 此时需要输入的密码是root用户的密码
Password: 
[root@VM-24-4-centos ~]# whoami
root
# Ctrl+d 切回到刚刚的普通用户
[root@VM-24-4-centos ~]# logout
[Xq@VM-24-4-centos 8_27]$ whoami
Xq
[Xq@VM-24-4-centos 8_27]$

# 如果是root用户,可以切换到任何普通用户(此时不需要输入任何用户的密码), su 普通用户
[root@VM-24-4-centos ~]# su Lxy
[Lxy@VM-24-4-centos root]$ whoami
Lxy
[Lxy@VM-24-4-centos root]$

# 如果是一个普通用户,想要切换到另一个普通用户,则需要知道另一个普通用户的密码
[Xq@VM-24-4-centos 8_27]$ su Lxy
Password:  # 当我输入Xq用户的密码,认证失败
su: Authentication failure
[Xq@VM-24-4-centos 8_27]$ su Lxy
Password: # 当我输入root用户的密码,认证失败
su: Authentication failure
[Xq@VM-24-4-centos 8_27]$

                

2.2.权限

权限是什么?

针对人、事物自身的基本属性决定权限相关的概念。体现就是,一件事你能不能做、一件事自身是否可被执行。举个例子:
对于一个人来说,他自己是可以随便进入他的房间的,但是一个陌生人是不能随便进入他的房间的。体现的就是一件事一些人可以做,另一些人不可以做。

人能吃掉一块石头吗?这个问题很奇怪,人当然不可以吃掉石头。这不分你是什么人,而是对于石头而言,它本事就不可以被食用。这是由事物自身的属性所决定的。

权限的核心 = 人 + 事物属性

ll显示每行的第一个字符,表明该文件的文件类型。

d:目录

-:普通文件

l:软链接(类似Windows的快捷方式)
b:块设备文件(例如硬盘、光驱等)
p:管道文件
c:字符设备文件(例如屏幕等串口设备)
s:套接口文件
[Xq@VM-24-4-centos 8_28]$ mkfifo f
[Xq@VM-24-4-centos 8_28]$ ll
total 12
prw-rw-r-- 1 Xq Xq    0 Aug 28 19:10 f   # 第一个字符是p,代表文件类型是管道文件
-rw-rw-r-- 1 Xq Xq  135 Aug 28 10:44 log.txt
drwxrwxr-x 2 Xq Xq 4096 Aug 28 10:18 project
-rw-rw-r-- 1 Xq Xq  135 Aug 28 10:27 test.cc
[Xq@VM-24-4-centos 8_28]$

[Xq@VM-24-4-centos 8_28]$ ll /dev/vda1   # 第一个字符是b,在这里是磁盘
brw-rw---- 1 root disk 253, 1 Apr 25 20:18 /dev/vda1
[Xq@VM-24-4-centos 8_28]$

[Xq@VM-24-4-centos 8_28]$ g++ test.cc
[Xq@VM-24-4-centos 8_28]$ ln -s a.out a.link  
[Xq@VM-24-4-centos 8_28]$ ll
total 24
# 第一个字符是l,代表文件类型是软链接文件
lrwxrwxrwx 1 Xq Xq    5 Aug 28 19:21 a.link -> a.out
-rwxrwxr-x 1 Xq Xq 9016 Aug 28 19:20 a.out
prw-rw-r-- 1 Xq Xq    0 Aug 28 19:10 f
-rw-rw-r-- 1 Xq Xq  135 Aug 28 10:44 log.txt
drwxrwxr-x 2 Xq Xq 4096 Aug 28 10:18 project
-rw-rw-r-- 1 Xq Xq  135 Aug 28 10:27 test.cc

在Linux下,不以文件后缀区分文件类型(但并不代表不准使用各种后缀,在系统层面上没有意义,给用户看的)。 

# 创建一个C++文件
[Xq@VM-24-4-centos 8_28]$ vim test.cc 
[Xq@VM-24-4-centos 8_28]$ ls
log.txt  project  test.cc
[Xq@VM-24-4-centos 8_28]$ g++ test.cc
[Xq@VM-24-4-centos 8_28]$ ll
total 20
-rwxrwxr-x 1 Xq Xq 9016 Aug 28 10:27 a.out
-rw-rw-r-- 1 Xq Xq    0 Aug 28 10:17 log.txt
drwxrwxr-x 2 Xq Xq 4096 Aug 28 10:18 project
-rw-rw-r-- 1 Xq Xq  135 Aug 28 10:27 test.cc
# 我们发现经过g++编译生成的可执行程序默认文件名是a.out,可以正常运行
[Xq@VM-24-4-centos 8_28]$ ./a.out
cowsay hello
cowsay hello
^C
# 当我们将a.out重命名为a.txt
[Xq@VM-24-4-centos 8_28]$ mv a.out a.txt
[Xq@VM-24-4-centos 8_28]$ ll
total 20
-rwxrwxr-x 1 Xq Xq 9016 Aug 28 10:27 a.txt
-rw-rw-r-- 1 Xq Xq    0 Aug 28 10:17 log.txt
drwxrwxr-x 2 Xq Xq 4096 Aug 28 10:18 project
-rw-rw-r-- 1 Xq Xq  135 Aug 28 10:27 test.cc
# 它依然可以正常运行
[Xq@VM-24-4-centos 8_28]$ ./a.txt 
cowsay hello
cowsay hello
^C
# 甚至我将其重命名为gggg,它依旧可以正常运行
[Xq@VM-24-4-centos 8_28]$ mv a.txt gggg
[Xq@VM-24-4-centos 8_28]$ ./gggg 
cowsay hello
cowsay hello
^C
[Xq@VM-24-4-centos 8_28]$

但是,虽然文件后缀在系统层面上没有意义,但是对于Linux系统上的某些软件对于文件后缀是有一定的要求的,例如g++; 

[Xq@VM-24-4-centos 8_28]$ ll
total 20
-rwxrwxr-x 1 Xq Xq 9016 Aug 28 10:27 gggg
-rw-rw-r-- 1 Xq Xq    0 Aug 28 10:17 log.txt
drwxrwxr-x 2 Xq Xq 4096 Aug 28 10:18 project
-rw-rw-r-- 1 Xq Xq  135 Aug 28 10:27 test.cc
[Xq@VM-24-4-centos 8_28]$ cat test.cc > log.txt 
[Xq@VM-24-4-centos 8_28]$ cat log.txt 
#include <iostream>
#include <unistd.h>
int main()
{
  while(1)
  {
    std::cout << "cowsay hello" << std::endl;
    sleep(1);
  }
}
# 可以看到,g++此时不能识别这个文件
[Xq@VM-24-4-centos 8_28]$ g++ log.txt 
log.txt: file not recognized: File format not recognized
collect2: error: ld returned 1 exit status
# 而相同的代码,如果文件后缀是cc那么也就可以正常编译了
[Xq@VM-24-4-centos 8_28]$ cat test.cc 
#include <iostream>
#include <unistd.h>
int main()
{
  while(1)
  {
    std::cout << "cowsay hello" << std::endl;
    sleep(1);
  }
}
[Xq@VM-24-4-centos 8_28]$ g++ test.cc 
[Xq@VM-24-4-centos 8_28]$

注意:我们之前说的是在Linux系统层面看来,文件后缀没有意义,而g++是Linux环境下的一个软件, g++ == Linux系统?g++自身对文件后缀是有具体要求的。

2.3. 权限的修改

文件和文件目录的拥有者: u---User 
文件和文件目录的拥有者所在的组的用户:g---Group  
其它用户: o---Others 

 

 2.3.1. 如何理解文件的所属组

举个例子,李四和王五是一家公司的同事,有一次,这两个人在做同一个项目(分别在A组、和B组),有一天,李四的leader来找李四,问进度怎么样了,并要求看看李四的代码,但如果Linux权限没有所属组,只有拥有者和other,那么此时这个code.cc的拥有者肯定是李四,那这个李四的leader此时就是other,那么就无法查看这个code.cc,当然如果此时李四将它的代码所有权限都放开,虽然李四的leader可以看到这个代码,但是王五也能看到了啊,作为一个公司一个项目的两个有竞争关系的小组,李四愿不愿意让王五看到他写的代码呢?答案是,一定不愿意。因此Linux为了避免这种尴尬的问题,就引入了所属组权限。此时如果李四的leader要查看李四的代码,那么李四只需要将拥有者和所属组的权限放开,将other的权限关闭,此时就可以让李四的leader查看代码,而如果是他们组之外之人是没有查看这个代码的权限的。

因此所属组存在的最大的意义就是:对我们特定的文件实现组内管理,让同组之人可以对特定的文件拥有一定权限。

2.3.2 如何表达一个文件的权限: 

我们之前所提到的root或者是普通用户,对应的是一个具体的对象。

而现在所提到的拥有者、所属组、other,对应的是一种身份,而不是某一个具体的对象。

[Xq@VM-24-4-centos 8_28]$ ll
total 24
-rwxrwxr-x 1 Xq Xq 9016 Aug 28 19:20 a.out
-rw-rw-r-- 1 Xq Xq  135 Aug 28 10:44 log.txt
drwxrwxr-x 2 Xq Xq 4096 Aug 28 10:18 project
-rw-rw-r-- 1 Xq Xq  135 Aug 28 10:27 test.cc
[Xq@VM-24-4-centos 8_28]$ 

# 每一个文件的前十个字符:
# 第一个字符代表的是文件类型
# 剩下的9个字符每三个为一组,分别代表owner、group、other的读(r)写(w)执行(x)权限。
# 并且rwx顺序是绝对的。假如owner有x权限,owner第三个字符就是x,没有就是-
2.3.3. 如何操作
2.3.3.1. 更改属性
chmod指令
功能: 设置文件的访问权限
格式: chmod [ 参数 ] 权限 文件名
常用选项:
R -> 递归修改目录文件的权限
说明:只有文件的拥有者和 root 才可以改变文件的权限
chmod
① 用户表示符 +/-= 权限字符
+: 向权限范围增加权限代号所表示的权限
-: 向权限范围取消权限代号所表示的权限
=: 向权限范围赋予权限代号所表示的权限
用户符号:  
u :拥有者
g :拥有者同组用
o :其它用户
a :所有用户
  2.3.3.1.1. 方案一(利用ugoa+rwx) 
[Xq@VM-24-4-centos 8_28]$ ll
total 0
[Xq@VM-24-4-centos 8_28]$ touch data.txt
[Xq@VM-24-4-centos 8_28]$ ll
total 0
-rw-rw-r-- 1 Xq Xq 0 Aug 28 20:23 data.txt
#  给文件的拥有者加上了x权限
[Xq@VM-24-4-centos 8_28]$ chmod u+x data.txt 
[Xq@VM-24-4-centos 8_28]$ ll
total 0
# 虽然此时这个文件具有x权限,但不代表就能被执行。
-rwxrw-r-- 1 Xq Xq 0 Aug 28 20:23 data.txt
[Xq@VM-24-4-centos 8_28]$
# 给文件的拥有这去掉w权限,此时拥有者的w权限就没了(w -> -)
[Xq@VM-24-4-centos 8_28]$ chmod u-w data.txt 
[Xq@VM-24-4-centos 8_28]$ ll
total 0
-r-xrw-r-- 1 Xq Xq 0 Aug 28 20:23 data.txt
# 给文件的拥有者增加w权限,去掉了x权限
[Xq@VM-24-4-centos 8_28]$ chmod u+w,u-x data.txt 
[Xq@VM-24-4-centos 8_28]$ ll
total 0
-rw-rw-r-- 1 Xq Xq 0 Aug 28 20:23 data.txt
[Xq@VM-24-4-centos 8_28]$
# 所属组和其他用户操作与拥有者类似,只不过需要注意的是a代表所有用户
[Xq@VM-24-4-centos 8_28]$ ll
total 0
-rw-rw-r-- 1 Xq Xq 0 Aug 28 20:23 data.txt
# 给这个文件的所有用户加上x权限
[Xq@VM-24-4-centos 8_28]$ chmod a+x data.txt 
[Xq@VM-24-4-centos 8_28]$ ll
total 0
-rwxrwxr-x 1 Xq Xq 0 Aug 28 20:23 data.txt
[Xq@VM-24-4-centos 8_28]$
 2.3.3.1.2. 方案二(八进制方案)

我们之前说过,对于一个文件拥有者、所属组、other它们的权限顺序是唯一的(rwx),且每个位置要么有要么没有也就是两态的。既然是两态的,假设一个文件的权限为rwx rw- rw-我们是不是可以看成111 110 110(这里的每一个1代表了该位置上的权限存在。如果不存在就为0),我们将每三个二进制数字转化成八进制,在这里就是644,这就是我们的八进制方案。

[Xq@VM-24-4-centos 8_28]$ ll
total 4
---------- 1 Xq Xq 20 Aug 28 20:46 data.txt
# 664 等价于 110 110 100 也等价于 rw- rw- r--  
[Xq@VM-24-4-centos 8_28]$ chmod 664 data.txt  
[Xq@VM-24-4-centos 8_28]$ ll
total 4
# 符合预期
-rw-rw-r-- 1 Xq Xq 20 Aug 28 20:46 data.txt
[Xq@VM-24-4-centos 8_28]$
# 000 等价于 000 000 000 等价于 --- --- ---
[Xq@VM-24-4-centos 8_28]$ chmod 000 data.txt 
[Xq@VM-24-4-centos 8_28]$ ll
total 4
---------- 1 Xq Xq 20 Aug 28 20:46 data.txt
# 777 等价于 111 111 111 等价于 rwx rwx rwx
[Xq@VM-24-4-centos 8_28]$ chmod 777 data.txt 
[Xq@VM-24-4-centos 8_28]$ ll
total 4
-rwxrwxrwx 1 Xq Xq 20 Aug 28 20:46 data.txt
[Xq@VM-24-4-centos 8_28]$ 
# 这就是我们的八进制修改权限的方案
2.3.3.1.3. 如果一个文件没有权限是什么样子的呢
[Xq@VM-24-4-centos 8_28]$ ll
total 0
-rwxrwxr-x 1 Xq Xq 0 Aug 28 20:23 data.txt
# 去掉这个文件的所有权限
[Xq@VM-24-4-centos 8_28]$ chmod a-rwx data.txt 
[Xq@VM-24-4-centos 8_28]$ ll
total 0
---------- 1 Xq Xq 0 Aug 28 20:23 data.txt
# 我们发现,此时拥有者没有r权限,操作被拒绝了
[Xq@VM-24-4-centos 8_28]$ cat data.txt 
cat: data.txt: Permission denied
# 此时拥有者没有w权限,操作也被拒绝了
[Xq@VM-24-4-centos 8_28]$ echo "haha" > data.txt 
-bash: data.txt: Permission denied
[Xq@VM-24-4-centos 8_28]$
# 给文件拥有者加w权限
[Xq@VM-24-4-centos 8_28]$ chmod u+w data.txt 
# 我们发现可以写入文件了,因为此时拥有者具有w权限
[Xq@VM-24-4-centos 8_28]$ echo "haha" > data.txt 
[Xq@VM-24-4-centos 8_28]$ chmod u+r data.txt 
# 此时拥有者可以读文件了,因为此时拥有者具有r权限
[Xq@VM-24-4-centos 8_28]$ cat data.txt 
haha
[Xq@VM-24-4-centos 8_28]$ ll
total 4
-rw------- 1 Xq Xq 5 Aug 28 20:41 data.txt
[Xq@VM-24-4-centos 8_28]$
# 我们曾经说过,root用户是超级管理员,那他受不受权限约束呢?
# 在这里解释一下,su -和su的区别就是,前者登陆后再在/root,后者在登陆后就在切换前的路径
[Xq@VM-24-4-centos 8_28]$ su 
[root@VM-24-4-centos 8_28]# clear
[root@VM-24-4-centos 8_28]# ll
total 4
---------- 1 Xq Xq 5 Aug 28 20:41 data.txt
# 虽然此时这个文件没有任何权限(对于所有用户),但是root它依旧能读、写这个文件
# 因为权限约束的是普通用户,而root是管理员,几乎不受权限的约束
[root@VM-24-4-centos 8_28]# cat data.txt 
haha
[root@VM-24-4-centos 8_28]# echo "hehe" >> data.txt 
[root@VM-24-4-centos 8_28]# echo "hehe" >> data.txt 
[root@VM-24-4-centos 8_28]# echo "hehe" >> data.txt 
[root@VM-24-4-centos 8_28]# cat data.txt 
haha
hehe
hehe
hehe
[root@VM-24-4-centos 8_28]#
2.3.3.2. 更改人

首先,问一个问题,在我们的生活中,如果我们想给某人一个东西,是否需要经过他的同意呢?答案是,是的,需要征得别人的同意。

chown
功能 :修改文件或目录的拥有者
格式 chown [ 参数 ] 用户名 文件名
chgrp 
功能 :修改文件或目录的所属组
格式 chgrp [ 参数 ] 用户组名 文件名
常用选项 -R 递归修改文件或目录的所属组
[Xq@VM-24-4-centos 8_28]$ ll
total 4
-rwxrwxrwx 1 Xq Xq 20 Aug 28 20:46 data.txt
[Xq@VM-24-4-centos 8_28]$ ll /home/
total 16
drwx------  5 Lxy Lxy 4096 Jun 12 15:13 Lxy
drwx------  4 tmp tmp 4096 Aug 28 21:15 tmp
# 将这个文件的拥有者更改为tmp(Xq->tmp)
[Xq@VM-24-4-centos 8_28]$ chown tmp data.txt 
# 操作失败,没有权限
chown: changing ownership of ‘data.txt’: Operation not permitted
[Xq@VM-24-4-centos 8_28]$

# 解决方案一: su -/su (root)切换到root用户
[Xq@VM-24-4-centos 8_28]$ su 
Password: 
[root@VM-24-4-centos 8_28]# ll
total 4
-rwxrwxrwx 1 Xq Xq 20 Aug 28 20:46 data.txt
# 更改文件的拥有者
[root@VM-24-4-centos 8_28]# chown tmp data.txt 
[root@VM-24-4-centos 8_28]# ll
total 4
# 成功更改
-rwxrwxrwx 1 tmp Xq 20 Aug 28 20:46 data.txt
[root@VM-24-4-centos 8_28]#
# 更改文件的拥有者和所属组
[root@VM-24-4-centos 8_28]# chgrp tmp data.txt 
[root@VM-24-4-centos 8_28]# ll
total 4
-rwxrwxrwx 1 tmp tmp 20 Aug 28 20:46 data.txt
# chown也可以同时更改文件的拥有者和所属组,格式:chown name1:name2 file
[root@VM-24-4-centos 8_28]# chown Xq:Xq data.txt 
[root@VM-24-4-centos 8_28]# ll
total 4
-rwxrwxrwx 1 Xq Xq 20 Aug 28 20:46 data.txt
[root@VM-24-4-centos 8_28]#


# 解决方案二: sudo提升权限
[Xq@VM-24-4-centos 8_28]$ ll
total 4
-rwxrwxrwx 1 Xq Xq 20 Aug 28 20:46 data.txt
[Xq@VM-24-4-centos 8_28]$ chown tmp:tmp data.txt 
# 此时操作失败,没有权限
chown: changing ownership of ‘data.txt’: Operation not permitted
# 执行后续命令,要以root的权限级别来执行(但仅限于这一次命令)
[Xq@VM-24-4-centos 8_28]$ sudo chown tmp:tmp data.txt 
# 此时需要输入的是Xq这个普通用户的密码
[sudo] password for Xq: 
[Xq@VM-24-4-centos 8_28]$ ll
total 4
# 可以看到,操作成功
-rwxrwxrwx 1 tmp tmp 20 Aug 28 20:46 data.txt
[Xq@VM-24-4-centos 8_28]$
 2.3.3.2.1. sudo的解释
sudo提升权限
使用root用户修改/etc/sudoers文件

相信我们看到上面解决方案二的方式有些疑惑,就是,我作为一个普通用户,只要sudo一下就可以使用root用户的权限了,这是不是不合理呢?答案是,不是;为什么?sudo是有前提要求的:必须要求你这个用户是被信任的用户(普通用户需要被添加到信任列表,此时需要root身份),即必须要用root用户更改配置文件(/etc/sudoers),既然你都能用root用户了,短暂的使用一下root用户的权限,是不是就合理了。

我们使用root用户,进入到这个配置文件里(/etc/sudoers), 此时这个配置文件里面没有tmp用户,因此当我们是tmp用户时使用sudo是会报错的

[root@VM-24-4-centos 8_28]# ll /etc/sudoers
-r--r----- 1 root root 4381 May 12 00:28 /etc/sudoers
[root@VM-24-4-centos 8_28]# vim /etc/sudoers

[tmp@VM-24-4-centos ~]$ ll
total 0
[tmp@VM-24-4-centos ~]$ touch test.c
[tmp@VM-24-4-centos ~]$ ll
total 0
-rw-rw-r-- 1 tmp tmp 0 Aug 28 21:59 test.c
# tmp用户使用sudo报错,由于tmp用户没有在root配置文件(/etc/sudoers)的信任列表里
[tmp@VM-24-4-centos ~]$ sudo chown Xq:Xq test.c
[sudo] password for tmp: 
tmp is not in the sudoers file.  This incident will be reported.
[tmp@VM-24-4-centos ~]$

2.4. 目录的权限

可读权限(r) : 如果目录没有可读权限 , 则无法用 ls 等命令查看目录中的文件内容
可写权限(w) : 如果目录没有可写权限 , 则无法在目录中创建文件 , 也无法在目录中删除文件
可执行权限(x) : 如果目录没有可执行权限 , 则无法 cd 到目录中

首先,有一个问题,进入一个目录,需要什么权限呢?r? w? x?

解释一个问题:

d---rwxr-x 2 Xq Xq 4096 Aug 28 22:21 obj_tmp
虽然拥有者和所属组都是Xq,但是如果我现在是Xq,那么我的权限就是拥有者的权限,而不是所属组的权限,即权限只会认证一次(首先判定你是谁,确定了之后,就是谁的权限)。

[Xq@VM-24-4-centos 8_28]$ ll
total 0
[Xq@VM-24-4-centos 8_28]$ mkdir obj_tmp/
[Xq@VM-24-4-centos 8_28]$ ll
total 4
drwxrwxr-x 2 Xq Xq 4096 Aug 28 22:21 obj_tmp
# 只保留拥有者的r权限,结果不能进入该目录
[Xq@VM-24-4-centos 8_28]$ chmod u-wx obj_tmp/
[Xq@VM-24-4-centos 8_28]$ ll
total 4
dr--rwxr-x 2 Xq Xq 4096 Aug 28 22:21 obj_tmp
[Xq@VM-24-4-centos 8_28]$ cd obj_tmp/
-bash: cd: obj_tmp/: Permission denied
[Xq@VM-24-4-centos 8_28]$
# 给目录拥有者增添w权限,结果同样不可进入该目录
[Xq@VM-24-4-centos 8_28]$ chmod u+w obj_tmp/
[Xq@VM-24-4-centos 8_28]$ ll
total 4
drw-rwxr-x 2 Xq Xq 4096 Aug 28 22:21 obj_tmp
[Xq@VM-24-4-centos 8_28]$ cd obj_tmp/
-bash: cd: obj_tmp/: Permission denied
[Xq@VM-24-4-centos 8_28]$
# 给目录拥有者增添x权限,可以看到可以进入该目录
[Xq@VM-24-4-centos 8_28]$ chmod u+x obj_tmp/
[Xq@VM-24-4-centos 8_28]$ ll
total 4
drwxrwxr-x 2 Xq Xq 4096 Aug 28 22:21 obj_tmp
[Xq@VM-24-4-centos 8_28]$ cd obj_tmp/
[Xq@VM-24-4-centos obj_tmp]$ pwd
/home/Xq/2023_8/8_28/obj_tmp
[Xq@VM-24-4-centos obj_tmp]$

结论:进入一个目录,必须要有x权限。 

[Xq@VM-24-4-centos 8_28]$ ll
total 4
d---rwxr-x 2 Xq Xq 4096 Aug 28 22:21 obj_tmp
[Xq@VM-24-4-centos 8_28]$ chmod u+wx obj_tmp/
[Xq@VM-24-4-centos 8_28]$ ll
total 4
d-wxrwxr-x 2 Xq Xq 4096 Aug 28 22:21 obj_tmp
# 因为这个目录的拥有者具有x权限,所以可以cd这个目录
[Xq@VM-24-4-centos 8_28]$ cd obj_tmp/
# 但此时我们发现ll报错了,没有权限,因为此时这个目录的拥有者没有r权限
# 不可以用ls等命令查看目录中的文件内容
[Xq@VM-24-4-centos obj_tmp]$ ll
ls: cannot open directory .: Permission denied
[Xq@VM-24-4-centos obj_tmp]$

# 给这个目录的拥有者增添r权限,我们就可以使用ls等命令查看目录的文件内容
Xq@VM-24-4-centos obj_tmp]$ cd ../
[Xq@VM-24-4-centos 8_28]$ chmod u+r obj_tmp/
[Xq@VM-24-4-centos 8_28]$ cd obj_tmp/
[Xq@VM-24-4-centos obj_tmp]$ ll
total 0
[Xq@VM-24-4-centos obj_tmp]$
结论:目录的可读权限决定了是否可以使用ls等命令查看目录的文件内容
[Xq@VM-24-4-centos 8_28]$ ll
total 4
# 此时这个目录的拥有者没有w权限
dr-xrwxr-x 2 Xq Xq 4096 Aug 28 22:21 obj_tmp
[Xq@VM-24-4-centos 8_28]$ cd obj_tmp/
# 由于没有目录的拥有者w权限,因此无法在该目录下创建文件
[Xq@VM-24-4-centos obj_tmp]$ touch log.txt
touch: cannot touch ‘log.txt’: Permission denied
[Xq@VM-24-4-centos obj_tmp]$ cd ../
# 当增添了拥有者的w权限,才可以在该目录下创建文件
[Xq@VM-24-4-centos 8_28]$ chmod u+w obj_tmp/
[Xq@VM-24-4-centos 8_28]$ cd obj_tmp/
[Xq@VM-24-4-centos obj_tmp]$ touch log.txt
[Xq@VM-24-4-centos obj_tmp]$

结论:目录的可写权限决定了能否在该目录下创建(删除)文件(目录)

2.4.1. 粘滞位
[Xq@VM-24-4-centos obj_dir]$ touch test1.c test2.c test3.c
[Xq@VM-24-4-centos obj_dir]$ ll
total 0
-rw-rw-r-- 1 Xq Xq 0 Aug 29 01:33 test1.c
-rw-rw-r-- 1 Xq Xq 0 Aug 29 01:33 test2.c
-rw-rw-r-- 1 Xq Xq 0 Aug 29 01:33 test3.c
[Xq@VM-24-4-centos obj_dir]$ cd ../
[Xq@VM-24-4-centos 8_29]$ ll
total 4
drwxrwxr-x 2 Xq Xq 4096 Aug 29 01:33 obj_dir
-rw-rw-r-- 1 Xq Xq    0 Aug 29 01:01 test.cc
# 将目录的拥有者的w权限干掉
[Xq@VM-24-4-centos 8_29]$ chmod u-w obj_dir/
[Xq@VM-24-4-centos 8_29]$ ll
total 4
dr-xrwxr-x 2 Xq Xq 4096 Aug 29 01:33 obj_dir
-rw-rw-r-- 1 Xq Xq    0 Aug 29 01:01 test.cc
[Xq@VM-24-4-centos 8_29]$ cd obj_dir/
# 我们发现此时这个目录的拥有者就不可以在这个目录下删除文件了(没有w权限)
[Xq@VM-24-4-centos obj_dir]$ ll
total 0
-rw-rw-r-- 1 Xq Xq 0 Aug 29 01:33 test1.c
-rw-rw-r-- 1 Xq Xq 0 Aug 29 01:33 test2.c
-rw-rw-r-- 1 Xq Xq 0 Aug 29 01:33 test3.c
[Xq@VM-24-4-centos obj_dir]$ rm *.c
rm: cannot remove ‘test1.c’: Permission denied
rm: cannot remove ‘test2.c’: Permission denied
rm: cannot remove ‘test3.c’: Permission denied
[Xq@VM-24-4-centos obj_dir]$

也就是说, 删除一个文件,需要目录的w权限。

[Xq@VM-24-4-centos 8_29]$ ll
total 4
dr-xrwxr-x 2 Xq Xq 4096 Aug 29 01:33 obj_dir
-rw-rw-r-- 1 Xq Xq    0 Aug 29 01:01 test.cc
# sudo提升权限,创建了一个文件(拥有着和所属组都是root)
[Xq@VM-24-4-centos 8_29]$ sudo touch root.txt
[sudo] password for Xq: 
[Xq@VM-24-4-centos 8_29]$ ll
total 4
dr-xrwxr-x 2 Xq   Xq   4096 Aug 29 01:33 obj_dir
-rw-r--r-- 1 root root    0 Aug 29 01:36 root.txt
-rw-rw-r-- 1 Xq   Xq      0 Aug 29 01:01 test.cc
# 而此时我是Xq,是一个普通用户,但是我们发现我能干掉不是我的文件,并且这个文件还是root的
[Xq@VM-24-4-centos 8_29]$ rm root.txt 
rm: remove write-protected regular empty file ‘root.txt’? yes
[Xq@VM-24-4-centos 8_29]$ ll
total 4
dr-xrwxr-x 2 Xq Xq 4096 Aug 29 01:33 obj_dir
-rw-rw-r-- 1 Xq Xq    0 Aug 29 01:01 test.cc
[Xq@VM-24-4-centos 8_29]$

我们应该能理解这里为什么可以删除,删除文件,不是这个文件的权限所决定的,而是由这个文件的上级目录所决定的。如果这个上级目录对应用户有w权限就可以删除。

假设,现在有一种场景,所有用户都要在一个共同的路径下,对该目录具有读写执行权限

1.当多个用户共享一个目录,需要在该目录下,进行读写、创建删除文件

2.但是自己只能删除自己的,而不能删除别人的

[Xq@VM-24-4-centos 8_29]$ ll
total 4
dr-xrwxr-x 2 Xq Xq 4096 Aug 29 01:33 obj_dir
-rw-rw-r-- 1 Xq Xq    0 Aug 29 01:01 test.cc
# 创建一个公共的路径tmp
[Xq@VM-24-4-centos 8_29]$ sudo mkdir tmp
[sudo] password for Xq: 
[Xq@VM-24-4-centos 8_29]$ ll
total 8
dr-xrwxr-x 2 Xq   Xq   4096 Aug 29 01:33 obj_dir
-rw-rw-r-- 1 Xq   Xq      0 Aug 29 01:01 test.cc
drwxr-xr-x 2 root root 4096 Aug 29 01:53 tmp
#任何用户都具有读写执行权限
[Xq@VM-24-4-centos 8_29]$ sudo chmod 777 tmp
[Xq@VM-24-4-centos 8_29]$ ll
total 8
dr-xrwxr-x 2 Xq   Xq   4096 Aug 29 01:33 obj_dir
-rw-rw-r-- 1 Xq   Xq      0 Aug 29 01:01 test.cc
drwxrwxrwx 2 root root 4096 Aug 29 01:53 tmp
[Xq@VM-24-4-centos 8_29]$

# Xq这个用户在这个公共的路径下创建了三个文件,权限都是700
[Xq@VM-24-4-centos 8_29]$ cd tmp/
[Xq@VM-24-4-centos tmp]$ ll
total 0
[Xq@VM-24-4-centos tmp]$ touch Xq1.c
[Xq@VM-24-4-centos tmp]$ touch Xq2.c
[Xq@VM-24-4-centos tmp]$ touch Xq3.c
[Xq@VM-24-4-centos tmp]$ ll
total 0
-rw-rw-r-- 1 Xq Xq 0 Aug 29 01:55 Xq1.c
-rw-rw-r-- 1 Xq Xq 0 Aug 29 01:55 Xq2.c
-rw-rw-r-- 1 Xq Xq 0 Aug 29 01:55 Xq3.c
[Xq@VM-24-4-centos tmp]$ chmod 700 *.c
[Xq@VM-24-4-centos tmp]$ ll
total 0
-rwx------ 1 Xq Xq 0 Aug 29 01:55 Xq1.c
-rwx------ 1 Xq Xq 0 Aug 29 01:55 Xq2.c
-rwx------ 1 Xq Xq 0 Aug 29 01:55 Xq3.c
[Xq@VM-24-4-centos tmp]$

# Lxy用户也在这个公共的路径下创建了三个文件
[Xq@VM-24-4-centos tmp]$ su 
Password: 
[root@VM-24-4-centos tmp]# su Lxy
[Lxy@VM-24-4-centos tmp]$ ll
total 0
-rwx------ 1 Xq Xq 0 Aug 29 01:55 Xq1.c
-rwx------ 1 Xq Xq 0 Aug 29 01:55 Xq2.c
-rwx------ 1 Xq Xq 0 Aug 29 01:55 Xq3.c
[Lxy@VM-24-4-centos tmp]$ pwd
/home/Xq/2023_8/8_29/tmp
[Lxy@VM-24-4-centos tmp]$ touch Lxy1.c Lxy2.c Lxy3.c
[Lxy@VM-24-4-centos tmp]$ ll
total 0
-rw-rw-r-- 1 Lxy Lxy 0 Aug 29 01:58 Lxy1.c
-rw-rw-r-- 1 Lxy Lxy 0 Aug 29 01:58 Lxy2.c
-rw-rw-r-- 1 Lxy Lxy 0 Aug 29 01:58 Lxy3.c
-rwx------ 1 Xq  Xq  0 Aug 29 01:55 Xq1.c
-rwx------ 1 Xq  Xq  0 Aug 29 01:55 Xq2.c
-rwx------ 1 Xq  Xq  0 Aug 29 01:55 Xq3.c
[Lxy@VM-24-4-centos tmp]$
# 此时Lxy这个用户对于Xq的三个文件来说是other,因此不可读写执行,没有权限
[Lxy@VM-24-4-centos tmp]$ cat Xq1.c
cat: Xq1.c: Permission denied
[Lxy@VM-24-4-centos tmp]$ echo "haha" > Xq1.c
bash: Xq1.c: Permission denied
[Lxy@VM-24-4-centos tmp]$

#虽然我不能读写执行,但是我却能干掉这个不是我的文件,原因我们知道,是因为上级目录具有w权限
[Lxy@VM-24-4-centos tmp]$ whoami
Lxy
[Lxy@VM-24-4-centos tmp]$ rm Xq1.c
rm: remove write-protected regular empty file ‘Xq1.c’? y
[Lxy@VM-24-4-centos tmp]$ ll
total 0
-rw-rw-r-- 1 Lxy Lxy 0 Aug 29 01:58 Lxy1.c
-rw-rw-r-- 1 Lxy Lxy 0 Aug 29 01:58 Lxy2.c
-rw-rw-r-- 1 Lxy Lxy 0 Aug 29 01:58 Lxy3.c
-rwx------ 1 Xq  Xq  0 Aug 29 01:55 Xq2.c
-rwx------ 1 Xq  Xq  0 Aug 29 01:55 Xq3.c
[Lxy@VM-24-4-centos tmp]$

# 但是这不合理啊,你怎么能干掉我的文件呢?
# 这时候有人提出解决方案一:你不是就因为目录other有w权限吗,我给你干掉
[Xq@VM-24-4-centos 8_29]$ ll
total 8
dr-xrwxr-x 2 Xq   Xq   4096 Aug 29 01:33 obj_dir
-rw-rw-r-- 1 Xq   Xq      0 Aug 29 01:01 test.cc
drwxrwxrwx 2 root root 4096 Aug 29 02:00 tmp
# 干掉other的w权限
[Xq@VM-24-4-centos 8_29]$ sudo chmod o-w tmp
[sudo] password for Xq: 
[Xq@VM-24-4-centos 8_29]$ ll
total 8
dr-xrwxr-x 2 Xq   Xq   4096 Aug 29 01:33 obj_dir
-rw-rw-r-- 1 Xq   Xq      0 Aug 29 01:01 test.cc
drwxrwxr-x 2 root root 4096 Aug 29 02:00 tmp
[Xq@VM-24-4-centos 8_29]$

[Lxy@VM-24-4-centos tmp]$ ll
total 0
-rw-rw-r-- 1 Lxy Lxy 0 Aug 29 01:58 Lxy1.c
-rw-rw-r-- 1 Lxy Lxy 0 Aug 29 01:58 Lxy2.c
-rw-rw-r-- 1 Lxy Lxy 0 Aug 29 01:58 Lxy3.c
-rwx------ 1 Xq  Xq  0 Aug 29 01:55 Xq2.c
-rwx------ 1 Xq  Xq  0 Aug 29 01:55 Xq3.c
# 此时我的确不能删除Xq用户的文件呢,没有权限
[Lxy@VM-24-4-centos tmp]$ rm Xq2.c
rm: remove write-protected regular empty file ‘Xq2.c’? y
rm: cannot remove ‘Xq2.c’: Permission denied
# 但是 我自己的也不能删除了
[Lxy@VM-24-4-centos tmp]$ rm Lxy1.c
rm: cannot remove ‘Lxy1.c’: Permission denied
# 甚至 我连文件都创建不了了,这也不符合需求啊
[Lxy@VM-24-4-centos tmp]$ touch Lxy4.c
touch: cannot touch ‘Lxy4.c’: Permission denied
[Lxy@VM-24-4-centos tmp]$

#因此人们提出了第二种解决方案:粘滞位
# 粘滞位的作用一:可以让多个用户在共同路径下进行读写创建删除文件
# 作用二:并且可以保证你只能删除创建你自己的文件,不能干涉我的文件
[Xq@VM-24-4-centos 8_29]$ ll
total 8
dr-xrwxr-x 2 Xq   Xq   4096 Aug 29 01:33 obj_dir
-rw-rw-r-- 1 Xq   Xq      0 Aug 29 01:01 test.cc
drwxrwxrwx 2 root root 4096 Aug 29 02:00 tmp
# 给tmp这个公共路径的other增添粘滞位
[Xq@VM-24-4-centos 8_29]$ sudo chmod o+t tmp
[Xq@VM-24-4-centos 8_29]$ ll
total 8
dr-xrwxr-x 2 Xq   Xq   4096 Aug 29 01:33 obj_dir
-rw-rw-r-- 1 Xq   Xq      0 Aug 29 01:01 test.cc
drwxrwxrwt 2 root root 4096 Aug 29 02:00 tmp
[Xq@VM-24-4-centos 8_29]$

[Lxy@VM-24-4-centos tmp]$ ll
total 0
-rw-rw-r-- 1 Lxy Lxy 0 Aug 29 01:58 Lxy1.c
-rw-rw-r-- 1 Lxy Lxy 0 Aug 29 01:58 Lxy2.c
-rw-rw-r-- 1 Lxy Lxy 0 Aug 29 01:58 Lxy3.c
-rwx------ 1 Xq  Xq  0 Aug 29 01:55 Xq2.c
-rwx------ 1 Xq  Xq  0 Aug 29 01:55 Xq3.c
# 由于这个文件的上级目录other被设置了粘滞位,此时Lxy这个用户不能删除Xq用户的文件
[Lxy@VM-24-4-centos tmp]$ rm Xq2.c
rm: remove write-protected regular empty file ‘Xq2.c’? y
rm: cannot remove ‘Xq2.c’: Operation not permitted
# 但是却可以删除自己的文件
[Lxy@VM-24-4-centos tmp]$ rm Lxy1.c
[Lxy@VM-24-4-centos tmp]$ ll
total 0
-rw-rw-r-- 1 Lxy Lxy 0 Aug 29 01:58 Lxy2.c
-rw-rw-r-- 1 Lxy Lxy 0 Aug 29 01:58 Lxy3.c
-rwx------ 1 Xq  Xq  0 Aug 29 01:55 Xq2.c
-rwx------ 1 Xq  Xq  0 Aug 29 01:55 Xq3.c
# 也可以创建自己的文件
[Lxy@VM-24-4-centos tmp]$ touch Lxy4.c
[Lxy@VM-24-4-centos tmp]$ ll
total 0
-rw-rw-r-- 1 Lxy Lxy 0 Aug 29 01:58 Lxy2.c
-rw-rw-r-- 1 Lxy Lxy 0 Aug 29 01:58 Lxy3.c
-rw-rw-r-- 1 Lxy Lxy 0 Aug 29 02:12 Lxy4.c
-rwx------ 1 Xq  Xq  0 Aug 29 01:55 Xq2.c
-rwx------ 1 Xq  Xq  0 Aug 29 01:55 Xq3.c
[Lxy@VM-24-4-centos tmp]$ 

注意:粘滞位只能给目录设置;一般是限制other权限的;一般是谁设置谁取消(一般都是root设置的)。

有时候Linux操作系统会有很多的临时数据,所有的临时文件放在系统的/tmp;需要把所有权限放开,但是只想让文件的owner删除自己的文件因此需要设置粘滞位;

[Xq@VM-24-4-centos 8_29]$ ll /tmp/ -d
drwxrwxrwt. 38 root root 12288 Aug 29 02:15 /tmp/
[Xq@VM-24-4-centos 8_29]$

总结:

粘滞位:对设置了粘滞位的目录,在该目录下只能文件的owner(root)可以删除 ,其他人不能删除;此时other可以创建文件,可以修改文件,但只能删除自己的文件。

当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由
一、超级管理员(root)删除
二、该目录的所有者删除
三、该文件的所有者删除
[Xq@VM-24-4-centos 8_29]$ ll
total 4
drwxrwxr-x 2 Xq Xq 4096 Aug 29 01:33 obj_dir
-rw-rw-r-- 1 Xq Xq    0 Aug 29 01:01 test.cc
[Xq@VM-24-4-centos 8_29]$ tree obj_dir/
obj_dir/
|-- test1.c
|-- test2.c
`-- test3.c

0 directories, 3 files
# 去掉目录的user的x权限,我们发现即使此时有r权限,也无法正常看到目录里面的内容
[Xq@VM-24-4-centos 8_29]$ chmod u-x obj_dir/
[Xq@VM-24-4-centos 8_29]$ ll obj_dir/
ls: cannot access obj_dir/test2.c: Permission denied
ls: cannot access obj_dir/test3.c: Permission denied
ls: cannot access obj_dir/test1.c: Permission denied
total 0
-????????? ? ? ? ?            ? test1.c
-????????? ? ? ? ?            ? test2.c
-????????? ? ? ? ?            ? test3.c
[Xq@VM-24-4-centos 8_29]$
# 去掉r权限,添加x权限
[Xq@VM-24-4-centos 8_29]$ chmod u+x,u-r obj_dir/
[Xq@VM-24-4-centos 8_29]$ clear
[Xq@VM-24-4-centos 8_29]$ ll
total 4
d-wxrwxr-x 2 Xq Xq 4096 Aug 29 01:33 obj_dir
-rw-rw-r-- 1 Xq Xq    0 Aug 29 01:01 test.cc
# 此时可以进入这个目录,但由于没有r权限,ll操作没有权限导致失败
[Xq@VM-24-4-centos 8_29]$ cd obj_dir/
[Xq@VM-24-4-centos obj_dir]$ ll
ls: cannot open directory .: Permission denied
[Xq@VM-24-4-centos obj_dir]$

关于权限的总结
目录的可执行权限是表示你可否在目录下执行命令。
如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目录, 即使目录仍然有-r 读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)
而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限,所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档

2.5. umask

在Linux当中,

普通文件,默认起始权限(666);

目录文件,默认起始权限(777);

# 在Linux下默认创建的文件/目录的权限分别是775,664
[Xq@VM-24-4-centos 8_29]$ touch test.cc
[Xq@VM-24-4-centos 8_29]$ mkdir obj_dir
[Xq@VM-24-4-centos 8_29]$ ll
total 4
drwxrwxr-x 2 Xq Xq 4096 Aug 29 01:01 obj_dir
-rw-rw-r-- 1 Xq Xq    0 Aug 29 01:01 test.cc
[Xq@VM-24-4-centos 8_29]$ 

哎,你不是告诉我 ,Linux下的文件或者目录的默认权限分别是777,666吗?怎么我创建的文件和目录的权限是775,664呢?
首先,默认起始权限 == 最终权限吗?答案是,不是,在这里我们需要引入一个东西umask,权限掩码。

凡是在umask中出现的权限,都不应该在最终权限中出现。

[Xq@VM-24-4-centos 8_29]$ umask   # 是一个八进制数
0002

最终权限 = 起始权限 & (~umask)

umask  num     设置默认权限掩码(这个num是一个八进制数)

这种修改默认权限掩码 只是临时修改,如果想要永久修改umask值,则需要修改配置文件

/etc/profile

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值