chmod

修改文件的访问权限


语法格式

chmod [-cfRV] [--preserve-root] modes files
chmod [-cfRV] [--preserve-root] octal-mode files
chmod [-cfRV] [--preserve-root] --reference=rfile files
chmod [--help] [--version]

命令简介

chmod命令根据指定的模式参数修改指定文件的模式字段,包括访问权限、setuid和setgid位等。modes参数是一种符号模式表示的访问权限修改意向,如增加或删除某种访问权限等,octal-mode是一个八进制数值,表示按指定的模式重新设置文件的模式字段,不管文件原来的模式如何。files是一个或一组文件及目录。

注意,访问权限只是模式字段的一部分。模式字段还包括setuid、setgid、粘性位和文件类型等,chmod命令能够修改的仅限于访问权限、setuid、setgid和粘连位,不能修改文件的类型。

模式字段由16个二进制数据位组成,从高序位到低序位,前4位表示文件的类型,中间3位分别对应setuid、setgid和粘性位,后9位分为3组,第一组的3个二进制数据位分别表示文件属主是否能够读、写和执行文件(对于目录而言表示是否能够检索目录),第二组表示用户组是否能够读、写和执行文件,第三组表示此外的其他用户是否能够读、写和执行文件。如果用八进制数据表示3组9个二进制数据位,可以用000~777范围的八进制数据表示3个组别的读、写和执行。

符号模式的通用语法格式可由“[ugoa][[+-=][rwxXst]|[ugo]]”表示。在命令行中,可以同时指定多个符号模式,中间加逗号“,”分隔符。

字母ugoa的组合控制了文件的哪一部分权限需要修改。其中,u表示文件的属主,g表示文件归属的用户组,o表示此外的其他用户,a表示所有用户。如果未指定上述任何一个字符,相当于指定了a,但不影响umask的设置。

运算符“+”表示需要设置文件模式字段的相应位,增加文件的相应访问权限。“-”表示需要清除文件模式字段的相应位,删除文件的相应访问权限。“=”表示需要设置文件模式字段的相应位,而清除模式符号未提到的相应位,但不影响目录的属主和用户组设置。

“rwxXst”用于选择文件模式字段的相应标志位。按照文件属主、同组用户和其他用户3种情况,文件模式字段的相应标志位表示是否能够读(r)、写(w)和执行(x)文件(或检索目录)。文件是否设置了setuid(s)、setgid(s)或粘性位(t)等。特殊的X表示,仅当文件参数是一个目录,或文件已经具有执行的权限,才赋予相应用户执行或检索的权限。

除此之外,还可以直接使用ugo三个字母之一,表示使用文件属主、用户组或其他用户的当前权限设置其他组别的权限。

采用八进制数值设置文件的模式字段可能更直观,也更简捷。对于3个组别而言,7(111)表示全权,6(110)表示可读写,5(101)表示读与执行,4(100)表示只读,3(011)表示可以写和执行,2(010)表示只能写,1(001)表示只能执行,0(000)表示没有任何权限。至于setuid、setgig和粘性位,三者分别对应4(100)、2(010)和1(001)。

因此,如果想赋予文件一个全权,可以使用“chmod 777 file”命令。如果还要设置setuid、setgig或粘性位,可以使用类似于“chmod 4775 file”的命令。

一个文件或目录何时需要设置setuid、setgig或粘性位,下列说明可供参考:

设置文件的访问权限主要是为了保护文件,确保数据的安全。例如,大多数系统文件只有超级用户才能访问,普通用户不能修改,有的甚至也不能读,如/etc/shadow文件。当用户修改密码时,实际上也需要修改shadow文件。为此,系统提供了passwd命令,供用户随时修改自己的密码。passwd命令之所以能够修改shadow文件,是因为passwd命令文件设置了setuid位,在运行期间具有超级用户的访问权限。

设置setuid和setgid位的主要目的即在于此。如果一个命令文件设置了setuid或setgid位,在运行相应命令期间,用户的有效用户ID或有效用户组ID就会临时变成命令文件属主或用户组的用户ID或用户组ID,一旦退出又恢复原状。

如果需要设置一个文件的setuid位,可以使用类似于“chmod u+s file”的命令。

粘性位的作用取决于文件的类型。如果一个目录设置了粘性位,普通用户只能删除该目录中属于自己的文件。即使访问权限允许读写,也不能随意删除其他用户的文件,除非目录是自己拥有的,从而能够防止普通用户删除或覆盖共享目录中不属于自己的文件。

对于普通文件而言,粘性位表示共享代码段(text)方式。在传统的系统中,如果文件设置了粘性位,当第一次调用相应的程序时,一经执行,系统就会把程序的代码段副本存储在交换区中,即使程序已经终止执行。当再次运行时,能够减少程序代码段的加载时间。

如果需要设置一个目录的粘性位,可以使用类似于“chmod +t dir”的命令。

命令选项

-c, --changes  类似于“-v”选项,但仅当发生实际变化时才显示处理过程。

-f, --silent, --quiet  禁止输出不重要的错误信息。

-R, --recursive  递归地处理文件与目录。

-v, --verbose  显示命令的内部处理过程,依次显示每个文件的修改结果。

--preserve-root  当使用“-R”选项递归地修改文件的访问权限时,再指定这个选项能够禁止处理根目录“/”,否则这个选项不起任何作用。

--reference=rfile  以指定的参考文件为准,设置命令行参数指定文件的模式字段,包括文件的访问权限等。

应用实例

1. 增加脚本文件chx的可执行属性,使得任何人均可运行。

$ chmod a+x chx
$

2. 采用八进制数据的方式做同样的修改(普通文件的访问权限通常为664,上述命令修改后的访问权限应为664+111=775)。

$ chmod 775 chx
$

索引:A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z