Linux中的chmod命令用于更改文件和目录的权限设置。它允许用户定义谁可以读取、写入或执行某个文件,通过修改权限设置来实现。权限通常分配给三个类别:文件所有者、文件所属组以及其他用户。chmod命令可以使用符号表示法(例如chmod u+x filename为用户添加执行权限)或数字表示法(例如chmod 755 filename为每个类别设置具体的读、写和执行权限)。这个命令对于管理系统访问控制至关重要,确保文件和目录具有适当的安全设置。

本教程中的所有示例和指令均已在Ubuntu 24.04上测试通过,使用的chmod版本为8.25。

Chmod基础知识

请看以下ls命令示例:

Linux chmod命令使用教程:文件权限管理详解

输出结果的第一列是我们关注的内容。先不管开头的“-”(表示文件类型),剩余的字段可以进一步拆分为:rw-、rw-和r--。这些分别代表文件所有者、文件所属组以及其他用户对该文件的权限。

这意味着文件所有者拥有读取(r)和写入(w)权限,文件所属组也一样。而其他用户则只有读取权限。注意:我们假设当前用户是文件的所有者。

现在假设需要给所有人执行该文件的权限,可以这样做:

chmod +x script.sh

现在的权限变为:

Linux chmod命令使用教程:文件权限管理详解

所有者、组和其他用户权限中多出的“x”表示每个人现在都拥有了该文件的执行权限。

然而,很可能你不希望所有人都有文件的执行权限。如果只想给文件所有者/当前用户授予script.sh的执行权限,可以这样做:

首先,撤销所有人的执行权限:

chmod -x script.sh

然后单独为文件所有者授予执行权限:

chmod u+x script.sh

你可能已经猜到,“u+x”表示为文件所有者/当前用户(u)授予(+)执行(x)权限。同理,对于组可以使用“g”,对于其他用户可以使用“o”。

请注意,当你想给所有人授予或撤销同一组权限时,可以使用“a”代替“ugo”。也就是说,这个命令:

chmod ugo-x script.sh

可以被替换为:

chmod a-x script.sh

还要记住,如果没有明确指定“u”、“g”、“o”和“a”中的任何一个,则默认假定为“a”。

此外,如果需要,你还可以将某个用户的权限复制给组或其他用户。为此,使用“=”符号。

例如,将文件所有者/用户的权限复制给组:

chmod g=u script.sh

另一种场景是复制某个特定文件的权限并应用到你的文件上。这时可以使用--reference命令行选项。以下是使用该选项的通用模板:

chmod --reference=[source-file] [destination file]

在上述命令中,source-file是你想要复制其权限位的文件,destination-file是你想要更改其权限位的文件。

接下来,chmod还有一种数字表示法(也称为八进制表示法),可以用来告诉chmod更改权限。在这种模式下有三个数字可以使用:4、2和1。其中4代表读取,2代表写入,1代表执行。

例如,请看以下示例:

Linux chmod命令使用教程:文件权限管理详解

现在假设需要为文件所有者/用户添加执行权限,为组移除写入权限但添加执行权限,并移除其他用户的所有权限。可以这样做:

chmod 750 script.sh

在上述命令中,“7”代表用户,是4+2+1的结果,因为要求用户拥有所有权限。“5”代表组,是4+0+1的结果,因为要求组只拥有读取和执行权限。“0”代表其他用户,是0+0+0的结果,因为要求撤销其他用户的所有权限。

对于处理符号链接的用户,这里有一些值得了解的内容:

chmod从不更改符号链接的权限;chmod系统调用无法更改它们的权限。这不是问题,因为符号链接的权限从来不会被使用。但是,对于命令行中列出的每个符号链接,chmod会更改它指向的文件的权限。相比之下,chmod会忽略在递归遍历目录时遇到的符号链接。

命令行参考

Linux中的chmod命令有几个命令行选项可以修改其行为。以下是最常用的选项列表:

-R, --recursive

此选项将权限更改递归地应用到指定目录内的所有文件和目录。当你想要一次性更改目录及其所有内容的权限时,这个选项非常有用。

chmod -R 755 /path/to/directory

-c, --changes

此选项只在权限发生变更时才报告。如果权限成功修改,它会输出一条指示变更的消息。

chmod -c 644 filename

-v, --verbose

此选项提供每个处理文件的详细信息,无论权限是否被更改。

chmod -v 755 filename

--reference=RFILE

此选项不是直接指定权限,而是将文件或目录的权限设置为与另一个文件或目录(RFILE)相同。

chmod --reference=file1 file2

-f, --silent, --quiet

此选项抑制大多数错误消息,使命令在执行时不显示错误输出。

chmod -f 755 filename

这些选项使chmod可以在各种场景下灵活使用,从单文件调整到大规模目录权限更改。

总结

在本教程中,我们讨论了与chmod工具相关的大部分基础知识,所讨论的示例旨在让这些基础更加清晰。

请注意,我们的讨论主要集中在文件上。在使用chmod处理目录时,你需要注意一些细节。对于所有这些信息(以及chmod的更多详细内容),请查看该工具的man页面