文件权限管理

LinuxBeginner
立即练习

介绍

在本实验中,我们将深入探索 Linux 文件权限的世界。我们将学习三个核心命令:chowntouchchmod。这些工具对于管理 Linux 系统中文件和目录的访问权限至关重要。通过本实验,你将牢固掌握如何创建文件、更改文件所有权以及修改文件权限。理解这些命令将使你能够精准控制谁可以读取、写入和执行系统上的文件。

这是一个引导式实验,提供了逐步指导来帮助你学习和练习。请仔细遵循说明完成每个步骤,以获得实践经验。历史数据表明,这是一个初学者级别的实验,完成率为 92%。它获得了学习者 99% 的好评率。

创建新文件

让我们先使用 touch 命令创建一个新文件。这个多功能命令可以创建新的空文件,也可以更新现有文件的时间戳。你可以把它想象成一种快速「触摸」文件的方式,要么让它诞生,要么更新它的最后访问时间。

首先,确保你处于正确的目录中。我们将在 project 目录中进行操作:

cd ~/project

cd 命令代表「切换目录」(change directory)。~ 符号代表你的家目录,而 /project 指定了我们要进入的子目录。如果 project 目录不存在,此命令可能会失败。如果你不确定目录是否存在,先创建目录通常是个好习惯。不过,在这个实验环境中,该目录应该已经预先创建好了。

现在,让我们创建一个名为 example.txt 的新文件:

touch example.txt

此命令会在当前目录中创建一个名为 example.txt 的空文件。要确认文件是否已创建,请使用 ls 命令:

ls

ls 代表「列出」(list)。它会显示你当前位置的文件和目录。你应该能在输出中看到 example.txt。如果没有看到,请仔细检查你是否正确运行了 touch 命令,以及你是否确实处于 ~/project 目录中。

更改文件所有权

既然我们已经创建了一个文件,现在来学习如何更改它的所有权。chown 命令允许我们修改文件的用户所有者和组所有者。所有权决定了谁对文件拥有控制权。

首先,让我们检查 example.txt 文件的当前所有权:

ls -l example.txt

ls -l 命令(长格式列出)提供了有关文件的详细信息,包括其权限、所有者和所属组。你应该会看到类似这样的输出:

-rw-rw-r-- 1 labex labex 0 Jul 29 15:11 example.txt

让我们拆解一下这段输出:

  1. -rw-rw-r-- 代表文件权限(我们将在步骤 4 中深入探讨)。第一个字符表示文件类型(- 表示普通文件,d 表示目录等)。其余字符代表所有者、组和其他人的读取、写入和执行权限。
  2. 第一个 labex 是文件的当前所有者。这是拥有该文件的用户名。
  3. 第二个 labex 是文件的当前所属组。组是共享权限的用户集合。
  4. 0 是以字节为单位的文件大小。由于文件是空的,所以大小为零。
  5. Jul 29 15:11 是最后修改的日期和时间。
  6. example.txt 是文件名。

现在,让我们将文件的所有权更改为 root 用户。root 是 Linux 系统上的管理员账户,拥有特殊权限。

sudo chown root:root example.txt

以下是该命令的作用:

  • sudo 以 root 权限运行命令。系统可能会提示你输入密码。chown 需要提升权限,因为它是一个可能影响系统安全的强大命令。如果没有 sudo,你会收到「权限被拒绝」(Permission denied)的错误。
  • chown 是更改所有权的命令。
  • root:root 指定了新的所有者和组(都设置为 root)。语法是 所有者:组
  • example.txt 是目标文件。

让我们验证更改:

ls -l example.txt

你现在应该看到所有者和组都已更改为 root

-rw-rw-r-- 1 root root 0 Jul 29 15:11 example.txt

如果你看到的仍然是 labex 而不是 root,请确保在运行 chown 命令时使用了 sudo 并正确输入了密码。

更改目录所有权

chown 命令还可以更改整个目录及其内容的所有权。让我们看看实际操作。这在管理复杂的目录结构时特别有用,因为你可能希望确保所有文件和子目录都拥有相同的物理所有者。

首先,让我们创建一个包含一些文件的新目录:

mkdir -p new-dir/subdir
echo "Hello, world" > new-dir/file1.txt
echo "Another file" > new-dir/subdir/file2.txt

让我们拆解这些命令:

  • mkdir -p new-dir/subdir 创建 new-dir 目录及其 subdir 子目录。-p 选项告诉 mkdir 根据需要创建父目录。如果没有 -p,如果 new-dir 不存在,创建 new-dir/subdir 就会失败。
  • echo "Hello, world" > new-dir/file1.txtnew-dir 目录中创建一个名为 file1.txt 的文件,并将文本「Hello, world」写入其中。> 符号用于重定向;它获取 echo 命令的输出并将其重定向到指定的文件中。
  • echo "Another file" > new-dir/subdir/file2.txt 类似地在 new-dir/subdir 目录中创建一个名为 file2.txt 的文件,并写入文本「Another file」。

现在,让我们检查当前的所有权:

ls -lR new-dir

ls -lR 递归地列出 new-dir 的内容。-R 选项(递归)使 ls 列出 new-dir 及其内容中的所有文件和子目录。

你应该会看到类似这样的内容:

new-dir:
total 4
-rw-rw-r-- 1 labex labex 13 Jul 29 09:15 file1.txt
drwxrwxr-x 2 labex labex 23 Jul 29 09:15 subdir

new-dir/subdir:
total 4
-rw-rw-r-- 1 labex labex 13 Jul 29 09:15 file2.txt

这表明目录 new-dir、其子目录 subdir 以及文件 file1.txtfile2.txt 的所有者都是 labex

现在,让我们将 new-dir 及其所有内容的所有权更改为 root 用户:

sudo chown -R root:root new-dir

在此命令中:

  • -R 选项告诉 chown 递归操作,更改 new-dir 内所有文件和子目录的所有权。这至关重要;如果没有 -R,只有 new-dir 目录本身的所有权会改变,而其中的文件和子目录仍将归 labex 所有。

让我们验证更改:

ls -lR new-dir

你现在应该看到:

new-dir:
total 4
-rw-rw-r-- 1 root root 13 Jul 29 09:15 file1.txt
drwxrwxr-x 2 root root 23 Jul 29 09:15 subdir

new-dir/subdir:
total 4
-rw-rw-r-- 1 root root 13 Jul 29 09:15 file2.txt

如你所见,目录及其所有内容的所有权都已更改为 root。这展示了 -R 选项在对目录结构进行大规模所有权更改时的强大功能。

更改文件权限

在 Linux 中,文件权限由一系列字母或数字表示。让我们探索如何读取和更改这些权限。理解权限对于保护文件安全和防止未经授权的访问至关重要。

首先,让我们看看 example.txt 文件的当前权限:

ls -l example.txt

你可能会看到类似这样的内容:

-rw-rw-r-- 1 root root 0 Jul 29 15:11 example.txt

-rw-rw-r-- 部分代表文件权限。这就是数字表示法和符号表示法发挥作用的地方。让我们来拆解它:

  • 第一个字符(-)表示这是一个普通文件。其他常见的指示符包括 d 表示目录,l 表示符号链接。
  • 接下来的三个字符(rw-)代表所有者的权限(读取和写入,但没有执行)。
    • r 代表读取(read)权限:所有者可以打开并读取文件。
    • w 代表写入(write)权限:所有者可以修改文件。
    • x 代表执行(execute)权限:所有者可以运行该文件(如果它是程序或脚本)。- 表示该权限被拒绝。
  • 接下来的三个(rw-)是针对组的。它们的含义与上述相同,但适用于文件所属组的成员。
  • 最后三个(r--)是针对其他人的(除所有者和组成员之外的所有人)。它们的含义也相同,但适用于既不是所有者也不是文件组成员的用户。

现在,让我们使用 chmod 命令更改这些权限。chmod 代表「更改模式」(change mode),它允许你修改这些权限。我们先从数字表示法开始。

sudo chmod 700 example.txt

在此命令中:

  • 700 是权限的数字表示:
    • 第一位数字(7)代表所有者的权限。
    • 第二位数字(0)代表组的权限。
    • 第三位数字(0)代表其他人的权限。

每个数字都是从 0 到 7 的数值,通过将读取(4)、写入(2)和执行(1)权限的值相加计算得出:

  • 4:读取权限
  • 2:写入权限
  • 1:执行权限
  • 0:无权限

因此,7(第一位数字)赋予所有者读取(4)、写入(2)和执行(1)权限:4+2+1=7。
0(第二位数字)不赋予组任何权限(0+0+0=0)。
0(第三位数字)不赋予其他人任何权限(0+0+0=0)。

因此,700 意味着:所有者拥有读取、写入、执行权限;组无权限;其他人无权限。

让我们验证更改:

ls -l example.txt

你现在应该看到:

-rwx------ 1 root root 0 Jul 29 15:11 example.txt

所有者现在拥有 rwx(读取、写入和执行)权限,而组和其他人则没有任何权限。

更改目录权限

更改目录权限的操作与更改文件权限类似。让我们通过创建一个新目录并修改其权限来进行练习。目录权限控制着谁可以列出目录内容、在目录中创建新文件以及访问目录中已有的文件。

首先,让我们创建一个新目录并设置一些非标准权限:

mkdir ~/test-dir
chmod 700 ~/test-dir

现在,让我们检查当前权限:

ls -ld ~/test-dir

ls -l 中的 -d 选项告诉 ls 列出目录本身,而不是其内容。如果没有 -dls 会列出 test-dir 内部的文件和子目录(目前它是空的)。你应该看到:

drwx------ 2 labex labex 4096 Jul 29 15:45 /home/labex/test-dir

开头的 d 表示这是一个目录。rwx------ 表示所有者拥有读取、写入和执行权限,而组和其他人没有任何权限。对于目录而言:

  • 读取权限(r)允许你使用 ls 列出目录的内容。
  • 写入权限(w)允许你在目录中创建新的文件和子目录。
  • 执行权限(x)允许你访问目录中的文件和子目录(即使用 cd 进入该目录)。

现在,让我们更改权限:

chmod -R 755 ~/test-dir

在此命令中:

  • -R 递归地将更改应用于所有文件和子目录(尽管在本例中我们的目录是空的)。在处理目录时,即使它们目前是空的,养成包含此选项的习惯也是很好的,以防以后添加文件。
  • 755 赋予所有者读取、写入和执行权限,并赋予组和其他人读取和执行权限。

让我们拆解 755

  • 所有者 (7):读取 (4) + 写入 (2) + 执行 (1) = 7
  • 组 (5):读取 (4) + 执行 (1) = 5
  • 其他人 (5):读取 (4) + 执行 (1) = 5

让我们验证更改:

ls -ld ~/test-dir

你现在应该看到:

drwxr-xr-x 2 labex labex 4096 Jul 29 15:45 /home/labex/test-dir

这清楚地显示了权限的变化,从只有所有者拥有访问权限(700)变为所有者拥有完全访问权限,而其他人可以读取和执行(755)。现在,任何人都可以列出 test-dir 的内容并访问其中的文件,但只有所有者可以创建新文件或修改现有文件。

使用符号表示法修改权限

虽然数字表示法很简洁,但符号表示法可能更直观,尤其是当你只想更改单个权限时。符号表示法使用字母来代表用户、组和其他人,并使用运算符来添加或删除权限。

首先,让我们创建一个包含一些内容的新脚本文件:

cd ~/project
echo '#!/bin/bash\necho "Hello, World"' > script.sh

此命令执行了两个操作:

  1. 它创建了一个名为 script.sh 的新文件。.sh 扩展名通常用于 Shell 脚本。Shell 脚本是包含一系列按顺序执行的命令的可执行文件。
  2. 它在该文件中写入了两行内容:
    • #!/bin/bash(称为 shebang)告诉系统这是一个 Bash 脚本。shebang 行指定了执行该脚本应使用的解释器。在本例中是 /bin/bash,即 Bash 解释器的路径。
    • echo "Hello, World" 是一个在脚本运行时打印「Hello, World」的命令。echo 命令只是简单地显示其后的文本。
    • \n 是换行符,确保命令在文件中位于不同的行。

现在,让我们检查它的初始权限:

ls -l script.sh

你应该会看到类似:

-rw-rw-r-- 1 labex labex 32 Jul 29 16:30 script.sh

如你所见,最初该脚本仅对所有者和组具有读取和写入权限,对其他人具有读取权限。它没有执行权限,而作为程序运行它是需要执行权限的。

让我们尝试运行该脚本:

./script.sh

你应该会看到「权限被拒绝」(Permission denied)的错误,因为该脚本还没有执行权限。./ 部分告诉 Shell 执行位于当前目录中的脚本。

现在,让我们使用符号表示法为所有者添加执行权限:

chmod u+x script.sh

在此命令中:

  • u 指的是用户(user,即所有者)。其他选项包括 g 代表组(group),o 代表其他人(others),以及 a 代表所有(all,即用户、组和所有人)。
  • +x 添加执行权限。+ 符号添加权限,而 - 符号删除权限。

因此,u+x 意味着「为所有者添加执行权限」。

让我们验证更改:

ls -l script.sh

你现在应该看到:

-rwxrw-r-- 1 labex labex 32 Jul 29 16:30 script.sh

所有者现在拥有 rwx(读取、写入和执行)权限。

现在,再次尝试运行脚本:

./script.sh

这一次,你应该会看到输出:「Hello, World」

这个例子清楚地展示了为什么我们需要为脚本添加执行权限,以及添加权限前后的区别。符号表示法使得修改特定权限变得容易,而无需重新计算整个数字表示。

总结

在本实验中,我们探索了管理文件权限的基本 Linux 命令:

  1. 我们使用 touch 来创建新文件并更新现有文件。
  2. 我们学习了如何使用 chown 更改文件和目录的所有权,包括对整个目录结构进行递归更改。
  3. 我们练习了使用 chmod 的数字表示法和符号表示法来修改文件和目录权限,理解了所有者、组和其他人的不同权限级别。
  4. 我们看到了权限为何重要的实际案例,例如运行脚本需要执行权限。
  5. 我们阐明了 chmod 的数字表示法和符号表示法之间的区别,以及各自适用的场景。

这些命令对于维护 Linux 系统的安全和控制访问至关重要。请记住,在更改权限时务必谨慎,尤其是在使用 sudo 时,因为不正确的更改可能会对系统安全和功能产生重大影响。在执行命令之前,请务必仔细检查,并了解你所做更改的影响。