005 权限的理解
🦄 个人主页: 小米里的大麦-CSDN博客
🎏 所属专栏: Linux_小米里的大麦的博客-CSDN博客
🎁 GitHub主页: 小米里的大麦的 GitHub
⚙️ 操作环境: Visual Studio 2022
文章目录
- shell 命令以及运行原理
- 1. Shell 是什么?
- 2. 为什么不能直接操作内核?
- 3. Shell 的“媒婆”比喻
- 4. 图形界面(GUI)也是 Shell?
- 5. Shell 的高级功能
- Linux 权限的概念
- 一、用户类型详解
- 1. 超级用户(root)
- 2. 普通用户
- 二、用户切换操作详解
- 1. `su` 命令 —— 切换用户的命令。
- 2. `su` 与 `su -` 的区别
- 三、sudo 基础权限配置(了解,后面详讲)
- 1. sudo 基础
- 2. 配置 sudo 权限(这是一种方法,可以先了解,不建议现在进行配置)
- 3. 验证配置
- 4. 典型错误处理
- ==四、最佳实践建议==
- 五、操作流程图解
- Linux 权限管理
- 一、Linux 权限管理
- 二、文件的权限和文件属性
- 1. 文件访问者的分类(“`人`”)
- 2. 权限表示方式
- 3. 文件类型和访问权限(“事物属性”)
- 三、文件访问权限的相关设置方法
- 1. `chmod` - 设置文件的访问权限
- 八进制表示法:
- 2. `chown` - 修改文件的拥有者
- 3. `chgrp` - 修改文件或目录的所属组
- 总结:
- `file` 命令
- 传道解惑
- Q1:起始权限问题:普通文件:664,目录文件:775,为什么我们创建文件的默认权限是我们现在看到的样子?
- umask 是什么?
- Q2:关于文件权限 `-r--rw---- 1 a a ...` 的情况怎么解释?
- 权限判断顺序:
- 目录的权限
- 权限细节及例子 —— 想要保护多人 `共享` 文件数据
- 解决方案:引入“粘滞位”
- 总结
- 共勉
shell 命令以及运行原理
1. Shell 是什么?
Shell 是用户与操作系统内核(Kernel)之间的“翻译官”。
你可以把操作系统内核想象成一个国家的总统(Kernel),他直接管理国家资源(CPU、内存、磁盘等)。但普通人(用户)无法直接和总统对话,必须通过一个“秘书”(Shell)来传达需求。
- 用户通过 Shell 输入命令(比如
ls
、cd
)。 - Shell 将命令“翻译”成内核能理解的指令,交给内核执行。
- 内核处理完成后,结果再通过 Shell 返回给用户。
2. 为什么不能直接操作内核?
- 内核是操作系统的核心,直接操作风险极高。比如,直接让内核删除某个文件,就像让总统亲自去处理一个普通任务——虽然高效但风险极高,一旦出错可能导致系统崩溃。
- Shell 的存在是为了安全和易用:
- 用户无需理解底层硬件细节(比如如何读写磁盘)。
- Shell 通过权限控制和语法检查,避免用户误操作导致系统崩溃。
3. Shell 的“媒婆”比喻
Shell 是“媒婆”,内核是“村花小花”:你想追求小花(让内核干活),但不好意思直接开口(直接操作内核)。于是你找媒婆王婆(Shell)帮忙:
- 你告诉王婆需求(输入命令)。
- 王婆转达给小花(Shell 解析命令并调用内核)。
- 小花办好后,王婆再把结果告诉你(Shell 返回输出)。
媒婆的作用:
- 翻译需求:用户说“想送花”,媒婆翻译成小花能理解的“执行送花程序”。
- 过滤错误:用户说“送一车榴莲”,媒婆会提醒“榴莲不在允许的礼物列表”(语法错误提示)。
- 权限检查:用户想进小花家的后院(系统敏感目录),媒婆会核实身份(权限验证)。
为什么必须通过媒婆?直接表白行不行?(同为什么不能直接操作内核)
- 直接操作内核的风险:
- 用户可能说错话(输入错误命令),导致小花误解(系统崩溃)。
- 用户可能要求不合理(删除系统关键文件),小花直接拒绝(权限不足)。
- 媒婆的安全保障:
- 权限控制:媒婆会检查用户身份,比如普通用户不能修改系统配置(
sudo
提权需要密码)。 - 错误拦截:用户输入“删库跑路”,媒婆会反问“你确定吗?”(
rm -rf /
前的确认提示)。
- 权限控制:媒婆会检查用户身份,比如普通用户不能修改系统配置(
如果媒婆罢工了(Shell 崩溃)?
- 用户会陷入沉默:无法与小花沟通,只能重启终端(找新媒婆)。
- 内核依然在运行:小花继续管理村庄,但用户无法直接互动。
- 解决方案:
- 使用备用媒婆(不同 Shell 类型:Bash、Zsh、Fish)。
- 通过远程媒婆(SSH 连接)继续工作。
终极金句:
没有媒婆的牵线,程序员的爱情(操作内核)将寸步难行;
没有 Shell 的翻译,用户与内核的对话将鸡同鸭讲。
4. 图形界面(GUI)也是 Shell?
- 无论是命令行(CLI)还是图形界面(GUI),本质都是用户与内核的中介。
- Windows 的 GUI:双击图标 → 图形界面程序调用内核完成任务。
- Linux 的 Shell:输入命令 → Shell 调用内核完成任务。
- 区别在于交互方式:
- CLI 更高效,适合程序员和自动化脚本。
- GUI 更直观,适合普通用户。
5. Shell 的高级功能
- 脚本编程:将多个命令写成脚本,一键执行复杂任务。
- 管道(
|
):将一个命令的输出作为另一个命令的输入。例如:ls | grep .txt
(列出所有文件,再过滤出.txt
文件)。 - 重定向(
>
、>>
):将命令结果保存到文件。例如:ls > files.txt
(将文件列表保存到files.txt
)。
Linux 权限的概念
一、用户类型详解
1. 超级用户(root)
- 权限:拥有系统的最高权限,可以执行任何操作。包括安装、删除软件、修改系统设置、删除系统文件等危险行为。操作不当可能导致系统崩溃。
- 提示符:
#
(如[root@server ~]#
),在命令行中,#
表示当前是 root 用户。 - 默认路径:
/root
,这是 root 用户的家目录。 - 危险提示:建议平时使用普通用户,而非 root 用户,避免误操作导致的系统崩溃或损坏。
2. 普通用户
- 权限:只能访问和操作自己的文件目录(默认在
/home/用户名
下),以及有限的系统资源。无法修改系统配置或执行需要高权限的操作。 - 提示符:
$
(如[user@server ~]$
),表示当前是普通用户。 - 默认路径:
/home/用户名
,每个普通用户都会有自己的家目录。 - 优势:使用普通用户更安全,避免误操作破坏系统。
二、用户切换操作详解
1. su
命令 —— 切换用户的命令。
su [选项] [用户名]
- 不带参数:默认切换到 root 用户(需要输入 root 密码)。
- 带用户名:切换到指定的用户(需要输入目标用户密码)。
具体场景(注意各自切换所要输入的密码):
-
普通用户 → root
[user@server ~]$ su - Password: # 输入 root 密码 [root@server ~]# # 成功切换到 root
-
root → 普通用户
[root@server ~]# su - user [user@server ~]$ # 成功切换到普通用户 user
-
普通用户 → 其他普通用户
[user1@server ~]$ su - user2 Password: # 输入 user2 密码 [user2@server ~]$ # 成功切换到 user2 用户
2. su
与 su -
的区别
命令 | 环境变量 | 工作目录 | 使用场景 |
---|---|---|---|
su | 保留当前环境 | 当前目录 | 临时执行少量命令 |
su - | 重新加载用户环境 | 目标用户家目录 | 需要完整用户环境时 |
示例对比:
# 使用 su
[root@server /]# su user
[user@server /]$ pwd
/# 使用 su -
[root@server /]# su - user
[user@server ~]$ pwd
/home/user
三、sudo 基础权限配置(了解,后面详讲)
1. sudo 基础
sudo <命令>
- 作用:使用
sudo
命令,普通用户可以临时以 root 权限执行特权命令。 - 要求:用户必须在
/etc/sudoers
文件中有权限设置。
2. 配置 sudo 权限(这是一种方法,可以先了解,不建议现在进行配置)
配置 sudo
权限时,建议使用 visudo
命令,因为它可以在保存前检查语法错误,避免不小心出错。
-
切换到 root 用户:
su - # 切换到 root
-
使用 visudo 编辑
/etc/sudoers
文件:visudo # 进入编辑模式,自动检查语法
-
配置示例:
-
允许普通用户
user
执行所有命令,且无需密码:user ALL=(ALL) NOPASSWD: ALL
-
允许
wheel
组的成员使用sudo
:%wheel ALL=(ALL) ALL
-
3. 验证配置
如果配置成功,可以通过 sudo
执行命令来验证:
[user@server ~]$ sudo systemctl restart sshd
# 如果配置成功,可以执行命令而无需输入密码
4. 典型错误处理
当用户不在 sudoers
文件中时,可能会看到以下错误:
user is not in the sudoers file. This incident will be reported.
解决方法:
-
切换到 root 用户:
su -
-
将用户加入
wheel
组:usermod -aG wheel user
-
确保
/etc/sudoers
文件中有以下配置:%wheel ALL=(ALL) ALL
四、最佳实践建议
- 日常使用普通用户:避免直接以 root 用户登录,普通用户更安全。使用
sudo
执行特权命令。 - 重要操作前备份:在执行任何高风险操作时,尤其是以 root 权限进行修改时,要确保有备份。
- sudo 权限最小化:只为需要的用户分配
sudo
权限,避免随意赋予NOPASSWD: ALL
权限。 - 会话管理:
- 进入 root 环境后,要及时使用
exit
或Ctrl+D
退出。 - 使用
whoami
命令确认当前用户身份,避免误操作。
- 进入 root 环境后,要及时使用
五、操作流程图解
普通用户环境│├─ 需要执行特权命令 → sudo <命令>│ ├─ 有权限 → 执行成功│ └─ 无权限 → 拒绝执行│└─ 需要切换用户 → su/su -├─ 切换到 root → 输入 root 密码└─ 切换其他用户 → 输入目标用户密码
Linux 权限管理
一、Linux 权限管理
Linux 系统中的权限管理决定了文件和目录的访问控制。权限管理涉及两个主要方面:
- 权限认证:确定谁(用户)可以访问文件或目录。
- 权限类型:确定可以对文件或目录执行什么操作(
读、写、执行
)。
二、文件的权限和文件属性
1. 文件访问者的分类(“人
”)
权限分为三类:
u
(User):文件或目录的所有者
/拥有者
。即文件的创建者或被赋予所有权的用户。g
(Group):文件或目录的所属组
的用户。即拥有该文件或目录的同组成员。o
(Others):其他用户
,指的是既不是文件所有者,也不属于文件所属组的用户。
2. 权限表示方式
举个栗子,并逐一解析:
drwxrwxr-x 2 hcc hcc 4096 Feb 3 20:26 temp
# 怎么看:
d rwx rwx r-x (1 | 9)/(1 | 3|3|3)
# drwxrwxr-x 对应着 <file-type><user-permissions><group-permissions><other-permissions>
- 文件类型(第一个字符):
- d:表示这是一个目录文件。
- 文件权限(后面的 9 个字符 3 位一看):
rwx
:表示 用户(文件所有者) 具有读、写、执行权限。rwx
:表示 组用户 具有读、写、执行权限。r-x
:表示 其他用户 具有读和执行权限,但没有写权限。
- 其他信息:
2
:表示该目录下的硬链接数量。hcc
(前一个):表示文件的 拥有者(User)是hcc
。hcc
(后一个):表示文件的 所属组(Group)是hcc
。4096
:表示该文件(或目录)的大小(单位为字节)。Feb 3 20:26
:表示文件的最后修改时间。temp
:表示文件的名称。
3. 文件类型和访问权限(“事物属性”)
文件类型(第一位字符):
文件类型字符 | 含义 | 示例 |
---|---|---|
d | 目录文件(Directory) | drwxr-xr-x (表示这是一个目录文件) |
- | 普通文件(Regular file) | -rwxr-xr-x (表示这是一个普通文件) |
l | 软链接(Symbolic link) | lrwxrwxrwx (类似于 Windows 的快捷方式) |
b | 块设备文件(Block device file) | brw-rw---- (如硬盘、光驱等) |
p | 管道文件(Pipe file) | prw-r--r-- (用于进程间通信) |
c | 字符设备文件(Character device file) | crw-rw---- (如终端设备、打印机等) |
s | 套接口文件(Socket file) | srwxrwxrwx (用于网络通信等) |
权限(后三位字符):
权限字符 | 含义 | 对应数字 | 说明 |
---|---|---|---|
r | 读权限(Read) | 4 | 对文件:允许读取文件内容;对目录:允许列出目录中的文件。 |
w | 写权限(Write) | 2 | 对文件:允许修改文件内容;对目录:允许创建、删除、移动目录中的文件。 |
x | 执行权限(Execute) | 1 | 对文件:允许执行文件;对目录:允许进入该目录。 |
- | 没有权限 | 0 | 表示没有该项权限。 |
权限的组合(后三位字符表示权限):
权限组合 | 含义 | 数字表示 | 说明 |
---|---|---|---|
rwx | 读、写、执行权限(可完全访问) | 7 | 用户/组/其他均有读、写、执行权限。 |
rw- | 读、写权限(没有执行权限) | 6 | 用户/组/其他可以读取和修改文件,但不能执行。 |
r-x | 读、执行权限(没有写权限) | 5 | 用户/组/其他可以读取和执行文件,但不能修改。 |
r– | 只有读权限 | 4 | 用户/组/其他只能读取文件,无法修改或执行。 |
wx- | 写、执行权限(没有读权限) | 3 | 用户/组/其他可以修改文件并执行文件,但不能读取文件。 |
x– | 只有执行权限 | 1 | 用户/组/其他只能执行文件,无法读取或修改文件。 |
— | 没有任何权限 | 0 | 用户/组/其他没有任何权限。 |
每个权限都有两个状态:有权限 或 没有权限,这恰好对应了二进制的 1
和 0
,所以数字表示的由来是二进制:
权限符号(读写执行) | 八进制(数字表示) | 二进制 |
---|---|---|
r | 4 | 100 |
w | 2 | 010 |
x | 1 | 001 |
rw | 6 | 110 |
rx | 5 | 101 |
wx | 3 | 011 |
rwx | 7 | 111 |
— | 0 | 000 |
三、文件访问权限的相关设置方法
1. chmod
- 设置文件的访问权限
chmod
命令用于设置文件的访问权限。它允许你改变文件或目录的权限,分为两种方式:使用符号表示法和使用八进制表示法。
- 普通用户:普通用户只能修改自己拥有的文件或目录的权限。如果普通用户尝试修改其他用户的文件或目录权限,会提示
Permission denied
(权限被拒绝)。 - root 用户:
root
用户是系统管理员,具有所有权限,因此root
可以修改任何文件或目录的权限。
语法格式:chmod [参数] 权限 文件名
常用选项:-R
:递归地修改目录和其中所有文件的权限。
权限的表示方法:
符号 | 描述 |
---|---|
+ | 向权限范围增加权限 |
- | 向权限范围取消权限 |
= | 设置权限,覆盖现有权限 |
用户符号:
符号 | 描述 |
---|---|
u | 拥有者(user) |
g | 所属组(group) |
o | 其他用户(others) |
a | 所有用户(all) |
权限符号:
符号 | 描述 |
---|---|
r | 读取权限(read) |
w | 写入权限(write) |
x | 执行权限(execute) |
示例:
命令 | 说明 |
---|---|
chmod u+w /home/abc.txt | 给文件 /home/abc.txt 的拥有者添加写权限。 |
chmod o-x /home/abc.txt | 去掉其他用户的执行权限。 |
chmod a=x /home/abc.txt | 给所有用户赋予执行权限,其他权限被去除。 |
八进制表示法:
权限组合 | 八进制数字 | 说明 |
---|---|---|
rwx | 7 | 读取、写入、执行权限(4+2+1) |
rw- | 6 | 读取、写入权限(4+2) |
r-x | 5 | 读取、执行权限(4+1) |
r-- | 4 | 读取权限(4) |
wx- | 3 | 写入、执行权限(2+1) |
w-- | 2 | 写入权限(2) |
x-- | 1 | 执行权限(1) |
--- | 0 | 无权限 |
示例:
命令 | 说明 |
---|---|
chmod 664 /home/abc.txt | 设置文件权限为 rw-rw-r-- ,即拥有者和所属组有读写权限,其他用户只有读权限。 |
chmod 640 /home/abc.txt | 设置文件权限为 rw-r----- ,即拥有者有读写权限,拥有者有读写权限,所属组有读权限,其他用户没有权限。 |
2. chown
- 修改文件的拥有者
chown
命令用于修改文件的所有者和所属组。
- 普通用户:普通用户只能更改自己拥有的文件的所有者。如果尝试更改其他用户的文件或目录的拥有者,普通用户会看到
Permission denied
。 - root 用户:
root
用户能够修改任何文件或目录的拥有者,不受任何限制。
语法格式:chown [参数] 用户名 文件名
常用选项:-R
:递归地修改目录和其中所有文件的权限。
示例:
命令 | 说明 |
---|---|
chown user1 f1 | 将文件 f1 的拥有者更改为 user1 。 |
chown -R user1 filegroup1 | 递归地将目录 filegroup1 及其子文件的所有者更改为 user1 。 |
3. chgrp
- 修改文件或目录的所属组
chgrp
命令用于修改文件或目录的所属组。
- 普通用户:普通用户只能更改自己拥有的文件或目录的所属组。如果尝试更改其他用户的文件或目录的所属组,则会提示
Permission denied
。 - root 用户:
root
用户可以修改任何文件或目录的所属组,无论该文件是否属于root
或其他用户。
语法格式:chgrp [参数] 用户组名 文件名
常用选项:-R
:递归地修改目录和其中所有文件的权限。
示例:
命令 | 说明 |
---|---|
chgrp users /abc/f2 | 将文件 /abc/f2 的所属组更改为 users 。 |
总结:
操作类型 | 普通用户能否执行 | root 用户能否执行 | 执行成功/失败 |
---|---|---|---|
chmod 修改权限 | 只能修改自己拥有的文件 | 可以修改任何文件 | 普通用户成功:文件属于自己;失败:Permission denied |
chown 修改拥有者 | 只能修改自己拥有的文件 | 可以修改任何文件 | 普通用户成功:文件属于自己;失败:Permission denied |
chgrp 修改所属组 | 只能修改自己拥有的文件 | 可以修改任何文件 | 普通用户成功:文件属于自己;失败:Permission denied |
file
命令
file
命令用于识别文件的类型。它会根据文件的内容、格式以及文件头部的标识来判断分析文件内部的结构来推测其类型,不依赖于文件的扩展名,非常有用。
语法:file [选项] 文件或目录...
常用选项:
-c
:显示详细的执行过程,帮助你分析程序的执行情况。例如,它可以显示file
命令如何判断文件类型,通常在调试时很有用。-z
:尝试解压缩压缩文件,并分析压缩文件中的内容。如果你有一个.tar.gz
或.zip
文件,使用-z
可以让file
查看并识别压缩文件内部的内容类型。
示例:
file test.txt # 输出 test.txt 文件的类型(如:ASCII text)
file -z archive.gz # 解压并识别压缩文件内容类型
传道解惑
Q1:起始权限问题:普通文件:664,目录文件:775,为什么我们创建文件的默认权限是我们现在看到的样子?
默认权限的设置与 umask(文件创建权限掩码) 有关系,它控制了文件或目录在创建时默认的权限。我们创建普通文件和目录时,通常会看到不同的权限,这是因为操作系统使用了一种“减法”策略(最终权限 = 起始权限 & (~umask)),根据 umask 来修改文件和目录的默认权限。
umask 决定了文件和目录创建时权限的“减法”规则,我们最终看到的其实是已经套公式算好的。
- 普通文件(664):默认给普通文件的起始权限其实是
666
,666 & (~0002)
→666 & 7754
=664
。- 目录文件(775):默认给目录文件的起始权限其实是
777
,777 & (~0002)
→777 & 7754
=775
。umask 是什么?
umask
是一个权限掩码,它定义了在文件或目录创建时,通过从系统的默认权限中 “去除” 权限来决定最终的权限。 umask 的值 表示哪些权限会被“去除”,而 最终权限 是通过使用按位与(&
)操作来计算的。
- 默认的权限是固定的,即普通文件的起始权限为
666
,目录的起始权限为777
。umask
用来“去除”权限,使用的规则是按位与:最终权限 = 起始权限 & (~umask)。~umask
是对umask
值取反,即对umask
中的每一位进行反转(0 变成 1,1 变成 0),然后与默认权限进行按位与运算。如果需要查看当前的 umask 值,可以运行
umask
命令:umask
常见的 umask 值:
umask
的值虽然会显示0002
,umask
的四位数字中,第一位表示特殊权限(如粘滞位),后三位才是基本权限。但普通文件/目录的默认权限计算时通常只关注后三位。常见的umask
值:
umask 值 解释 结果权限(普通文件) 结果权限(目录文件) 0002
所有者、组、其他用户都没有限制 664 775 0022
其他用户没有写权限 644 755 0077
只有文件拥有者有权限 600 700 umask 设置与效果:umask 的值会影响文件和目录的默认权限。当你修改
umask
时,操作系统会自动改变你创建的文件和目录的默认权限。例如:如果设置
umask 0022
,则:
- 普通文件的权限会变为
644
(去除其他用户的写权限)。- 目录的权限会变为
755
(去除其他用户的写权限)。可以通过以下命令查看和设置
umask
:# 查看当前 umask 值 umask# 设置 umask 为 0022 umask 0022
Q2:关于文件权限
-r--rw---- 1 a a ...
的情况怎么解释?在文件权限系统中,拥有者的权限 和 所属组的权限 是独立的,因此可能会出现拥有者的权限比所属组更少的情况。文件的权限可能是通过某些命令错误地配置的。例如,管理员或拥有者可能故意将拥有者的权限设置得比所属组的权限少。这种情况可能是在文件创建时,由于错误的
chmod
命令或文件权限管理不当造成的。当然也有可能是必须的,因为这种现象并非错误。关键点:拥有者权限和所属组权限独立
- 拥有者权限(a): 只能读取文件,但不能修改(没有写权限)。
- 所属组权限(a 组): 可以读写文件(
rw-
),但不具有执行权限。权限判断顺序:
在 Linux 系统中,在进行认证的时候只能选择一个角色进行认证,文件的权限是根据三种不同的身份来判断的:文件拥有者、文件所属组 和 其他用户。系统在判断文件权限时会先检查文件拥有者的权限,如果拥有者权限不足,再检查所属组的权限,最后才检查其他用户的权限。
- 文件拥有者权限(User 权限):系统首先会检查当前操作用户是否是文件的拥有者,如果是,则优先使用文件拥有者的权限来进行访问判断。
- 所属组权限(Group 权限):如果当前用户不是文件的拥有者,但属于文件的所属组,则会检查文件所属组的权限。
- 其他用户权限(Other 权限):如果当前用户既不是文件的拥有者,也不属于文件的所属组,那么就会检查其他用户的权限。
解决方法
- 检查文件的权限设置:首先确认文件的权限是如何设置的。如果文件的拥有者权限被误设为
r--
,而所属组权限是rw-
,可以使用chmod
修改文件的拥有者权限:chmod u+w filename
角色切换:如果你仅能选择一个角色进行认证,但需要更高权限来修改文件,考虑切换到具有更高权限的角色(例如通过
sudo
进行管理员认证)。文件所有权调整:如果你不是文件的拥有者,但需要进行修改,考虑使用
chown
或chgrp
更改文件的拥有者或所属组,或者请求管理员为你添加权限。
目录的权限
理解目录权限的三个关键点:
- 可读权限(
r
):决定是否允许我们查看指定目录下的文件内容。 如果没有读权限,即使目录本身是可执行的,用户也无法看到目录中的文件列表。例如,无法用ls
查看该目录下的文件。 - 可写权限(
w
):决定是否允许我们在当前目录下进行创建、更改、删除(主要)
。 如果没有写权限,用户就不能在该目录中创建新文件,不能删除文件,也不能重命名文件 (一个文件能否被删除,并不由文件本身决定,由这个文件所处的目录决定!)。 - 可执行权限(
x
):决定是否允许用户进入对应的目录! 如果一个目录没有执行权限,即使你有其他权限,也无法进入该目录进行任何操作。比如无法cd
进入该目录。
权限细节及例子 —— 想要保护多人 共享
文件数据
假设用户 张三 在自己的目录下创建了一个文件 temp
,并且给自己设置了文件权限(例如 rw-r--r--
)。这意味着张三可以读写文件,而其他用户只能读取文件。看起来应该是其他用户不能删除 temp
文件,对吧?但是,实际上 其他用户仍然可以删除 temp
文件,即使他们没有写权限。这是因为文件的删除权限是由 目录的权限 决定的,而不是文件的权限。(张三在自己的文件夹里放了一本书(文件 temp),即使没有给其他人修改这本书的权限,如果他们对张三存放书的那个房间(目录)有写入权限,他们仍然能够把张三的书从房间里移除或删除。这看起来不太公平,因为张三并没有允许别人动他的东西)。
如果去掉了共享目录的 w
权限,张三同时也无法创建文件啦!共享目录,共享体现在哪里呢?
解决方案:引入“粘滞位”
为了避免一个用户删除其他用户创建的文件,Linux 引入了 粘滞位(sticky bit) 的概念。
粘滞位(Sticky Bit) 是一个特殊的权限,用来限制在目录中删除文件的权限。具体来说,只有以下三类用户才能删除目录中的文件:
- 超级管理员(root):
root
用户可以删除任何文件,不受限制。 - 目录的所有者:目录的拥有者可以删除该目录中的文件。
- 文件的所有者:文件的拥有者可以删除自己创建的文件。
如何设置粘滞位? 可以使用 chmod +t
命令来给目录设置粘滞位:
chmod +t /path/to/directory
示例: 假设我们有一个目录 /shared
,这是一个共享目录,所有用户都可以在其中创建文件。如果没有粘滞位,任何具有写权限的用户都可以删除目录中的文件,即使文件是由其他用户创建的。但如果我们给目录设置了粘滞位:
chmod +t /shared
drwxrwxrwt # 粘滞位生效,末尾为 t
设置了粘滞位后,只有以下三类用户可以删除文件:
root
用户可以删除目录中的任何文件。- 该目录的所有者(例如管理员)可以删除文件。
- 文件的拥有者(例如,创建文件的用户)可以删除自己的文件。
这样,即使其他用户拥有对目录的写权限,也无法删除其他用户创建的文件,增强了安全性。
总结
目录权限:
- 可读权限(
r
):是否可以列出该目录中的文件。没有r
权限,即使有x
权限,也无法执行ls
或查看目录中的内容。 - 可写权限(
w
):是否可以在目录中创建、删除或重命名文件。没有w
权限,用户无法创建、删除或重命名目录中的文件。 - 可执行权限(
x
):是否可以进入该目录。没有x
权限,即使有读权限,也无法cd
进入目录。
家目录权限:
- 通常情况下,用户的家目录权限是
700
,即只有该用户和root
用户能访问和操作其家目录中的文件。其他用户无法访问、查看或修改这些文件。 - 这种权限设置通常用于保护用户的个人文件,使其不被其他用户看到或修改。
共享目录中的权限管理:
- 在共享目录中,其他用户通常有读取、创建和修改文件的权限。但 为了避免文件被随意删除,可以设置 粘滞位。
- 如果去掉共享目录的写权限,用户将无法在目录中创建文件或删除文件。这也意味着,如果一个目录没有写权限,那么所有用户都不能在其中创建或删除文件,目录就无法作为有效的共享目录。
共勉