目录
一.引言
在 Linux 的世界里,有一句名言:“一切皆文件”。但你是否想过,如果这些文件可以被任何人随意查看、修改或删除,那系统安全将无从谈起。Linux 权限机制就像是一套严密的“门禁系统”,决定了谁能进门、谁能动屋子里的东西。今天,我们就来拆解这套系统的核心指令,带你彻底玩转 Linux 权限管理。
二.权限的“身份证”:理解rwx
2.1 角色
在 Linux 的世界里,为了实现多用户环境下的安全和协作,系统将每个文件或目录的访问者划分为三个特定的“身份”。
-
拥有者(Owner):通常是创建该文件或目录的用户。在命令中通常用字母u(user)表示。
-
所属组(Group):Linux允许将多个用户编成一个“组”。如果一个文件被设定为属于某个组,那么这个组内的所有成员都享有该文件对“组”开放的权限。在命令中通常用字母g(Group) 表示。
-
其他人(Other):既不是文件的拥有者,也不属于文件所属组的任何其他用户。在严谨的服务器环境中,为了安全,通常会限制“其他人”的权限。在命令中通常用字母 o(Others) 表示。
那么如何在Linux中识别它们呢?当你输入 ls -l 命令时,你会看到类似下面的一行信息:
- rw- r-- r-- 1 root root 1024 Dec 18 10:00 test.txt
^ ^ ^ ^ ^ ^
| | | | | |
类型 拥有者 组 其他人 拥有者名 组名
显然,当前这个test.txt文件,拥有者就是root,所属组同样也是root,其他人是余下的所有用户。
2.2 文件类型
为了后续的介绍,我们有必要了解一下 Linux 的权限体系中,文件类型有哪些?即上面命令输出信息的第1位内容 - 是什么含义呢?
① -:普通文件 (Regular File)
这是最常见的文件类型。包含纯文本文件、源代码、二进制可执行程序、压缩包、图片等。
② d:目录 (Directory)
在 Linux 中,文件夹也被视为一种特殊的文件,里面记录了该目录下所有文件的列表。
其余文件类型不是本文重点,以表格形式给出,不做过多介绍。
| 符号 | 类型 | 描述 | 例子 |
|---|---|---|---|
| l | 符号链接 | 本身是一个文件,但内容指向另一个文件或目录 | /bin/sh是一个指向bash或dash的链接 |
| c | 字符设备文件 | 顺序读写的设备,一次一个字符 | 键盘、鼠标、终端、(/dev/tty) |
| b | 块设备文件 | 按块读写的存储设备,支持随机访问 | 硬盘(/dev/sda)、U盘 |
| s | 套接字文件 | 用于进程间的网络通信 | MySQL的通信文件(/tmp/mysql.sock) |
| p | 命名管道 | 用语进程间单向传递数据 | 系统日志传递过程中可能用到 |
2.3 基本权限
现在,我们再来谈谈这串神秘字符,rw- r-- r-- 具体表示什么。这九个字符遵循严谨的‘三位一组’逻辑:自左向右依次界定了拥有者(Owner)、所属组(Group)以及其他人(Others)对该文件的操作权限边界。
①对于普通文件
-
r (Read):你可以读取文件的内容。
-
w (Write):你可以修改文件的内容。
-
x (Execute):你可以把这个文件当成程序或脚本来运行。
-
-:无权限。
②对于目录
-
r (Read):你可以列出目录里的内容。没有它,你执行 ls 就会报错。
-
w (Write):你可以在这个目录下创建、删除、重命名文件。
-
x (Execute):你可以“进入”这个目录。没有它,你连 cd 都进不去,更别提访问目录里的文件了。
-
-:无权限。
2.4 文件权限值的表示方法
-
字符表示法:即用rwx来表示
-
8进制数值表示法
在 Linux 底层,权限是用二进制表示的。为了方便人类操作,我们将其转换成了简单的十进制累加。
| 权限符号 | 权限名称 | 二进制值 | 十进制数字 |
|---|---|---|---|
| r | 读(Read) | 100 | 4 |
| w | 写(Write) | 010 | 2 |
| x | 执行(Execute) | 001 | 1 |
| - | 无权限 | 000 | 0 |
权限组合公式:你只需要把对应的数字相加,就能得到一个 0-7 之间的数字:
-
rwx = 4 + 2 + 1 = 7(全开)
-
rw- = 4 + 2 + 0 = 6(读写)
-
r-x = 4 + 0 + 1 = 5(读与执行)
-
r-- = 4 + 0 + 0 = 4(只读)
三.变更“身份” :chown 与 chgrp
如果你想改变文件的主人,这两条命令是首选。
1.chown(Change Owner)
用于修改文件的所有者,也可以顺便修改所属组。
格式:chown [参数] 用户名 文件名
sudo chown user1 file.txt(将所有者改为 user1)
sudo chown -R user1 filegroup1(递归所有文件均修改为 user1)
sudo chown user1:group1 file.txt (同时修改所有者和所属组)
2.chgrp(Change Group)
专门用于修改文件所属的群组。
格式:chgrp [参数] 用户组名 文件名
chgrp root project.log(将所属组改为 root)
注意:系统默认不允许我们把文件给别人,如果要给,必须提高自己的权限——>变为root。
四.权限“变脸术”:chmod
这是 Linux 中最常用的命令之一,依据文件权限值的两种表示方法,这里也有两种修改方式:
①数字模式
通过三个数字代表 u/g/o 的权限总和。
chmod 755 script.sh (拥有者读写执行,其他人读和执行)
chmod 644 config.txt (拥有者读写,其他人只读 —— 这是最常见的配置)
②符号模式
更直观地添加或删除权限。
-
+ :向权限范围增加权限代号所表示的权限
-
- :向权限范围取消权限代号所表示的权限
-
= :向权限范围赋予权限代号所表示的权限
chmod u+w /home/abc.txt (给拥有者增加写权限)
chmod o-x /home/abc.txt (给其他人减去执行权限)
chmod +x /home/abc.txt (给所有人增加执行权限)
chmod g=rwx /home/abc.txt (所属组的权限变更为rwx)
注意:只有文件的拥有者和root才可以改变文件的权限。R——> 递归修改目录文件的权限。
五.默认规则的“守门员”:umask
当你新建一个文件时,它的默认权限是怎么来的???答案就是 umask。
umask 是一种权限掩码,它定义了从满权限(文件 666,目录 777)中“扣除”哪些权限。超级用户root默认掩码值为 0022,普通用户默认为0002。
假设 umask 为 022:
-
目录默认权限:777 - 022 = 755
-
文件默认权限:666 - 022 = 644
// 实例
umask //查看
umask 044//设置
六.特殊权限:粘滞位
6.1奇怪的现象
我们先来看一个现象!超级管理员root在用户xxx的家目录下创建了一个root.txt文件。显然,xxx用户对于该文件此时没有任何权限。
[root@iZ2vc6as15jn39efepsimnZ xxx]# ll
total 4
-rw-r----- 1 root root 0 Dec 18 22:27 root.txt
-rw-rw-r-- 1 xxx xxx 21 Dec 18 18:34 test1.c
但是,xxx用户此时却可以删掉该文件!
[xxx@iZ2vc6as15jn39efepsimnZ ~]$ ll
total 4
-rw-r----- 1 root root 0 Dec 18 22:27 root.txt
-rw-rw-r-- 1 xxx xxx 21 Dec 18 18:34 test1.c
[xxx@iZ2vc6as15jn39efepsimnZ ~]$ rm -rf root.txt
[xxx@iZ2vc6as15jn39efepsimnZ ~]$ ll
total 4
-rw-rw-r-- 1 xxx xxx 21 Dec 18 18:34 test1.c
[xxx@iZ2vc6as15jn39efepsimnZ ~]$
这似乎看起来很不科学?xxx用户既然没有对该文件的任何权限,但是却可以删掉它?实际上,一个文件能否被删除,与文件本身无关,与文件所处的目录w权限有关!
[xxx@iZ2vc6as15jn39efepsimnZ home]$ ll
total 4
drwx------ 2 xxx xxx 4096 Dec 18 22:33 xxx
显然这个目录的拥有者正是用户xxx,并且拥有者有w权限,既可以在该目录中创建文件,同样也可以删除该目录中的文件,这是合理的。
6.2具体用途
那么,在实际的开发中如果两个普通用户需要进行文件级别的协作呢?此时,我们不能放在任何一个用户的家目录中,因为该用户的家目录默认对其他人是没有任何权限的。
[root@iZ2vc6as15jn39efepsimnZ home]$ ll
total 16
drwx------ 2 zzz zzz 4096 Dec 18 22:33 zzz
drwx------ 2 www www 4096 Dec 8 20:22 www
drwx------ 2 xxx xxx 4096 Dec 18 22:28 xxx
此时,就需要root用户创建一个共享目录,即使大家都有写w权限,但只有文件的所有者才能删除或重命名该文件。防止恶意删除他人的文件。
// 设置方法
chmod +t /shared_dir
chmod 1777 /shared_dir(前面的 1 即代表粘滞位)

实际上,在linux的根目录下,就存在这样一个目录 tmp ,其对应的权限正是 drwxrwxrwt.
五.其他讨论
确定权限信息的时候,系统会先确定用户是谁?在Centos下,用户角色只会确定一次,顺序是:拥有者,所属组,其他人。
----rwxrwx 1 xxx xxx 21 Dec 18 18:34 test1.c
例如在这样的场景下,对于拥有者xxx来说,他的权限是---即无任何权限。但是xxx同时也是所属组,而所属组的权限是rwx即所有权限都有。不过Linux是按照一个严格的顺序进行单次身份识别的,这意味着如果你是拥有者但被设为“无权限”,即便你所属的组拥有全权限,你依然会被系统无情拒绝。
感谢观看!

335

被折叠的 条评论
为什么被折叠?



