文章目录
- 一.权限的概念
- 二.Linux中的角色
-
- [2.1 Linux中的两类人](#2.1 Linux中的两类人)
- [2.2 身份切换](#2.2 身份切换)
- [2.3 指令提权](#2.3 指令提权)
- 三.文件属性
- 四.权限操作
-
- [4.1 属性修改](#4.1 属性修改)
- [4.2 角色修改](#4.2 角色修改)
- 五.权限的三个问题
-
- [5.1 目录权限](#5.1 目录权限)
- [5.2 缺省权限](#5.2 缺省权限)
- [5.3 粘滞位](#5.3 粘滞位)
一.权限的概念
在Linux系统中,权限(Permissions) 是用于控制用户或用户组对文件和目录的访问、修改和执行能力的安全机制。通过权限管理,系统可以确保数据的安全性和隐私性,防止未授权的访问或操作。
总的来说,权限=角色+事物属性。权限一定是针对于某种角色展开的,且如果所对应的事物天然不具备某种属性,那么它的权限也就无从谈起,例如,对于一个文本文件,本身就不具有可执行的属性,就不可能给予可执行的权限。最终,权限影响的是用户"能"或者"不能"做一件事情。
二.Linux中的角色
2.1 Linux中的两类人
在Linux中人可以分成两大类,一类是超级用户(超级管理员),一类是普通用户。超级用户在Linux系统中,几乎不受任何约束,而普通用户,在Linux中是使用者的身份,受到权限的约束。
在Linux系统中如何知道自己是超级用户还是普通用户呢?可以通过输入 whoami 指令,如下:
bash
[root@hcss-ecs-647d ~]# whoami
root
当输入指令后,显示的是 root 说明自己现在是超级用户,若是其他的则是普通用户。
我们知道,Linux系统是一款多用户操作系统,也就是可被多个用户同时使用。那么我们就可以在操作系统中新建一个账号,使用 adduser xxx 指令,即可新建账号,过程如下:、
bash
[root@hcss-ecs-647d ~]# adduser lisi #新建一个名叫lisi的账号
[root@hcss-ecs-647d ~]# passwd lisi #设置账号的密码
Changing password for user lisi.
New password: #输入密码
Retype new password: #再次输入密码
passwd: all authentication tokens updated successfully. #新建账号成功
这里需要注意的是,在操作系统中,输入密码是不会在显示屏上回显的!!
新建账号的操作只有管理员才能执行!!
当登陆 lisi 账号时,输入 whoami 指令:
bash
[lisi@hcss-ecs-647d ~]$ whoami
lisi
说明使用者登陆的是 lisi 账号,那么该使用者在操作系统中的身份就是一个普通用户的身份。
2.2 身份切换
- 超级用户 -> 普通用户
输入 su xxx 指令即可进行切换
bash
[root@hcss-ecs-647d ~]# whoami
root
[root@hcss-ecs-647d ~]# su lisi
[lisi@hcss-ecs-647d root]$ whoami
lisi
超级用户可以随意切换操作系统下的任意普通用户
- 普通用户 -> 超级用户
输入 su root 或者 su 指令都可以切换:
bash
[lisi@hcss-ecs-647d root]$ su
Password:
[root@hcss-ecs-647d ~]# whoami
root
切换成超级用户时,需要输入超级用户的密码。普通用户能切换成超级用户,这种情况下就说明,超级用户是 lisi 管理的,lisi 就是现实中的管理员,所以 lisi 既是普通用户也是超级用户。若该系统下还有其他账户,但是都不知道超级用户的密码,那么那些普通用户也就只能在自己的账户下操作。
以上就是一种切换身份的方式,另一种普通用户切换成超级用户的方式如下:
bash
[lisi@hcss-ecs-647d ~]$ whoami
lisi
[lisi@hcss-ecs-647d ~]$ pwd
/home/lisi
[lisi@hcss-ecs-647d ~]$ su
Password:
[root@hcss-ecs-647d lisi]# whoami
root
[root@hcss-ecs-647d lisi]# pwd
/home/lisi
从上面我们可以看到,普通用户切换成超级用户后的工作路径还是没有改变,说明这个只是单纯的身份切换,若想做到真正的切换到root账户下,就要进行 su - 指令,如下:
bash
[lisi@hcss-ecs-647d ~]$ whoami
lisi
[lisi@hcss-ecs-647d ~]$ pwd
/home/lisi
[lisi@hcss-ecs-647d ~]$ su -
Password:
Last login: Thu Jul 31 10:26:53 CST 2025 on pts/1
[root@hcss-ecs-647d ~]# whoami
root
[root@hcss-ecs-647d ~]# pwd
/root
真正切换到root账户下需要重新登陆!!
- 普通账号之间的切换
输入 su xxx 指令,如下:
bash
[lisi@hcss-ecs-647d ~]$ whoami
lisi
[lisi@hcss-ecs-647d ~]$ su lll
Password:
切换成 lll 账户就要输入 lll 的密码,所以在操作系统下,每个账户就相当于现实中一个个独立的个体,若想要切换谁的身份就要输入该身份的密码,若不知道密码,就说明你没有切换该身份的权限。但是,超级用户有切换任意账户的权限,且不需要输入密码,如下:
bash
[root@hcss-ecs-647d ~]# whoami
root
[root@hcss-ecs-647d ~]# su lisi
[lisi@hcss-ecs-647d root]$ whoami
lisi
[lisi@hcss-ecs-647d root]$ exit #切换回超级用户
[root@hcss-ecs-647d ~]# whoami
root
[root@hcss-ecs-647d ~]# su lll
[lll@hcss-ecs-647d root]$ whoami
lll
总结:lisi、lll 在操作系统下是真实的人,而 root 是由这些真实的人里的某个人承担
2.3 指令提权
root 身份不受约束,也就意味着可以执行更高权限的命令,那么如何在不切换身份的情况下,执行更高权限的命令呢?
输入 sudo 命令即可以在不切换身份的情况下,以root身份执行命令,如下:
红框的内容说明,该file.txt是由lisi创建,若进行提权之后呢?
提权之后 myfile.txt是由root创建的。这里需要注意提权之后输入的密码是此时普通用户的密码,而不是root的密码,输入后提权就完成了。但是,这就出现了疑惑的点,为什么使用root的权利时,输入的是自己的普通账户的密码,而不是root的密码呢,这样的话,是不是每个普通用户都可以随便使用root权利了,这结论是不对的,能进行提权的用户,是Linux系统中信任的用户,宏观上,对于新建的用户来说,默认是执行不了提权的指令的。简单的来说,就是在Linux系统中,有一个 "白名单",里面记录了Linux系统信任的用户,而 "白名单" 是由超级用户进行管理的,所以在 "白名单"里面的用户都可以进行提权的操作。(将用户添加到 "白名单" 中的操作这里就先不过多说明)
所以当不在 "白名单" 里的用户进行提权时,就会出现权限被拒绝的情况,如下:
bash
[lisi@hcss-ecs-647d ~]$ sudo ls
[sudo] password for lisi:
lisi is not in the sudoers file. This incident will be reported.
一般什么情况下需要指令提权呢?
当普通用户在下载一款软件时,需要安装到系统时,就需要进行指令提权了。简单来说就是往往我们安装软件时,需要拷贝到系统的路径下,当拷贝到系统路径下时,可能会遇到权限被拒接的情况,所以在安装软件时,我们往往需要超级用户的权限来执行,这就需要用到提权的操作。
三.文件属性
当输入 ls -l 指令时,会显示文件的基本信息,如下:
bash
[lisi@hcss-ecs-647d ~]$ ls -l
total 4
drwxrwxr-x 2 lisi lisi 4096 Aug 1 09:35 dir
-rw-rw-r-- 1 lisi lisi 0 Jul 31 11:31 file.txt
-rw-r--r-- 1 root root 0 Jul 31 11:34 myfile.txt
这些信息所代表的含义如下图:
对于文件类型,"d" 开头的文件为目录;"-"开头的文件为普通文件;"c"开头的文件为字符设备文件,如:显示器、键盘等;"b" 开头的文件为块设备文件,如:磁盘;"p" 开头的文件为管道文件;"l"开头的文件为链接文件。
看到图中的黄色框和绿色框,它们代表着在文件中扮演者什么样的角色,但实际上,在Linux中角色分成三类:
- 文件拥有者
- 文件所属组
- other(其他人)
系统会自动用登陆的账户名,如:lisi,与文件拥有者和文件所属组进行匹配,若两者都不是则会自动判定成other
图中黄色框内,每一行共有9个字符,其中三个字符为一组,分别代表三类角色所对应的不同的权限。对于文件来讲,无非就三种属性,读( r )、写(w)、可执行(x)。举例如下:
lisi作为文件的拥有者,具有读、写、可执行的权限,作为所属组时,也有读、写、可执行的权限,而对于other来说,只有读和可执行的权限
四.权限操作
4.1 属性修改
bash
drwxrwxr-x 2 lisi lisi 4096 Aug 1 09:35 dir
若想修改dir的权限,我们可以输入 chmod [角色] +/- [权限] 目标文件/目录 指令即可,如下:
- 修改拥有者的读、写权限
bash
drwxrwxr-x 2 lisi lisi 4096 Aug 1 09:35 dir
[lisi@hcss-ecs-647d ~]$ chmod u-rw dir
[lisi@hcss-ecs-647d ~]$ ls -ld dir
d--xrwxr-x 2 lisi lisi 4096 Aug 1 09:35 dir
- 修改所属组的可执行权限
bash
d--xrwxr-x 2 lisi lisi 4096 Aug 1 09:35 dir
[lisi@hcss-ecs-647d ~]$ chmod g-x dir
[lisi@hcss-ecs-647d ~]$ ls -ld dir
d--xrw-r-x 2 lisi lisi 4096 Aug 1 09:35 dir
- 为other增加写权限和修改可执行权限
bash
d--xrw-r-x 2 lisi lisi 4096 Aug 1 09:35 dir
[lisi@hcss-ecs-647d ~]$ chmod o+w,o-x dir
[lisi@hcss-ecs-647d ~]$ ls -ld dir
d--xrw-rw- 2 lisi lisi 4096 Aug 1 09:35 dir
- 给全部角色都加上读、写和可执行权限
bash
d--xrw-rw- 2 lisi lisi 4096 Aug 1 09:35 dir
[lisi@hcss-ecs-647d ~]$ chmod a+rwx dir
[lisi@hcss-ecs-647d ~]$ ls -ld dir
drwxrwxrwx 2 lisi lisi 4096 Aug 1 09:35 dir
全部角色都没有读、写和可执行权限,也类似操作
注意:
1.要想修改角色的权限,只有文件的拥有者,或者超级用户,才能修该自己文件的权限!!
2.在Linux下可执行的文件需要两个条件,该文件真的是一个可执行文件,且操作者必须有可执行的权限
3.拥有者、所属组、other和此时登陆的账户身份进行身份对比的时候,依次只对比一次,也就是说,当拥有者和所属组是同一个人时,系统只会对比拥有者的身份
修改文件属性的第二种方法:以八进制修改文件属性
我们知道对于一个角色来说是否有读、写和可执行权限,是用(r / -)、(w / -)和(x / -)来表示的,对于程序员来说,其实就是(是/否)、(是/否)、(是/否),而对于计算机来说,是/否 用二进制来表示就是(1/0)、(1/0)、(1/0),以此我们就可以推出,若想表示角色的权限我们可以用二进制来表示。以拥有者的权限为例,二进制的取值范围为[000,111]转换成十进制就是[0,7],再观察取值范围在0~7之间就是八进制的取值范围,所以用八进制表示权限的方式如下举例:
bash
[lisi@hcss-ecs-647d ~]$ ls -ld file.txt
-rw-rw-r-- 1 lisi lisi 0 Jul 31 11:31 file.txt
拥有者具有读写权限,对应的二进制为110 -> 6
所属组具有读写权限,对应的二进制位110 -> 6
other具有读权限,对应的二进制位100 -> 4
所以该权限的八进制表示方法为664
有了以上的认识,我们就可以对权限进行改写,如:给拥有者全部权限,给所属组和other取消权限
bash
[lisi@hcss-ecs-647d ~]$ ls -ld file.txt
-rw-rw-r-- 1 lisi lisi 0 Jul 31 11:31 file.txt
[lisi@hcss-ecs-647d ~]$ chmod 700 file.txt
[lisi@hcss-ecs-647d ~]$ ls -ld file.txt
-rwx------ 1 lisi lisi 0 Jul 31 11:31 file.txt
以上就是权限修改的两个方案
4.2 角色修改
对拥有者进行修改,如:将拥有者的身份给zs,使用chown 命令即可
bash
[lisi@hcss-ecs-647d ~]$ ls -ld file.txt
-rw-rw-r-- 1 lisi lisi 0 Jul 31 11:31 file.txt
[lisi@hcss-ecs-647d ~]$ sudo chown zs file.txt
[sudo] password for lisi:
[lisi@hcss-ecs-647d ~]$ ls -ld file.txt
-rw-rw-r-- 1 zs lisi 0 Jul 31 11:31 file.txt
补充:修改角色需要进行指令提权或者超级用户才能执行!!
对所属组进行修改,如:将所属组的身份给root,使用chgrp 命令即可
bash
[lisi@hcss-ecs-647d ~]$ ls -ld file.txt
-rw-rw-r-- 1 zs lisi 0 Jul 31 11:31 file.txt
[lisi@hcss-ecs-647d ~]$ sudo chgrp root file.txt
[lisi@hcss-ecs-647d ~]$ ls -ld file.txt
-rw-rw-r-- 1 zs root 0 Jul 31 11:31 file.txt
同时修改拥有者和所属组,如下:
bash
[lisi@hcss-ecs-647d ~]$ ls -ld file.txt
-rw-rw-r-- 1 zs root 0 Jul 31 11:31 file.txt
[lisi@hcss-ecs-647d ~]$ sudo chown lisi:lisi file.txt
[lisi@hcss-ecs-647d ~]$ ls -ld file.txt
-rw-rw-r-- 1 lisi lisi 0 Jul 31 11:31 file.txt
五.权限的三个问题
5.1 目录权限
- r 权限对于目录的意义,能进入到目录中,查看当前目录的信息,若没有r 权限,就只能进入目录,但无权查看目录信息
- w 权限对于目录的意义:能进入到目录中,若有w 权限则可对当前目录内部进行修改、删除等操作;若没有w 权限,则无权对目录的内容进行修改
- x 权限对于目录的意义:判断能否进入到目录中
5.2 缺省权限
bash
[lisi@hcss-ecs-647d ~]$ ls -l
total 4
drwxrwxr-x 2 lisi lisi 4096 Aug 2 09:54 dir
-rw-rw-r-- 1 lisi lisi 0 Aug 2 09:55 file.txt
上面是刚刚新建的目录和普通文件,创建之后dir 默认的权限是,拥有者和所属组是可读、写、执行,other是读、可执行,那么所对应的八进制为775;以此类推,普通文件 file.txt 默认的权限为664 ,该缺省权限是如何得来的呢,如下知识点补充:
- 当新建一个目录时,起始权限其实是777,普通文件的起始权限则是666
- 为了满足用户需求,使用户能定制缺省权限,所以在Linux下出现了 umask 权限掩码
bash
[lisi@hcss-ecs-647d ~]$ umask
0002
默认情况下权限掩码是 0002 ,若用户想定制自己的缺省权限,即可通过修改权限掩码来达到目的。
修改方式如下:
首先权限掩码的第一位不必理会,002 才是我们所关注的,所以,最终缺省权限(默认权限)= 起始权限 & (~umask) ,如下举例:
根据上图所得的缺省权限的原理,我们就可对umask进行修改来达到目的,如下:
bash
[lisi@hcss-ecs-647d ~]$ umask 777
[lisi@hcss-ecs-647d ~]$ umask
0777
[lisi@hcss-ecs-647d ~]$ mkdir newdir
[lisi@hcss-ecs-647d ~]$ ll
total 8
drwxrwxr-x 2 lisi lisi 4096 Aug 2 09:54 dir
-rw-rw-r-- 1 lisi lisi 0 Aug 2 09:55 file.txt
d--------- 2 lisi lisi 4096 Aug 2 10:25 newdir
修改权限掩码为777后,新建一个目录,此时的缺省权限就变成000
5.3 粘滞位
我们可以发现,普通用户在Linux系统下登陆自己的账户时,默认的路径是,家目录下自己的账户,如下:
bash
[lisi@hcss-ecs-647d ~]$ pwd
/home/lisi
而在家目录下,有很多用户
bash
[lisi@hcss-ecs-647d home]$ pwd
/home
[lisi@hcss-ecs-647d home]$ ls -l
total 12
drwx------ 3 lisi lisi 4096 Aug 2 10:27 lisi
drwx------ 14 lll lll 4096 Jul 31 09:12 lll
drwx------ 2 zs zs 4096 Aug 1 16:24 zs
这些用户的权限都是只有拥有者有读、写和可执行,所以可以推出,在Linux多用户下,对于文件的访问,是隔离的,也就是说,每个用户只能进入自己的工作目录,别人的工作目录是无权访问的。(root用户除外)
这就诞生了一种需求场景,Linux下每个用户都是隔离的,那我们想要在Linux系统下不同的账号用户共享文件,这种情况该如何解决呢?
首先,由于我们知道用户之间是隔离的,那么该共享的文件一定不能创建在某个普通用户的工作目录下,而是创建在其他目录下,也就是根目录
那么先在根目录下创建一个共享目录:
bash
[lisi@hcss-ecs-647d /]$ ls
bin etc lost+found other sbin usr
boot home media proc srv var
CloudrResetPwdAgent lib mnt root sys
dev lib64 opt run tmp
[lisi@hcss-ecs-647d /]$ sudo mkdir share_dir
[sudo] password for lisi:
[lisi@hcss-ecs-647d /]$ ls
bin etc lost+found other sbin tmp
boot home media proc share_dir= usr
CloudrResetPwdAgent lib mnt root srv var
dev lib64 opt run sys
由于根目录只有超级用户能进行修改,所以创建共享目录需要进行指令提权,创建好之后,还不能进行文件共享
bash
[lisi@hcss-ecs-647d /]$ ls -ld /share_dir/
drwxr-xr-x 2 root root 4096 Aug 2 10:55 /share_dir/
此时的other没有 w 权限,所以需要给other加上 w 权限
bash
[lisi@hcss-ecs-647d /]$ sudo chmod o+w /share_dir/
[sudo] password for lisi:
[lisi@hcss-ecs-647d /]$ ls -ld /share_dir/
drwxr-xrwx 2 root root 4096 Aug 2 10:55 /share_dir/
加上之后,不同账户用户就可以在该目录下进行文件共享了
可是,这就存在了一些问题,对于共享目录而言,other具有 rwx 权限,那么也就意味着,每个人都可以对该目录进行随意读写和执行,若某些不属于共享文件的参与者对该共享目录下的共享文件进行随意修改或者删除,是不受任何约束的。所以为了保障共享目录下的共享文件不被破坏,Linux系统提供了粘滞位,在创建共享目录时,加上 +t 的指令,即可为共享目录添上粘滞位的特性,如下:
bash
[lisi@hcss-ecs-647d /]$ ls -ld share_dir/
drwxr-xrwx 2 root root 4096 Aug 2 11:07 share_dir/
[lisi@hcss-ecs-647d /]$ sudo chmod +t share_dir/
[lisi@hcss-ecs-647d /]$ ls -ld share_dir/
drwxr-xrwt 2 root root 4096 Aug 2 11:07 share_dir/
加上粘滞位后,other的权限被改成了 rwt ,以后,任何用户,在设置了粘滞位的目录下,自己只能删除自己的文件,其他人无法删除,但 root 无视
注:粘滞位只能给目录设置,不能给普通文件设置
在Linux系统下,已经给用户预装了共享目录
bash
[lisi@hcss-ecs-647d /]$ ls
bin etc lost+found other sbin usr
boot home media proc srv var
CloudrResetPwdAgent lib mnt root sys
dev lib64 opt run tmp
[lisi@hcss-ecs-647d /]$ ls -ld tmp
drwxrwxrwt. 10 root root 4096 Aug 2 03:38 tmp
用户可在 tmp 目录下进行文件共享