介绍
在本实验中,我们将深入探索 Linux 文件权限的世界。我们将学习三个核心命令:chown、touch 和 chmod。这些工具对于管理 Linux 系统中文件和目录的访问权限至关重要。通过本实验,你将牢固掌握如何创建文件、更改文件所有权以及修改文件权限。理解这些命令将使你能够精准控制谁可以读取、写入和执行系统上的文件。
在本实验中,我们将深入探索 Linux 文件权限的世界。我们将学习三个核心命令:chown、touch 和 chmod。这些工具对于管理 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
让我们拆解一下这段输出:
-rw-rw-r-- 代表文件权限(我们将在步骤 4 中深入探讨)。第一个字符表示文件类型(- 表示普通文件,d 表示目录等)。其余字符代表所有者、组和其他人的读取、写入和执行权限。labex 是文件的当前所有者。这是拥有该文件的用户名。labex 是文件的当前所属组。组是共享权限的用户集合。0 是以字节为单位的文件大小。由于文件是空的,所以大小为零。Jul 29 15:11 是最后修改的日期和时间。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.txt 在 new-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.txt 和 file2.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 列出目录本身,而不是其内容。如果没有 -d,ls 会列出 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:
让我们验证更改:
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
此命令执行了两个操作:
script.sh 的新文件。.sh 扩展名通常用于 Shell 脚本。Shell 脚本是包含一系列按顺序执行的命令的可执行文件。#!/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 命令:
touch 来创建新文件并更新现有文件。chown 更改文件和目录的所有权,包括对整个目录结构进行递归更改。chmod 的数字表示法和符号表示法来修改文件和目录权限,理解了所有者、组和其他人的不同权限级别。chmod 的数字表示法和符号表示法之间的区别,以及各自适用的场景。这些命令对于维护 Linux 系统的安全和控制访问至关重要。请记住,在更改权限时务必谨慎,尤其是在使用 sudo 时,因为不正确的更改可能会对系统安全和功能产生重大影响。在执行命令之前,请务必仔细检查,并了解你所做更改的影响。