文件权限

LinuxBeginner
立即练习

简介

本实验将深入介绍 Linux 中的文件权限。你将学习 3 个重要命令: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 是文件大小,单位为字节。由于该文件为空,因此大小为 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
  • 接下来的 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=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 时,因为错误的更改可能严重影响系统安全和功能。执行命令前应仔细检查命令内容,并理解即将进行的更改可能带来的影响。