文件权限

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,我们将深入探讨 Linux 中的文件权限。我们将探索三个重要的命令:chowntouchchmod。这些工具对于管理对 Linux 系统上的文件和目录的访问至关重要。在本实验结束时,你将扎实掌握创建文件、更改文件所有权和修改文件权限的方法。理解这些命令将使你能够控制谁可以在你的系统上读取、写入和执行文件。

成果

完成本实验后,你将能够:

  • 使用 chmod 修改文件权限
  • 使用 chown 更改文件所有权
  • 使用 touch 创建新文件并更新现有文件的时间戳

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL shell(("Shell")) -.-> shell/ControlFlowGroup(["Control Flow"]) shell(("Shell")) -.-> shell/SystemInteractionandConfigurationGroup(["System Interaction and Configuration"]) linux(("Linux")) -.-> linux/UserandGroupManagementGroup(["User and Group Management"]) shell(("Shell")) -.-> shell/BasicSyntaxandStructureGroup(["Basic Syntax and Structure"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) shell/BasicSyntaxandStructureGroup -.-> shell/comments("Comments") linux/BasicFileOperationsGroup -.-> linux/touch("File Creating/Updating") linux/BasicFileOperationsGroup -.-> linux/chown("Ownership Changing") linux/BasicFileOperationsGroup -.-> linux/chmod("Permission Modifying") linux/FileandDirectoryManagementGroup -.-> linux/mkdir("Directory Creating") shell/ControlFlowGroup -.-> shell/cond_expr("Conditional Expressions") shell/SystemInteractionandConfigurationGroup -.-> shell/globbing_expansion("Globbing and Pathname Expansion") linux/UserandGroupManagementGroup -.-> linux/sudo("Privilege Granting") subgraph Lab Skills shell/comments -.-> lab-270252{{"文件权限"}} linux/touch -.-> lab-270252{{"文件权限"}} linux/chown -.-> lab-270252{{"文件权限"}} linux/chmod -.-> lab-270252{{"文件权限"}} linux/mkdir -.-> lab-270252{{"文件权限"}} shell/cond_expr -.-> lab-270252{{"文件权限"}} shell/globbing_expansion -.-> lab-270252{{"文件权限"}} linux/sudo -.-> lab-270252{{"文件权限"}} end

创建新文件

让我们首先使用 touch 命令创建一个新文件。这个多功能的命令可以创建新的空文件,并更新现有文件的时间戳。可以把它看作是一种快速 “触碰” 文件的方式,既能创建文件,也能更新其最后访问时间。

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

cd ~/project

cd 命令代表 “切换目录”。~ 符号表示你的主目录,/project 指定了我们要进入的子目录。如果 project 目录不存在,这个命令可能会失败。如果你不确定,通常最好先创建该目录。不过,在本实验环境中,该目录应该已经存在。

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

touch example.txt

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

ls

ls 代表 “列出”。它会显示你当前位置的文件和目录。你应该会在输出中看到 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,你会得到一个 “权限被拒绝” 的错误。
  • 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 表示读取权限:所有者可以打开并读取文件。
    • w 表示写入权限:所有者可以修改文件。
    • x 表示执行权限:所有者可以运行文件(如果它是一个程序或脚本)。- 表示该权限被拒绝。
  • 接下来的三个字符(rw-)是针对组的。它们与上述含义相同,但适用于文件所属组的成员。
  • 最后三个字符(r--)是针对其他用户(其他所有人)的。它们也具有相同的含义,但适用于既不是所有者也不是文件所属组成员的用户。

现在,让我们使用 chmod 命令来更改这些权限。chmod 代表 “更改模式”,它允许你修改这些权限。我们将从 数字表示法 开始。

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 将更改递归地应用于所有文件和子目录(尽管在这种情况下我们的目录是空的)。在处理目录时,即使它们目前是空的,包含 -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

你应该会看到一个 “权限被拒绝” 的错误,因为该脚本尚未具有执行权限。./ 部分告诉 shell 执行位于当前目录中的脚本。

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

chmod u+x script.sh

在这个命令中:

  • u 指用户(所有者)。其他选项有 g 代表组,o 代表其他用户,a 代表所有(用户、组和其他用户)。
  • +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 时,因为不正确的更改可能会对系统安全和功能产生重大影响。在执行命令之前,请务必仔细检查,并且要理解你所做更改的影响。