【Linux】Linux 权限
本篇文章主要讲解 Linux 操作系统中权限的知识与创建、切换、删除用户
1 Linux 下用户的分类与切换用户
1) 用户的分类
Linux 系统下是有两种用户的,一种是超级用户(root),一种是普通用户,既然 root 被称为超级用户,所以 root 用户是可以 Linux 系统下做任何事情,是不受限制的,但是普通用户就无法做全部的事情,只能做有限的事情,比如安装软件,在普通用户下是无法直接安装软件的:

可以看到想要安装 sl 命令时,系统提示你 You need to be root to perform this command,也就是你需要是 root 用户来执行这条命令,所以普通用户是无法安装软件的,这就是权限的差别。
另外,我们可以根据命令提示符号来分辨我们是 root 用户还是普通用户,root 用户提示符为 '#',普通用户提示符为 '$':

2) 切换用户
既然 root 用户与普通用户权限有差别,普通用户是无法执行部分操作的,那么如果我们是普通用户,我们如何突破权限来使用这些操作呢?在此之前,我们先来看一下如何创建一个普通用户以及如何在不同用户之间进行切换。
(1) 创建用户
创建用户我们使用的是 adduser 命令,具体操作为:
adduser 用户名
但是注意执行这条命令时,必须是 root 用户,要不然会提示你不允许进行该操作:

创建完成之后,在 /home 目录下会同时创建一个同名文件夹:

这样就完成了一个用户的创建。
(2) 添加用户密码
添加完一个用户之后,我们需要为该用户添加一个密码,使用 passwd 命令(password 密码的简称),具体操作为:
passwd 用户
输入两次新密码,就可以了,输入密码过程中,密码是隐藏的,也就是不显示。

注意更改密码也必须在 root 用户下进行。
(3) 切换用户
创建完用户之后,我们想要切换到该用户,使用 su 命令来切换到该用户,值得注意的是 root 用户切换为别的用户是不需要输入密码的,直接切换即可,但是从一个普通用户切换到另一个普通用户与 root 用户是需要输入要切换到用户的密码的,具体操作为:
su 用户名:直接切换用户,不更改当前工作目录
su - 用户名:切换用户的同时,将当前工作目录更改为自己的家目录

同时,root 用户由于权限非常大,即使不是其他用户,也是可以进入其他用户的家目录来操作其文件的,但是如果是一个普通用户,是无法进入其他用户的家目录的:

(4) 普通用户使用 sudo 来对指令提权
当我们是一个普通用户,我们无法执行某些操作,这时候如果你使用 sudo 指令来提权,也就是使用 root 用户的权限来执行该命令,这时候就可以执行该操作了,使用 sudo 时需要输入当前用户的密码:

但是一个新建的用户并不能使用 sudo 命令,原因就是该用户并没有在 root 用户的 sudoers 名单下,我们可以使用 nano 工具来将该用户添加进入 root 的 sudoers 名单:
nano /etc/sudoers
打开之后,找到下面图片中的部分,将用户添加进去即可:

输入完成之后,然后按 ctrl + x,之后按 y 退出 nano 工具,这样之后,就可以执行 sudo 命令了。
sudoers 名单就相当于是 root 用户的一个白名单,添加用户之后,就代表 root 用户信任该用户,所以会允许该用户使用 sudo 命令来使用 root 用户的身份来执行命令。
(5) 删除用户
如果一个用户没用了,我们就可以使用 userdel 命令来删除用户,具体操作为:
userdel 用户名:删除用户,但是不删除其家目录
userdel -r 用户名:删除用户的同时删除其家目录
userdel -f 用户名:强制删除用户,即使该用户在登录

2 Linux 文件权限管理
1) 文件访问者分类
文件访问者分为三类,分别是所有者、所属组以及其他用户:
所有者:文件和文件目录的所有者,用 u 来表示
所属组:文件和文件目录所有者所在的组的用户,用 g 来表示
其他用户:除了所有者和所属组之外的其他用户,用 o 来表示
2) 文件访问权限
文件的访问权限共有 4 种,每一个文件的访问者都有相应的权限:
(1) 读(r)权限:对于一个文件来说,读权限就是指读取文件内容的权限
(2) 写(w)权限:对于一个文件来说,写权限就是指修改文件内容的权限
(3) 执行(x)权限:对于一个文件来说,执行权限就是指执行该文件的权限
(4) "-" 权限:如果是 "-" 符号,代表没有该权限
所以一个文件的权限是由用户所处的文件访问者与文件访问权限共同决定的。如果我们利用 ls -l 命令列出所有文件,就可以在文件的详细信息中看到每个文件访问者的具体权限:

所列出的详细信息中,第一个字符是文件的类型,'-' 代表普通文件,'d' 代表目录,而后面的 9 个字符就是该文件的权限,前三个字符是所有者的权限,中间三个是所属组的权限,最后三个是其他用户的权限,比如对于 AVLTree.h 这个文件,所有者的权限为读和写,所属组的权限为读,其他用户的权限也是读。
可以看到一个文件访问者具有三个位置,如果我们使用 1 表示有该权限,0 表示没有该权限,那么 111 就表示具有 "rwx",所以我们就可以使用三个 8 进制数字来表示一个文件的权限,比如 666 表示的就是 110110110,变为字符表示就是 "rw-rw-rw-"。
3) 设置文件访问权限
(1) 修改文件访问权限
如果我们想要修改一个文件的权限,我们可以使用 chmod 命令来修改一个文件的权限,具体操作为:
chmod [选项] 权限 文件名
常用选项:
-R:递归的修改目录及其子目录与文件的权限
在更改权限时,需要注意,只有 root 用户和文件的拥有者才能更改文件的权限。
修改文件权限的格式:
u:代表拥有者
g:代表所属组
o:代表其他用户
a:代表所有用户
r:读权限
w:写权限
x:执行权限
+:代表给某个用户种类添加某种权限
-:代表给某个用户种类删除某种权限
=:覆盖原有权限,将权限更改为 = 后面的权限
示例:





上面说过,权限也可以用三个8进制数字来表示,所以我们在用 chmod 更改权限时,也可以用三个 8 进制数字来代表权限,比如 777 就代表 rwxrwxrwx:

(2) 修改文件拥有者
如果想要修改文件拥有者,我们可以使用 chown 来修改文件的拥有者,具体操作为:
chown [选项] 用户名 文件名

但需要注意如果普通用户想要把所有者改为其他用户需要使用 sudo 来提权。
(3) 修改文件所属组
使用 chgrp 命令来修改文件的所属组,具体操作为:
chgrp [选项] 用户名 文件名

同样的,一个普通用户将文件所属组更改为其他用户需要使用 sudo 来提权。
(4) umask 权限掩码
当你新建一个文件时,其默认权限为 666,也就是 rw-rw-rw-;新建一个目录时,默认权限为 777,也就是 rwxrwxrwx,但是当我们新建出来之后,我们发现其权限并不是这样的:

当我们在 root 用户新建一个文件之后,我们发现其新建文件权限为 rw-r--r--,目录为 rwxr-xr-x,可以发现与初始权限是不一样的,这里不太一样是因为 umask 权限掩码的存在。
umask 权限掩码由三个八进制数字组成,其作用是为了屏蔽一些不需要的权限。我们可以输入 umask 命令来查看一个用户的 umask 值:

可以看到 root 用户默认的 umask 值为 022(取后三位数字),普通用户为 002,有了 umask 权限掩码值之后,一个文件真正的权限值 = mask & (~umask)(mask 为初始的权限值)。
所以 root 用户下新建文件的真正权限 = 110 110 110 (666) & (~(000 010 010)(022)) = 110 100 100 (644,rw-r--r--),所以也就是上面看到的新建文件的权限了。
我们也可以通过 umask xxx 来更改用户的 umask 值,所以如果我们将 umask 改为 000,那么 root 用户新建的文件权限就是 666 了:

3 目录的权限
1) 目录权限的含义
目录的 rwx 权限所对应的含义如下:
r:是否可以用 ls 查看目录中的文件内容
w:是否可以在目录中创建和删除文件
x:是否可以进入目录
所以如果一个用户不是目录的创建者,而是目录的所属组,但是该目录的所属组具有写权限,那就可以删除掉该目录中的文件啊,所以这就产生了一个问题,一个用户虽然不是文件的创建者,却可以删除该文件。为了解决这一问题,就产生了一个粘滞位的概念。
2) 粘滞位
我们可以用 chmod + t 为一个目录设置粘滞位,具体操作为:
chmod +t 目录
如果为一个目录设置粘滞位之后,那么该文件下的目录就只能:
(1) 被 root 用户删除
(2) 被目录的所有者删除
(3) 被文件的所有者删除


4 总结
Linux 系统下的权限包括文件权限与目录权限,一个文件或者目录的权限取决于用户 + rwx 权限,文件与目录的 rwx 权限的含义不同,对于文件来说,rwx 权限就是指文件是否具有读、写与执行权限,对于目录来说,rwx 权限是指是否具有查看目录下的文件,是否能删除和新建文件以及能否进入目录,所以对于一个文件来说,是否能够被删除是由目录权限来决定的。
