权限管理
约 6425 字大约 21 分钟
2025-04-11
1.Linux 的权限基础
重要
补充:由于权限问题涉及到用户,因此我们来复习一下之前提到过的基本指令。
Linux
是一个多人协助的操作系统,不同的用户可以使用同一个 Linux
操作系统。因此在 Linux
中有关账户的相关指令也有很多,主要用到的指令有:
A.用户操作指令
Linux 是一个多人协助的操作系统,不同的用户可以使用同一个 Linux 操作系统。因此在 Linux 中有关账户的相关指令也有很多。
B.创建与删除用户
useradd
:创建新用户账户passwd
:设置或更改用户账户的密码,passwd username
会提示你输入新的密码来更改username
用户账户的密码usermod
:修改用户账户的属性。usermod -aG groupname username
会将用户username
添加到groupname
用户组中,用户组的概念我们之后会详细讲解userdel
:删除用户账户。userdel username
会删除名为username
的用户账户(请小心使用此指令,删除用户账户也会删除用户的文件和目录)
C.用户切换
sudo
:以管理员权限执行命令whoami
:查看当前所使用的用户,显示出用户名。exit
:如果是一个普通用户暂时登录 root 用户,则使用该指令后退回普通用户,也就是 root 退出登录。如果是一个普通用户直接使用exit
指令,则该普通用户退出登录。su
:su
命令(切换用户)允许您在当前会话中临时切换到另一个用户的身份。通过su
命令,您可以在不注销当前用户的情况下切换到其他用户。默认情况下,su
命令将切换到超级用户(root)。如果使用su username
的形式,其中username
是目标用户的用户名,那么会切换到指定用户的身份。与login
不同,su
命令不会重置环境变量和工作目录,因此使用su
切换用户后,您将继承当前用户的环境设置。切换用户身份。而su username
可以将当前用户切换为username
用户,其中su -
输入 root 密码后可以切换为 root 身份(不带参数直接用su
,相当于su root
)。login
:login
和su
命令都用于切换用户身份,但它们之间有一些区别。login
命令用于完全登录到一个新的用户账户。当您使用login
命令时,系统将要求您输入目标用户的用户名和密码。这意味着您将完全切换到目标用户的环境,包括用户的登录 shell、环境变量、工作目录等。使用login
命令后,您可以执行与目标用户相同的操作,并且所有命令将在目标用户的上下文中执行。login 命令无效的话有可能是系统配置问题可能缺少额外的软件包,也有部分需要切换到 root 下才可执行。但是这个命令在 ssh 远程链接的环境下基本没有什么用,所以在很多工作场景下很少使用。
用户组设置
groupadd
:用于创建新用户组,groupadd [选项] 组名
其中,[选项]
是可选的,可以指定一些额外的参数。而 组名
则是您希望创建的用户组的名称。以下是一些常见的 groupadd
命令选项:
-g GID
:指定用户组的 GID(组标识符)。默认情况下,系统会自动分配一个未被使用的 GID。-r
:创建一个系统用户组(也称为系统保留组),其 GID 通常在低范围内。系统用户组主要用于系统进程、服务以及系统级任务。-f
:如果用户组已存在,则强制创建。如果不使用此选项且用户组已经存在,则会返回错误。强制创建用户组时,如果指定的用户组名称已经存在,系统将会先删除原先已存在的用户组,然后再创建一个同名的新用户组(注意这个操作还是很危险的)。
usermod
:修改用户账户的属性。usermod -aG groupname username
会将用户username
添加到groupname
用户组中使用
groups 用户名
指令可以查看当前用户所在的用户组而移除用户组内用户的指令是
gpasswd -d 用户名 组名
现在让我们来学习一下 Linux 下的权限概念。 实际上在 Linux
中 权限 = 用户(用户自己的权限) + 文件或目录属性(文件天然就有的权限)
。因此接下来让我们介绍一下“用户”和“文件属性”,然后再来修改相关权限。
不过您首先需要做好一件事,就是关于 sudo
的设置。
# 将用户添加到 wheel 组
sudo usermod -aG wheel newusername
# 验证用户是否在 wheel 组中
groups newusername
root ALL=(ALL) ALL
:root
用户具有完全权限。%sys ALL = ...
:sys
组的成员具有特定类别的权限,但此行当前被注释掉。%wheel ALL=(ALL) ALL
:wheel
组的成员具有完全sudo
权限。%wheel ALL=(ALL) NOPASSWD: ALL
:wheel
组的成员具有完全sudo
权限且不需要密码(当前被注释掉)。
可能需要退出一下重新登录用户账号...
1.1.用户基本知识
1.1.1.账户分类
Linux
是多用户操作系统,用户可以分为普通用户和 root
用户
普通用户:存在多个用户,其受到权限的约束
root
:只有一个root
,其具有Linux
下的最高权限
不同的用户最好使用不相同的密码。
补充:
root
相当于Windows
系统中的administrator
用户。
1.1.2.用户身份
拥有者
owner
:文件属于哪一个用户所属组
group
:文件属于哪一个组其他人
other
:不属于上面任何一个的就是other
1.2.文件基本知识
1.2.1.文件的属性
一个文件或者目录具有三个属性:读取 r
、修改 w
、执行 x
。
ll
命令可以显示的第一列字符串就显示了一个文件的三属性。
其中有三组字符串,分别对应 owner
、group
、other
三种用户身份的权限,字符串的显示权限就是每个身份的权限,-
表示没有对应的权限。
除了字符串表示法,还可以使用二进制来完整表述文件/目录的权限(因为每一种状态可以理解为一种开关,使用 1/0
来表示是否有对应的权限即可)
1.2.1.1.文件三属性(更多在于文件本身)
r
:可“读取(cat
、vim
)文件”,如果没有这个权限,用vim
会看到空白内容w
:可“写入(echo
、vim
)文件”,如果没有这个权限删除目录的时候会出项提示x
:可“运行(./
)文件”,但不一定真的可执行,只是具有执行权力罢
1.2.1.2.目录三属性(更多在于内部文件)
r
:可“展开(ls
)子文件/子目录”的列表,但无法知道每个文件的具体属性w
:可“创建(touch
、mkdir
)子文件/子目录、移动/改名(mv
)子文件/子目录、复制(cp
)内部文件/子目录”、删除(rm
)子文件/子目录(但是也要进得去才行,也就是有x
权限)x
:可进入(cd
)该目录(并且可以详细阅读内部文件或子目录的具体属性)
注意:一个文件能不能被删除,不是由文件决定的额,而是要看所属父目录是否由
w
权限,此时才可以删除。
1.2.2.文件的类型
在 Linux
下不以文件后缀来区分文件类型,虽然我们可以加上后缀来区分文件类型,但是这在系统层面来说是没有意义的,仅仅方便用户显示罢了。
如果开头为:
r
表示目录-
表示普通文件p
表示管道文件(用于进程间通信操作,使用mkfifo
创建)b
表示块设备(对数据是作块处理的,最典型的块设备就是磁盘设备、硬盘分区等,云服务器对应的磁盘为vda
,可以在/dev
下查看)c
字符设备(最典型的就是键盘设备和显示器设备等)l
链接文件(类似Windows
的快捷键,使用ln
创建)……
如果使用 ll
命令显示的第一个字符就显示了一个文件的类别。
但是注意,为什么有的时候文件的后缀会影响效果呢?比如:使用 gcc
编译包含 C
程序的后缀为 .txt
的文件时,会发现提示文件格式错误。
这是因为对于 gcc
来说,它是一个 Linux
下的软件,Linux
系统的确是没有对文件有后缀要求,但是不排除某些软件对文件有后缀要求(比如本例的 gcc
)。
补充:这里补充一下字符设备的知识,当我们尝试在
xshell
内多开一个用户会话窗口,然后使用命令ls /dev/pts/* -l
就可以发现这里存在很多文件。这些都是些终端文件。
如果我们尝试使用
each
写入这个文件,就会发现写入的内容在另外一个会话中出现了。
如果我们再次关掉这个会话,我们会发现有某个文件消失了。

这也变相证明了 Linux 下一切皆文件,上述我们操作的就是一个字符设备文件。
2.Linxu 的权限操作
权限操作分为:修改用户权限、修改文件所属。
2.1.修改用户权限 [chmod 指令]
默认情况下,如果当前终端用户直接使用 mkdir
和 touch
指令后,得到的目录权限和文件权限如是:rwx rwx r-x
和 - rw- rw- r--
。
转换成二进制就是 111 111 101
和 110 110 100
,若是转化为八进制就是 7 7 5
和 6 6 4
。
如果想要修改不同用户身份对文件的权限,有两种方法,一种使用字符修改(直观),另一种使用八进制修改(快速)。
2.1.1.字符修改(直观)
对拥有者:
chmod u+权限,u-权限 文件/目录
对所属组:
chmod g+权限,g-权限 文件/目录
对其他人:
chmod o+权限,o-权限 文件/目录
或者一次设置三种身份的权限:
chmod u+/-权限,g+/-权限,o+/-权限 文件/目录
或者同步所有身份的权限:
chmod a+/-权限 文件/目录
上述的“权限”字段处可以填写权限字符 r
、w
、x
,因此比较直观。
$ ll
total 8
dr--r-x-wx 2 所属用户 所属用户组 4096 Aug 2 14:49 file
-rwxrwxrwx 1 所属用户 所属用户组 22 Aug 2 14:47 text.txt
$ chmod u+r+w+x,g+r+w+x,o+r+w+x file
$ ll
total 8
drwxrwxrwx 2 所属用户 所属用户组 4096 Aug 2 14:49 file
-rwxrwxrwx 1 所属用户 所属用户组 22 Aug 2 14:47 text.txt
2.1.2.八进制修改(快速)
还有一种修改方法,是使用八进制修改,因为有无权限代表两种状态,这很符合二进制的 1/0 状态。
比如
rwx rwx rwx = (111 111 111)2 = (777)8
则对应chmod 777 test.txt
等价于chmod u+r+w+x,g+r+w+x,o+r+w+x
比如
--- --- --- = (000 000 000)2 = (000)8”则对应“chmod 000 test.txt
等价于chmod u-r-w-x,g-r-w-x,o-r-w-x
比如
rwx rw- r-- = (111 110 100)2 = (761)8”则对应“chmod 761 test.txt
等价于chmod u+r+w+x,g+r+w-x,o+r-w-x
注意:但是对于 root 来说,上面的权限设置完全没有任何限制。
2.2.修改文件所属 [chown 指令、chgrp 指令]
默认情况下,如果当前终端用户直接使用 mkdir
和 touch
指令后,得到的默认用户身份是:“所属者为自己”和“用户组为自己”。
使用
chown
指令可修改文件“所属用户”,sudo chown 所属者名 文件/目录
使用
chgrp
指令可修改文件“所属用户组”,sudo chgrp 所属组名 文件/目录
还可以同时修改文件“所属用户”和“所属用户组”,
sudo chown 所属者:所属组 文件/目录
other
身份是不确定的,也不需要设置,是相对改变的
需要注意的是,要赋予别人身份是需要经过别人同意的。同理,拿回身份也需要别人同意。可以”使用 root
账户强迫同意“或者”使用 sodu
指令强迫同意“。
注意:
sodu
使得后续执行命令以root
权限级别来执行,但是只是使用权限,是一种临时提升权限的方式,但是这个命令只有添加到信任列表/etc/sudoers
的用户才可以执行sudo
指令,而添加信任列表的操作只有root
才可以做到。
3.一次认证问题
如果一个文件的拥有者权限是 -wd
,而所属组权限是 rwd
那么拥有者是否能读取这个文件呢?
答案是不能,因为权限只能认证一次,只要看过所属者的权限,就不再考虑后续的权限设置。
4.umask 权限掩码
Linux
有设置文件的默认权限(普通用户):
用户权限:默认情况下,若当前终端用户直接使用
mkdir
和touch
指令后,得到的目录权限和文件权限是:d rwx rwx r-x
和- rw- rw- r--
。文件所属:默认情况下,若当前终端用户直接使用
mkdir
和touch
指令后,得到的用户身份是:“所属者为自己”和“用户组为自己”。
但是实际上一个目录被创建后起始权限从 777
开始,一个普通文件被创建后起始权限是 666
开始,也就是 rwx rwx rwx
和 rw- rw- rw-
。
但是为什么最后我们发现是 775
和 664
呢?答案是受了 umask
的影响,这将在后面解释。
凡是在 umask
中出现的权限,最终都不在最终权限中出现。
如果我们输入 umask
,则出现默认掩码 0002
(我的云服务器的默认值是这个,也有可能是其他的),我们现在只研究后三个 002
即可(实际上第一位是粘滞位,后面会提及)。
有关初始权限和掩码的计算过程如下:
777 & ~(002) = 111 111 111 & 111 111 101 = 111 111 101 = 775 = rwx rwx r-x
666 & ~(002) = 110 110 110 & 111 111 101 = 110 110 100 = 664 = rw- rw- r--
可以看出,只要掩码二进制位为1,在最终权限中对应位一定为0。
我们可以通过 umask
指令自己设置对应的八进制掩码。
而掩码设置的指令就是 umaks 掩码
。
umask
掩码的存在可以使得创建文件或目录的时候自动设置默认权限,可以增加系统安全性或隐私性。
补充:实际上
umask
是0002
本质目的去掉目录的w
权限,避免被other
用户修改删除。
5.粘滞位
- 如果别人在我的目录下创建了一个子文件,我没有任何的权限,但是我依旧是可以把它删除掉。为什么呢?因为删除文件不是文件本身的属性,而是目录的属性(
w
权限)。当然如果别人进都进不来,更别谈删除什么文件了。 - 这会引发一个问题:如果我需要和别人在某个特殊的路径下共同协作怎么办?虽然我可以设置我的子文件的读写执行权限,但是我不能阻止别人删除呀!其实这也简单,让
root
控制这个目录,将其other
权限设置为chmod o-w
,这样对于root
来说,其他用户都是other
,都无法删除别人的文件和目录。 - 但是这就产生了一个新的问题:
other
用户们发现不仅不能删除别人的文件,还不能删除自己的,甚至连创建文件都没办法做到。 - 于是我们来到最终的解决方案:粘滞位。
粘滞位是一个特殊的权限位,该权限的设置命令为:chmod +t 某个目录
。
注意:只有目录才能设置粘滞位,对于文件本身是没有该标志符号的。
这个时候就会发现 other
权限的最后一个 x
占位出的字符变成了一个 t
字符,该权限的表现方式是:各个用户在内部创建的文件无法被其他用用户删除,但是依旧可以创建自己的目录(当然除了这个父目录的所属者和 root
管理者)。
另外,粘滞位一般是谁设置谁取消(当然,除了 root
)。
补充:粘滞位的设置可以通过使用 chmod 命令并在权限位中添加数字 1(例如,
chmod 1777
某目录)来完成。取消粘滞键可使用chmod -t 某目录
或者chmod 0777 某目录
。