🌼🌼 在 Linux 系统中,权限是保障系统安全与稳定的核心之一。每个操作都可能涉及权限的管理和控制,特别是当你开始以不同用户的身份进行操作时。本文将通过生动的比喻与详细的技术解析,带你一起深入理解 Linux 权限系统的运作原理。
📖 什么是 Shell?
Shell 是 Linux 操作系统中的一个中间层,类似于一个桥梁,连接了用户与操作系统的内核(kernel)。我们平时通过命令行输入的指令,都是通过 Shell 来传递给内核执行的。你可以把它想象成一个助手,它帮你传达命令并把执行结果反馈回来。
Shell 比喻:小明和王婆的故事
假设我们有以下人物:
-
小明:用户,想要完成一些操作。
-
王婆:Shell,作为一个中介,负责传递小明的需求。
-
小美:操作系统,最终接收命令并执行。
-
小王:权限限制,可能会阻止命令的执行。
-
村长:超级用户(root),可以直接进行任何操作。
场景一:命令执行成功
小明让王婆去做媒,王婆派出实习生去找到小美,小美同意了,任务完成。这里,小明的操作没有受到任何权限限制。
场景二:命令执行失败
小明让王婆去做媒,但小美已经和小王在一起了。王婆知道此事不能成,因此拒绝了命令并反馈“Permission Denied”(权限拒绝)。在 Linux 中,这种情况类似于普通用户没有足够权限去操作系统中的文件或资源。
场景三:超级用户的特权
小明非常喜欢小美,他求助于村长(root)。村长派王婆去做媒,这次王婆不受限制,能够顺利完成任务。这里的超级用户(root)可以无视所有权限限制,执行任何操作。
📃 Shell 的作用
Shell 作为操作系统与用户之间的中介,承担了以下几项重要任务:
-
命令传递:Shell 将用户输入的命令传递给内核,并返回执行结果。
-
创建子进程:Shell 在执行命令时会创建子进程,确保操作不直接影响主进程。
-
权限管理:Shell 基于用户的权限,决定是否可以执行某个命令。
通过 Shell,Linux 系统能够根据用户的不同权限,决定是否执行某些操作。
Linux下有两种用户:
超级用户(root)、普通用户。
超级用户:可以再linux系统下做任何事情,不受限制
普通用户:在linux下做有限的事情。
超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。
命令:su [用户名]
功能:切换用户。例如,要从root用户切换到普通用户user,则使用 su user。 要从普通用户user切换到root用户则使用 su root(root可以省略),此时系统会提示输入root用户的口令
用户分类:User, Group 和 Others
在 Linux 中,文件和目录的权限是针对不同用户角色设定的。主要有三种用户分类:
-
User(u):文件的拥有者。通常,文件的创建者是该文件的拥有者。
-
Group(g):文件所属的用户组。用户可以通过将文件与特定组关联,给组内成员设置权限。
-
Others(o):除了文件拥有者和所属组外的所有用户。
每个用户角色可以被分配不同的权限(读、写、执行),通过这种权限组合来控制文件和目录的访问。以下是常见的权限组合表示:
-
rwxr-xr--
:表示文件拥有者具有读、写、执行权限;组用户具有读、执行权限;其他用户只有读权限。
文件权限
在 Linux 系统中,文件权限决定了用户对文件的访问权限,包括读取文件内容、修改文件内容和执行文件。文件权限主要有三种:读权限(r)、写权限(w)和执行权限(x)。
1. 文件权限的三种类型
-
读权限(r):
-
作用:允许用户查看文件内容。
-
适用:当文件具有读权限时,用户可以使用
cat
、less
等命令查看文件内容。
-
-
写权限(w):
-
作用:允许用户修改文件内容。
-
适用:当文件具有写权限时,用户可以编辑文件、添加内容或删除内容。
-
-
执行权限(x):
-
作用:允许用户执行文件(如脚本或程序)。
-
适用:当文件具有执行权限时,用户可以通过命令行运行该文件(如执行
.sh
脚本或二进制文件)。
-
2. 文件的权限表示
文件的权限使用 rwx
表示,其中:
-
r(read)表示读权限。
-
w(write)表示写权限。
-
x(execute)表示执行权限。
例如,文件权限 rwxr-xr--
表示:
-
文件拥有者(User)具有读、写、执行权限(rwx)。
-
所属组(Group)具有读、执行权限(r-x)。
-
其他用户(Others)具有读权限(r--)。
目录权限
目录的权限控制与文件略有不同。目录权限决定了用户能否访问目录以及在目录中执行哪些操作。
1. 目录权限的三种类型
-
读权限(r):
-
作用:允许用户列出目录中的文件。
-
适用:当目录具有读权限时,用户可以使用
ls
命令查看目录中的文件名。
-
-
写权限(w):
-
作用:允许用户在目录中创建、删除和重命名文件。
-
适用:当目录具有写权限时,用户可以在该目录内添加或删除文件,修改目录中文件的名称。
-
-
执行权限(x):
-
作用:允许用户进入目录,进行文件查找和访问。
-
适用:当目录具有执行权限时,用户可以使用
cd
命令进入该目录并访问该目录中的文件。如果没有执行权限,用户即使知道目录中的文件名,也无法访问该文件。 -
没有读权限不能使用ls系列列出目录的文件,没有写权限不能在目录中创建,删除文件,没有执行权限就不能进入目录。
-
2. 目录权限与文件权限的差异
-
对于文件,执行权限 使文件可以被运行或执行;
-
对于目录,执行权限 使用户能够进入目录并访问目录中的文件,没有执行权限 时,用户不能进入该目录。
例如:
-
如果一个目录的权限是
r--
或rw-
,并且没有执行权限,则用户无法进入该目录,即使知道目录中的文件名; -
如果一个目录的权限是
--x
,即便没有读权限,用户仍然可以进入目录,并通过文件的完整路径访问其中的文件,但无法列出目录中的文件名。
权限掩码(umask)简介
权限掩码(umask)是一个用于控制新创建的文件或目录的默认权限的工具。它通过掩蔽(屏蔽)掉默认的权限值,来决定文件或目录在创建时所能获得的权限。
什么是权限掩码(umask)
umask
是 用户文件创建权限的屏蔽值,其作用是限制或关闭某些权限位。umask
并不是直接赋予文件或目录某种权限,而是通过对默认权限进行屏蔽来减少一些权限。
每个文件或目录在创建时,都会先有一组默认的权限(通常文件是 666
,目录是 777
),然后根据当前设置的掩码值(umask)来决定实际的权限。掩码值(前取反)通过 按位与运算(AND)与默认权限相结合,从而决定最终的权限。
默认权限和掩码
-
文件默认权限:
666
(即rw-rw-rw-
),表示创建文件时,所有用户角色都有 读 和 写 权限,但没有 执行 权限。 -
目录默认权限:
777
(即rwxrwxrwx
),表示创建目录时,所有用户角色都有 读、写 和 执行 权限。
掩码(umask)值
umask
值是一个 三位八进制数,每一位数字代表不同角色的权限屏蔽情况。它控制着默认权限中哪些权限被禁止。
-
第一个数字:文件拥有者的权限
-
第二个数字:文件所属组的权限
-
第三个数字:其他用户的权限
掩码值的每一位可以是 0
到 7
之间的数字,对应以下权限屏蔽情况:
-
0
:不屏蔽任何权限 -
1
:屏蔽 执行 权限 -
2
:屏蔽 写 权限 -
3
:屏蔽 写 和 执行 权限 -
4
:屏蔽 读 权限 -
5
:屏蔽 读 和 执行 权限 -
6
:屏蔽 读 和 写 权限 -
7
:屏蔽 读、写 和 执行 权限
如何计算掩码
掩码是对默认权限进行 "屏蔽" 的值。默认权限为 666
(文件)和 777
(目录)。掩码通过 "取反" 和 "按位与运算" 来决定实际的权限。
举个例子:
-
掩码值:022(一般的默认掩码值)
-
(默认文件权限:
666
(即rw-rw-rw-
) -
默认目录权限:
777
(即rwxrwxrwx
)
掩码取反:
-
掩码
022
取反为755
。
按位与运算计算文件权限:
默认文件权限(666): rw-rw-rw- 掩码取反(755): rwxr-xr-x 计算结果:rw-r--r--
结果是文件权限为
rw-r--r--(644)
(即文件拥有者有读写权限,所属组和其他用户只有读权限)。按位与运算计算目录权限:
默认目录权限(777): rwxrwxrwx 掩码取反(755): rwxr-xr-x 计算结果:rwxr-xr-x
结果是目录权限为
rwxr-xr-x(755,一般目录的初始权限)
(即目录拥有者有完整权限,所属组和其他用户有读和执行权限,但没有写权限)。 -
查看和设置掩码
-
查看当前掩码: 你可以使用命令
umask
来查看当前的掩码值。它会返回一个三位八进制数,例如022
。umask
-
修改掩码值: 使用
umask
命令加上新的掩码值来修改它。修改后的掩码会在当前会话中生效。如果要永久修改掩码,需要将它添加到用户的 shell 配置文件(如.bashrc
或.bash_profile
)中。umask 027
这将屏蔽掉目录和文件的 "其他用户" 组的写权限。
权限掩码的示例
-
掩码
022
:-
默认权限(文件):
666
->rw-rw-rw-
-
默认权限(目录):
777
->rwxrwxrwx
结果:
-
文件权限:
rw-r--r--
-
目录权限:
rwxr-xr-x
-
-
掩码
077
:-
默认权限(文件):
666
->rw-rw-rw-
-
默认权限(目录):
777
->rwxrwxrwx
结果:
-
文件权限:
rw-rw----
-
目录权限:
rwxrwx--x
-
-
掩码
002
:-
默认权限(文件):
666
->rw-rw-rw-
-
默认权限(目录):
777
->rwxrwxrwx
结果:
-
文件权限:
rw-rw-r--
-
目录权限:
rwxrwxr-x
-
改变权限的三种指令 chmod,chown,chgrp
在 Unix 和类 Unix 系统中,chmod
、chgrp
和chown
是用于管理文件和目录权限及所有权的重要命令,下面为你详细介绍这些命令以及 “所有组”“所有人” 在权限管理中的概念。
权限基本概念
在文件系统里,每个文件和目录都具备三种基本权限:读(r
)、写(w
)和执行(x
),这些权限分别对应着不同的用户类型:
- 所有者(
u
):文件或目录的创建者。 - 所属组(
g
):和文件或目录关联的用户组。 - 其他人(
o
):既不是所有者,也不属于所属组的用户。 - 所有人(
a
):涵盖了所有者、所属组和其他人。
命令详解
1. chmod
- 更改文件或目录的权限
chmod
命令可用于修改文件或目录的权限。它有两种使用方式:符号模式和数字模式。
符号模式
- 语法:
chmod [用户类型][+|-|=][权限] 文件或目录
- 示例:
- 给文件所有者添加执行权限:
chmod u+x example.txt
- 从所属组移除写权限:
chmod g-w example.txt
- 给所有人添加读权限:
chmod a+r example.txt
- 给文件所有者添加执行权限:
数字模式
- 每个权限都有对应的数字:读(
r
)= 4,写(w
)= 2,执行(x
)= 1,无权限 = 0。 - 语法:
chmod [三位数字] 文件或目录
- 示例:
- 给所有者赋予读、写、执行权限(7),所属组赋予读、执行权限(5),其他人赋予读权限(4):
chmod 754 example.txt
- 给所有者赋予读、写、执行权限(7),所属组赋予读、执行权限(5),其他人赋予读权限(4):
2. chgrp
- 更改文件或目录的所属组
chgrp
命令用于更改文件或目录的所属组。
- 语法:
chgrp [选项] 新组名 文件或目录
- 常用选项:
-R
:递归地更改指定目录及其所有子目录和文件的所属组。
- 示例:
- 将
example.txt
的所属组更改为newgroup
:chgrp newgroup example.txt
- 递归地将
my_directory
目录及其内容的所属组更改为newgroup
:chgrp -R newgroup my_directory
- 将
3. chown
- 更改文件或目录的所有者和所属组
chown
命令用于更改文件或目录的所有者,也可以同时更改所属组。
- 语法:
chown [选项] [新所有者][:新所属组] 文件或目录
- 常用选项:
-R
:递归地更改指定目录及其所有子目录和文件的所有者和所属组。
- 示例:
- 将
example.txt
的所有者更改为newuser
:chown newuser example.txt
- 将
example.txt
的所有者更改为newuser
,所属组更改为newgroup
:chown newuser:newgroup example.txt
- 将
权限要求
chmod
:通常所有者或超级用户(root)可以更改文件或目录的权限。chgrp
:超级用户(root)可以将任何文件或目录的所属组更改为系统中的任何组;普通用户只能将自己拥有的文件或目录的所属组更改为自己所属的组。chown
:一般只有超级用户(root)才能更改文件或目录的所有者和所属组。
查看权限
你可以使用ls -l
命令查看文件和目录的权限和所有权信息,示例输出如下:
-rw-r--r-- 1 user group 123 Apr 16 10:00 example.txt
- 第一个字符表示文件类型(
-
表示普通文件,d
表示目录等)。 - 接下来的 9 个字符分为三组,分别表示所有者、所属组和其他人的权限。
- 之后依次是链接数、所有者、所属组、文件大小、最后修改时间和文件名。
粘滞位的常见用途
粘滞位通常用于公共目录,特别是临时目录,最典型的例子就是 /tmp
目录。/tmp
目录通常是所有用户都可以访问的,用来存放临时文件。如果没有粘滞位的保护,任何有写权限的用户都可以删除其他用户的临时文件,这会导致系统不稳定或文件丢失。而粘滞位确保了用户只能删除自己创建的文件,而不能删除其他人的文件。
📃使用方式
很简单,创建一个共享目录后,借助超级用户的身份,通过 chmod +t [目录]
的方式,为这个共享目录添加粘滞位就行了,粘滞位添加成功后,该共享目录的Other
可执行权限变为 t
如何设置粘滞位
你可以使用 chmod
命令来设置或取消粘滞位。设置粘滞位的命令格式如下:
chmod +t <目录名>
例如,如果你想在
/tmp
目录上设置粘滞位,可以运行:
chmod +t /tmp
如何检查粘滞位
可以通过 ls -ld
命令来查看某个目录是否设置了粘滞位。例如:
ls -ld /tmp
如果该目录设置了粘滞位,你会看到目录权限中有一个 t
字符(而不是 x
)出现在执行权限的位置,比如:
drwxrwxrwt 10 root root 4096 Apr 16 10:00 /tmp
上面输出中的 t
就表示 /tmp
目录已设置了粘滞位。
粘滞位的注意事项
-
粘滞位仅对目录有效,不会影响普通文件。
-
粘滞位并不是普通的“写”权限,它是对目录中文件删除权限的限制。
-
粘滞位的设置通常不会影响到超级用户(root)的操作,root 用户始终有权限删除或修改任何文件。