介绍
在本实验中,你将全面了解管理 Linux 文件系统权限,这是任何 RHEL 系统管理员的关键技能。你将学习如何使用 ls -l 解释文件权限,使用符号模式和八进制模式的 chmod 修改权限,以及使用 chown 更改文件所有权。此外,你将探索并应用特殊权限,例如 SUID、SGID 和粘滞位,并使用 umask 有效地配置默认权限。这个实践经验将使你掌握在 Linux 环境中安全控制文件和目录访问的必要知识。
在本实验中,你将全面了解管理 Linux 文件系统权限,这是任何 RHEL 系统管理员的关键技能。你将学习如何使用 ls -l 解释文件权限,使用符号模式和八进制模式的 chmod 修改权限,以及使用 chown 更改文件所有权。此外,你将探索并应用特殊权限,例如 SUID、SGID 和粘滞位,并使用 umask 有效地配置默认权限。这个实践经验将使你掌握在 Linux 环境中安全控制文件和目录访问的必要知识。
在本步骤中,你将学习如何使用 ls -l 命令解释 Linux 文件系统权限。理解文件权限对于管理 Linux 环境中文件和目录的访问至关重要。
Linux 中的每个文件和目录都有关联的权限,这些权限决定了谁可以读取、写入或执行它们。这些权限分为三类:
每类权限又包含三种类型:
r): 允许查看文件内容或列出目录内容。w): 允许修改文件内容或在目录中创建/删除文件。x): 允许运行可执行文件或进入目录。让我们首先在你的 ~/project 目录中创建一个新目录和一个文件,观察它们的默认权限。
首先,创建一个名为 my_files 的目录:
mkdir ~/project/my_files
接下来,在 my_files 目录中创建一个名为 document.txt 的空文件:
touch ~/project/my_files/document.txt
现在,使用 ls -l 命令查看 document.txt 文件的详细权限。ls -l 命令提供长列表格式,包括文件权限、所有者、组、大小和修改日期。
ls -l ~/project/my_files/document.txt
你应该看到类似于这样的输出:
-rw-rw-r-- 1 labex labex 0 Jun 6 17:36 /home/labex/project/my_files/document.txt
让我们分解输出的第一部分 -rw-rw-r--.:
-) 表示文件类型。
- 表示这是一个普通文件。d 表示这是一个目录。l 表示这是一个符号链接。rw-: 所有者 (labex) 的权限。r (读取), w (写入), - (没有执行权限)。rw-: 组 (labex) 的权限。r (读取), w (写入), - (没有执行权限)。r--: 其他 用户的权限。r (读取), - (没有写入权限), - (没有执行权限)。这意味着 labex 用户 (所有者) 和 labex 组的用户可以读取和写入 document.txt,而其他用户只能读取它。
现在,让我们检查 my_files 目录本身的权限。当使用 ls -l 命令查看目录时,它会列出目录的内容。要查看目录本身的权限,你需要使用 -d 选项与 ls -l 一起使用。
ls -ld ~/project/my_files
你应该看到类似于这样的输出:
drwxrwxr-x 2 labex labex 4096 Jun 6 17:36 /home/labex/project/my_files
让我们解释权限 drwxrwxr-x.:
d) 表示这是一个目录。rwx: 所有者 (labex) 的权限。r (读取), w (写入), x (执行)。rwx: 组 (labex) 的权限。r (读取), w (写入), x (执行)。r-x: 其他 用户的权限。r (读取), - (没有写入权限), x (执行)。对于目录:
r (读取) 允许列出目录的内容。w (写入) 允许在目录中创建、删除或重命名文件。x (执行) 允许进入目录 (使用 cd) 并访问其文件和子目录。这意味着 labex 用户和 labex 组的用户可以列出、创建/删除文件,并进入 my_files 目录。其他用户可以列出并进入该目录,但不能在其中创建或删除文件。
本步骤将教你如何使用 chmod 命令的符号模式更改文件权限。符号模式使用字母和符号表示权限更改,使其直观地添加、删除或设置特定权限。
chmod 命令的符号模式语法为:chmod WHO OPERATION PERMISSIONS FILE
u: 用户 (所有者)g: 组o: 其他用户a: 所有用户 (用户、组和其他用户)+: 添加权限。-: 删除权限。=: 将权限精确设置为指定的值,覆盖现有权限。r: 读取w: 写入x: 执行让我们继续使用前面步骤中创建的 ~/project/my_files/document.txt 文件和 ~/project/my_files 目录。
首先,让我们从 document.txt 中删除组和其他用户的写入权限。回想一下,其当前权限为 -rw-rw-r--。
chmod go-w ~/project/my_files/document.txt
现在,使用 ls -l 验证更改:
ls -l ~/project/my_files/document.txt
输出应显示:
-rw-r--r-- 1 labex labex 0 Jun 6 17:36 /home/labex/project/my_files/document.txt
请注意,组和其他用户的写入权限 (w) 已被删除。
接下来,让我们为所有者 (u) 添加 document.txt 的执行权限。这通常用于脚本,使其可执行。
chmod u+x ~/project/my_files/document.txt
验证更改:
ls -l ~/project/my_files/document.txt
输出应为:
-rwxr--r-- 1 labex labex 0 Jun 6 17:36 /home/labex/project/my_files/document.txt
所有者现在具有执行权限 (x)。
现在,让我们练习使用 ~/project/my_files 目录。其当前权限为 drwxrwxr-x。让我们从该目录中删除其他用户的写入权限 (o)。
chmod o-w ~/project/my_files
验证更改:
ls -ld ~/project/my_files
输出应显示:
drwxr-xr-x 2 labex labex 4096 Jun 6 17:36 /home/labex/project/my_files
等等,为什么 o-w 没有改变输出?这是因为其他用户 (o) 已经没有写入权限。r-x 表示其他用户有读取和执行权限,但没有写入权限。这表明 chmod 仅在更改与当前状态不同时才应用更改。
让我们尝试精确设置权限。我们将 document.txt 的权限设置为 rw-r--r-- (所有者、组、其他)。这意味着所有者获得读写权限,组获得读取权限,其他用户获得读取权限。
chmod a=rw,g=r,o=r ~/project/my_files/document.txt
验证更改:
ls -l ~/project/my_files/document.txt
输出应为:
-rw-r--r-- 1 labex labex 0 Jun 6 17:36 /home/labex/project/my_files/document.txt
此命令 a=rw,g=r,o=r 稍微冗余,因为 a=rw 会将 rw 应用于所有用户,然后 g=r 会将组设置为 r(覆盖来自 a=rw 的 w),而 o=r 会将其他用户设置为 r(覆盖来自 a=rw 的 w)。更简单的方法是 chmod u=rw,go=r。让我们尝试一下。
chmod u=rw,go=r ~/project/my_files/document.txt
验证更改:
ls -l ~/project/my_files/document.txt
输出仍然为:
-rw-r--r-- 1 labex labex 0 Jun 6 17:36 /home/labex/project/my_files/document.txt
最后,让我们使 document.txt 对所有人可执行。
chmod a+x ~/project/my_files/document.txt
验证更改:
ls -l ~/project/my_files/document.txt
输出应为:
-rwxr-xr-x 1 labex labex 0 Jun 6 17:36 /home/labex/project/my_files/document.txt
本步骤将教你如何使用 chmod 命令的八进制 (数字) 模式更改文件权限。八进制模式是一种简洁的权限表示方式,其中每个权限 (读取、写入、执行) 都分配一个数值。
权限的数值如下:
r): 4w): 2x): 1-): 0要确定一组权限 (用户、组或其他用户) 的八进制值,你需要将授予的权限的数值相加。
例如:
rwx (读取、写入、执行) = 4 + 2 + 1 = 7rw- (读取、写入、无执行) = 4 + 2 + 0 = 6r-x (读取、无写入、执行) = 4 + 0 + 1 = 5r-- (读取、无写入、无执行) = 4 + 0 + 0 = 4--- (无权限) = 0 + 0 + 0 = 0chmod 命令的八进制模式使用三位数字,每位数字分别代表所有者、组和其他用户的权限。语法为:chmod OGO FILE
让我们继续使用 ~/project/my_files/document.txt 和 ~/project/my_files。
首先,让我们将 document.txt 的权限设置为 rw-r--r--。
rw- = 6r-- = 4r-- = 4因此,八进制值为 644。
chmod 644 ~/project/my_files/document.txt
验证更改:
ls -l ~/project/my_files/document.txt
输出应为:
-rw-r--r-- 1 labex labex 0 Jun 6 00:48 /home/labex/project/my_files/document.txt
接下来,让我们只允许所有者执行 document.txt,同时保持所有者读写权限,组和其他用户只读权限。这意味着所有者将拥有 rwx (7),组拥有 r-- (4),其他用户拥有 r-- (4)。八进制值为 744。
chmod 744 ~/project/my_files/document.txt
验证更改:
ls -l ~/project/my_files/document.txt
输出应为:
-rwxr--r-- 1 labex labex 0 Jun 6 00:48 /home/labex/project/my_files/document.txt
现在,让我们更改 ~/project/my_files 目录的权限。其当前权限为 drwxr-xr-x。让我们将其权限设置为 rwxr-x---。
rwx = 7r-x = 5--- = 0因此,八进制值为 750。
chmod 750 ~/project/my_files
验证更改:
ls -ld ~/project/my_files
输出应显示:
drwxr-x--- 2 labex labex 26 Jun 6 00:48 /home/labex/project/my_files
这意味着所有者 (labex) 拥有全部权限 (读取、写入、执行),组 (labex) 可以读取和执行 (进入) 目录,其他用户没有任何权限。
最后,让我们创建一个新的可执行脚本文件,以演示直接设置执行权限。
echo '#!/bin/bash' > ~/project/my_script.sh
echo 'echo "Hello from my script!"' >> ~/project/my_script.sh
默认情况下,新文件不可执行。让我们检查其权限:
ls -l ~/project/my_script.sh
你可能会看到类似 -rw-r--r-- 的权限。为了使所有者和组可执行,但其他用户不可执行,我们需要 rwxrwx---。
rwx = 7rwx = 7--- = 0因此,八进制值为 770。
chmod 770 ~/project/my_script.sh
验证更改:
ls -l ~/project/my_script.sh
输出应为:
-rwxrwx--- 1 labex labex 41 Jun 6 00:52 /home/labex/project/my_script.sh
现在你可以执行该脚本:
~/project/my_script.sh
你应该看到输出:
Hello from my script!
本步骤将教你如何使用 chown 命令更改文件和目录的所有者和所属组。这是一个至关重要的管理任务,因为只有 root 用户可以更改文件的拥有者。labex 用户拥有 sudo 权限,这将允许你执行这些操作。
chown 的基本语法为:chown [OPTIONS] NEW_OWNER[:NEW_GROUP] FILE(s)
让我们首先创建一个新用户和组,以便演示所有权更改。由于此环境是基于容器的,我们将为此演示创建简单的用户和组。
首先,创建一个名为 devs 的新组:
sudo groupadd devs
接下来,创建一个名为 developer 的新用户,并将其添加到 devs 组。我们将为此演示创建一个没有主目录或登录 shell 的系统用户。
sudo useradd -r -g devs -s /sbin/nologin developer
现在,让我们将 ~/project/my_files/document.txt 的所有者从 labex 更改为 developer。
sudo chown developer ~/project/my_files/document.txt
使用 ls -l 验证更改:
ls -l ~/project/my_files/document.txt
输出现在应该显示 developer 作为所有者:
-rwxr--r-- 1 developer labex 0 Jun 6 00:48 /home/labex/project/my_files/document.txt
请注意,组所有权 (labex) 保持不变。
你还可以同时更改所有者和组,使用 owner:group 语法。让我们将 document.txt 的所有者更改回 labex,并将所属组更改为 devs。
sudo chown labex:devs ~/project/my_files/document.txt
验证更改:
ls -l ~/project/my_files/document.txt
输出现在应该显示 labex 作为所有者,devs 作为所属组:
-rwxr--r-- 1 labex devs 0 Jun 6 00:48 /home/labex/project/my_files/document.txt
chown 命令还支持 -R (递归) 选项,这允许你更改整个目录树的所有权。让我们将 ~/project/my_files 目录及其所有内容的所有者更改为 developer,所属组更改为 devs。
sudo chown -R developer:devs ~/project/my_files
验证目录的更改:
ls -ld ~/project/my_files
输出应该反映新的所有权:
drwxr-x--- 2 developer devs 26 Jun 6 00:48 /home/labex/project/my_files
请注意,将目录所有权更改为 developer:devs 后,labex 用户将无法访问目录中的文件,因为目录权限为 drwxr-x--- (所有者和组有访问权限,但其他用户没有),而 labex 既不是所有者 (developer) 也不是组成员 (devs)。如果你现在尝试列出文件:
ls -l ~/project/my_files/document.txt
你会收到“权限被拒绝”的错误。这演示了所有权和权限如何协同工作来控制访问。
你还可以仅更改所属组,使用 chown :NEW_GROUP FILE(s)。这等效于使用 chgrp 命令。让我们将 ~/project/my_script.sh 的所属组更改为 devs。
sudo chown :devs ~/project/my_script.sh
验证更改:
ls -l ~/project/my_script.sh
输出应该显示 devs 作为所属组所有者,而 labex 保持为文件所有者:
-rwxrwx--- 1 labex devs 41 Jun 6 00:52 /home/labex/project/my_script.sh
最后,让我们清理,将所有权更改回 labex:labex,然后删除 developer 用户和 devs 组。
sudo chown -R labex:labex ~/project/my_files
sudo userdel developer
sudo groupdel devs
在这一步,你将探索 Linux 中的特殊权限:SUID(Set User ID,设置用户 ID)、SGID(Set Group ID,设置组 ID)和 Sticky Bit(粘滞位)。这些权限提供了对文件执行和目录行为的增强控制。
特殊权限由八进制权限模式中的一个附加数字表示,放置在标准的三位数字(所有者、组、其他用户)之前。
passwd 命令(它需要写入 /etc/shadow,一个由 root 拥有的文件)。ls -l 输出中: s 出现在所有者的 x(执行)权限的位置。如果所有者没有执行权限,则会出现大写的 S。ls -l 输出中: s 出现在组的 x(执行)权限的位置。如果组没有执行权限,则会出现大写的 S。/tmp)中删除或移动其他用户的文件。ls -l 输出中: t 出现在其他用户的 x(执行)权限的位置。如果其他用户没有执行权限,则会出现大写的 T。让我们演示这些特殊权限。
我们将创建一个简单的 C 程序,尝试读取一个受限文件。
首先,创建一个只有 root 才能读取的文件:
sudo touch ~/project/secret_data.txt
sudo chmod 600 ~/project/secret_data.txt
sudo chown root:root ~/project/secret_data.txt
验证其权限:
ls -l ~/project/secret_data.txt
输出:
-rw------- 1 root root 0 Jun 6 17:36 /home/labex/project/secret_data.txt
现在,创建一个 C 程序 read_secret.c,尝试读取此文件:
nano ~/project/read_secret.c
将以下代码粘贴到 read_secret.c 中:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
FILE *fp;
char buffer[256];
printf("Attempting to read /home/labex/project/secret_data.txt...\n");
fp = fopen("/home/labex/project/secret_data.txt", "r");
if (fp == NULL) {
perror("Error opening file");
return 1;
}
while (fgets(buffer, sizeof(buffer), fp) != NULL) {
printf("%s", buffer);
}
fclose(fp);
printf("Successfully read file.\n");
return 0;
}
保存并退出 nano(Ctrl+S,Ctrl+X)。
编译程序:
gcc ~/project/read_secret.c -o ~/project/read_secret
现在,尝试以 labex 的身份运行它:
~/project/read_secret
你应该看到一条“Error opening file: Permission denied”(打开文件错误:权限被拒绝)消息,因为 labex 没有读取 secret_data.txt 的权限。
现在,让我们让 read_secret 归 root 所有并设置 SUID 位。
sudo chown root:root ~/project/read_secret
sudo chmod u+s ~/project/read_secret
验证权限:
ls -l ~/project/read_secret
输出:
-rwsr-xr-x 1 root root 17704 Jun 6 01:02 /home/labex/project/read_secret
注意所有者权限集中的 s。现在,再次以 labex 的身份运行该程序:
~/project/read_secret
这次,它应该成功读取文件(尽管它是空的,因此不会打印任何内容,但“Successfully read file.”消息表示成功)。这是因为 SUID 位使程序以 root 的权限运行。
让我们创建一个共享目录和一个新组。
sudo groupadd shared_group
sudo mkdir ~/project/shared_dir
sudo chown labex:shared_group ~/project/shared_dir
sudo chmod 770 ~/project/shared_dir
现在,在 shared_dir 上设置 SGID 位:
sudo chmod g+s ~/project/shared_dir
验证权限:
ls -ld ~/project/shared_dir
输出:
drwxrws--- 2 labex shared_group 6 Jun 6 01:02 /home/labex/project/shared_dir
注意组的权限集中的 s。
现在,在 shared_dir 内部创建一个文件:
touch ~/project/shared_dir/new_file.txt
检查 new_file.txt 的所有权:
ls -l ~/project/shared_dir/new_file.txt
输出:
-rw-r--r-- 1 labex shared_group 0 Jun 6 01:02 /home/labex/project/shared_dir/new_file.txt
即使 labex 的首要组是 labex,由于 SGID 位,new_file.txt 继承了 shared_group 组所有权。
/tmp 目录是设置了粘滞位的目录的经典示例。让我们创建一个类似的目录。
sudo mkdir ~/project/public_upload
sudo chmod 1777 ~/project/public_upload
1777 中的 1 是粘滞位的八进制值。777 授予所有者、组和其他用户完全的权限。
验证权限:
ls -ld ~/project/public_upload
输出:
drwxrwxrwt 2 root root 6 Jun 6 01:02 /home/labex/project/public_upload
注意其他用户的权限集中的 t。
现在,让我们模拟另一个用户在此目录中创建文件。由于我们只有 labex 用户,我们将以 labex 的身份创建一个文件,然后在将其所有权更改为 root 后尝试将其删除(模拟另一个用户)。
以 labex 的身份创建一个文件:
touch ~/project/public_upload/labex_file.txt
将其所有权更改为 root:
sudo chown root:root ~/project/public_upload/labex_file.txt
现在,尝试以 labex 的身份删除 labex_file.txt:
rm ~/project/public_upload/labex_file.txt
你将看到一个提示,询问你是否要删除受写保护的文件,在用 y 确认后,你将收到一个“Operation not permitted”(不允许操作)错误。这是因为粘滞位阻止用户删除他们不拥有的该目录中的文件,即使 labex 具有对 public_upload 目录的写权限。只有 root 或 labex_file.txt 的所有者(在本例中为 root)才能将其删除。
要清理,你需要 sudo 来删除 labex_file.txt:
sudo rm ~/project/public_upload/labex_file.txt
删除创建的文件和目录,以及用户/组:
sudo rm -f ~/project/secret_data.txt ~/project/read_secret.c ~/project/read_secret
sudo rm -rf ~/project/shared_dir ~/project/public_upload
sudo groupdel shared_group
在最后一步,你将学习 umask,它控制分配给新创建的文件和目录的默认权限。umask(用户文件创建模式掩码)是一个位掩码,它从最大可能的权限中移除权限。
新文件的最大权限是 666 (rw-rw-rw-),表示每个人都可以读写。出于安全原因,新文件通常默认不会获得执行权限。新目录的最大权限是 777 (rwxrwxrwx),表示每个人都可以读、写和执行。
umask 值从这些最大权限中减去,以确定实际的默认权限。
要查看你当前的 umask 值,只需键入 umask:
umask
你可能会看到 0002 或 0022。在这个环境中,对于 labex 用户来说,它是 0022。
umask 为 0022 意味着:
0 用于特殊权限(SUID、SGID、Sticky Bit),默认情况下不受 umask 的影响。0 意味着没有从所有者那里移除权限。2 意味着从组中移除写权限(值 2)。2 意味着从其他人中移除写权限(值 2)。让我们使用 umask 为 0022 来计算默认权限:
对于文件(最大 666):
644 (rw-r--r--)对于目录(最大 777):
755 (rwxr-xr-x)让我们测试一下。创建一个新文件和目录:
touch ~/project/new_file_umask.txt
mkdir ~/project/new_dir_umask
检查它们的权限:
ls -l ~/project/new_file_umask.txt
ls -ld ~/project/new_dir_umask
你应该会看到类似 -rw-r--r-- 的文件权限和 drwxr-xr-x 的目录权限,这确认了 0022 umask 的效果。
现在,让我们将 umask 更改为 0077。这个 umask 将移除所有组和其他人的权限。
umask 0077
验证 umask 是否已更改:
umask
输出:
0077
现在,让我们使用 umask 为 0077 来计算默认权限:
对于文件(最大 666):
600 (rw-------)对于目录(最大 777):
700 (rwx------)让我们测试一下这个新的 umask。创建另一个新文件和目录:
touch ~/project/restricted_file.txt
mkdir ~/project/restricted_dir
检查它们的权限:
ls -l ~/project/restricted_file.txt
ls -ld ~/project/restricted_dir
你现在应该会看到类似 -rw------- 的文件权限和 drwx------ 的目录权限。
umask 设置通常在 shell 初始化文件(如 ~/.bashrc 或 /etc/profile)中配置,以便在用户登录时自动应用。对于这个实验,umask 的更改是临时的,仅适用于当前的终端会话。
要将 umask 恢复为其 labex 用户的默认值,你可以简单地将其设置回 0022:
umask 0022
最后,清理在此步骤中创建的文件和目录:
rm ~/project/new_file_umask.txt ~/project/restricted_file.txt
rmdir ~/project/new_dir_umask ~/project/restricted_dir
在本实验中,我们深入探讨了管理 Linux 文件系统权限的基本方面。我们首先掌握了 ls -l 命令来解释文件和目录权限,理解用户、组和其他类别以及读取、写入和执行权限的重要性。然后,我们将这方面的基础知识应用于使用 chmod 命令修改权限,无论是符号模式还是八进制模式,都提供了设置访问权限的灵活性。
此外,我们学习了如何使用 chown 命令更改文件所有权,这对于分配管理控制至关重要。本实验还涵盖了理解和应用特殊权限 (SUID、SGID 和粘滞位),这些权限提供了对执行和文件创建行为的高级控制。最后,我们探索了如何使用 umask 配置新创建的文件和目录的默认权限,确保整个系统中权限设置的一致性。