文件权限管理

LinuxBeginner
立即练习

介绍

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

创建新文件

首先,我们使用 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)。语法格式为 owner:group
  • 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 代表“更改模式”(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 的内容并访问其中的文件,但只有所有者可以创建新文件或修改现有文件。

使用符号表示法管理权限

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

在此步骤中,你将创建一个小型 shell 脚本,然后为其添加执行权限。

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

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

这些命令执行了两项操作:

  • 第一个 echo 命令创建 script.sh 并将第一行 #!/bin/bash 写入其中。这一行称为 shebang,它告诉 Linux 使用 Bash 运行该脚本。
  • 第二个 echo 命令使用 >> 将新行添加到文件末尾。它写入 echo "Hello, World",当脚本运行时,它将显示 Hello, World

你可以通过以下命令确认文件现在包含两行内容:

cat script.sh

你应该看到:

#!/bin/bash
echo "Hello, World"

现在,检查其初始权限:

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 指代用户(所有者)。其他选项包括 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 时,因为错误的更改可能会对系统的安全性和功能产生重大影响。在执行命令之前,请务必仔细检查,并了解所做更改的含义。