简介
本实验将深入介绍 Linux 中的文件权限。你将学习 3 个重要命令: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是文件大小,单位为字节。由于该文件为空,因此大小为 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。 - 接下来的 3 个字符(
rw-)表示所有者的权限,即可以读取和写入,但不能执行。r表示读取权限:所有者可以打开并读取文件。w表示写入权限:所有者可以修改文件。x表示执行权限:所有者可以运行该文件(如果它是程序或脚本)。-表示不允许该权限。
- 再接下来的 3 个字符(
rw-)表示组的权限。含义与上面相同,但适用于文件所属组中的成员。 - 最后 3 个字符(
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=70(第二个数字)表示组没有任何权限(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 时,因为错误的更改可能严重影响系统安全和功能。执行命令前应仔细检查命令内容,并理解即将进行的更改可能带来的影响。



