介绍
在本实验中,我们将深入探讨 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)。语法格式为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.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代表读权限:所有者可以打开并读取文件。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 列出目录本身,而不是其内容。如果没有 -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:
- 所有者(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 命令:
- 我们使用
touch创建新文件并更新现有文件。 - 我们学习了如何使用
chown更改文件和目录的所有权,包括对整个目录结构进行递归更改。 - 我们练习了使用数字和符号表示法通过
chmod修改文件和目录权限,并理解了所有者、所属组和其他用户之间不同的权限级别。 - 我们通过实际示例了解了权限的重要性,例如运行脚本需要执行权限。
- 我们阐明了
chmod数字表示法和符号表示法之间的区别,以及何时使用哪种方式更为合适。
这些命令对于维护 Linux 系统的安全性和控制访问权限至关重要。请记住,在更改权限时务必谨慎,特别是在使用 sudo 时,因为错误的更改可能会对系统的安全性和功能产生重大影响。在执行命令之前,请务必仔细检查,并了解所做更改的含义。



