修改文件的访问权限
命令语法格式
chmod [OPTION]… MODE[,MODE]… FILE…
chmod [OPTION]… OCTAL-MODE FILE…
chmod [OPTION]… –reference=RFILE FILE…
命令描述
命令chmod根据给出的MODE修改文件FILE的权限位。
为了方便表述问题并遵守习惯,这里将英文的“MODE”翻译为“权限”一词。“UID”表示”用户ID“。“GID”表示“组ID”。
只有有效UID与文件的UID匹配的进程,或具有适当权限的进程,才允许更改文件的权限位。
如果使用,MODE指定新的文件权限位。有关详细信息,请参阅「文件权限」一节。如果你真的想要权限有一个前导的’-‘,你应该使用–首先,例如chmod — -w file。通常情况下,使用chmod a-w FILE更可取,而chmod -w FILE(没有–)会表示它的行为与chmod a-w FILE的行为不同。
关于MODE参数
参数MODE指定了对文件权限的操作(添加、删除、修改)。与命令选项相比,参数MODE的使用更重要一些,因此才放在前面。
参数MODE既可以是「符号权限」,也可以是「数字权限」。
符号权限
对于符号权限,它的格式是[ugoa…][[-+=][perms…]…],即分为三部分。
字母集“ugoa”决定了哪些用户的访问权限会被修改:“u”表示文件所属的用户;“g”表示文件所属组中的用户;“o”表示其他用户;“a”表示所有用户。如果没有指定,则假设为“a”,但是,在UMASK中设置的比特不会受到影响。
操作符“-+=”用于控制权限的移除、添加、修改:“+”表示向权限位添加某个权限;“-”表示移除权限位上的某个权限;“=”表示将权限位设置为指定的权限,但是不会影响setuid和setgid位。
其中的“perms”可以是字母集“rwxXst”中的零个或多个,或者字母集“ugo”中的一个。可以同时指定多个符号权限,但是要用逗号分隔,比如chmod a-x,o+x /tmp/file。
字母集“rwxXst”是用于指定用户的权限位:读(r);写(w);执行或目录搜索(x);只有FILE是目录或者某些用户已经具有可执行权限时,才会赋予执行/搜索(X);在执行时设置UID或者GID(s);限制删除标识或者粘滞位(t)。除了这些字母集中的一个或多个之外,还可以精确地指定字母ugo中的一个:把文件所有者的权限(u)授予用户;将文件所属组的权限(g)授予用户;将其他用户的权限(o)授予用户。比如chmod o+u tmp,将文件所属用户的拥有的权限(u)授予其他用户(o)。
数字权限
对于数字权限,它是四位的八进制数(0-7)。四位数字中每一位都是通过将值4、2、1相加得到的。被忽略的位会自动以前导零进行填充。第一位数字,用于设置setuid(4)、setgid(2)、粘滞位(1);第二位数字用于设置文件所属用户的读(4)、写(2)、执行(1)权限;第三位的数字用于设置文件所属组内用户的权限,权限值与第二位数字相同;第四位的数字用于设置其他用户的权限,权限值与第二位数字相同,也是读(4)、写(2)、执行(1)。
命令支持的选项及含义
下面是命令chmod支持的选项:
-R, –recursive
递归修改目录及子目录中所有对象的访问权限。
–no-preserve-root
不对根目录进行保护,这是默认行为。与–preserve-root选项的作用相反。参考「特别对待根目录」一文中的说明。
–preserve-root
根目录保护。尝试在根目录(/)上递归更改时会失败。没有–recursive选项时,该选项不会有效果。参考「特别对待根目录」一文中的说明。
–reference=RFILE
将文件FILE的访问权限更改为与RFILE相同的访问权限。如果RFILE是符号链接,则会使用符号连接所指向的文件的访问权限。
-f, –silent, –quiet
在文件访问权限无法修改时,不产生错误信息。
-v, –verbose
为每个被处理的文件FILE输出一个诊断信息。
-c, –changes
类似于-v选项,但是只有文件的访问权限实际发生变化的时候才产生日志。如果将文件FILE从所有者staff修改为所有者staff,前后没有发生实际的变化,就不会有诊断信息产生。
–help
显示帮助信息并退出。
–version
显示版本信息并退出。
注意事项
注意,这篇文章中的chmod指的是chmod的GNU实现。
关于符号连接
命令chmod永远不会更改符号链接的权限,因为chmod系统调用本身就不能更改符号链接的权限。但是,这并不会成为一个问题,因为系统从不使用符号链接的权限。
但是,对于命令行上列出的每个参数FILE,如果FILE是符号链接,命令chmod都会更改符号链接指向的文件的权限。于此相反的是,命令chmod会忽略(-R)递归目录时遇到的符号链接。
对于目录
如果目录没有可执行权限(x),则无法进入目录中,也不能对目录做任何操作。
如果目录没有读权限(r),则无法查看目录中的内容。
如果目录没有写权限(w),则无法在目录中创建文件或者子目录。
对于X权限
注意X是大写的。这个大写的X只是chmod中的一个操作概念,在文件和目录上体现的还是小写的x权限。就是说你不会在一个目录上看见类似r-Xr—-的形式,文件和目录上不会出现一个大写X的权限。
使用大写X时:当FILE是目录时,会添加执行权限,此时的用法与x(小写)没有什么区别。如果FILE是一个文件,当某个角色(u,g,o)之一已经具有了执行权限,才会给其他人添加执行权限。
如果你想只给目录层次结构中的子目录添加执行权限,而文件不添加执行权限,只使用小写x是非常麻烦的。而通过大写X会非常方便。
特殊的setuid位、setgid位、STICKY位
setuid与setgid
对于文件。当把它们应用到一个可执行文件时,有效UID(GID)将从实际UID(GID)设置成该程序所有者的UID(GID)。
对于目录。不能对目录应用setuid位,但是setgid可以应用于目录。如果对一个目录设置setgid位,那么在该目录下创建的文件/目录将属于该目录所在组,而不是属于文件创建者所在组。
如果文件的GID不匹配用户的有效GID或用户的补充GID,则成功使用chmod时,将清除常规文件的setgid位,除非用户具有适当的权限。其他限制可能会导致MODE或RFILE的setuid和setgid位被忽略。此行为取决于底层chmod系统调用的策略和功能。如有疑问,请检查底层系统行为。
命令chmod保留一个目录的setuid和setgid位,除非你显式的设定。你可以通过使用符号权限设置或者清除该位,通过使用u+s、g-s等形式。并且你也可以通过数字权限添加该权限位。
STICKY(限制删除标识,沾滞位)
粘滞位是单个位,其解释取决于文件类型。
对于目录。它可以防止非特权用户删除或重命名该目录中的文件,除非他们拥有该文件或目录。这称为目录的受限删除标志,通常可以在像/tmp这种所有人都可写的目录上发现STICKY位,/tmp的权限通常为rwxrwxrwt,最后一个“t”就是沾滞位,表示该目录中的文件只能由所有者删除。
对于文件。对于一些旧系统上的常规文件,该sticky位用于保存在交换设备上的程序的文本映像,以便在运行时加载更快;这被称为沾滞位。
相关手册
chmod(2)
查看在线手册:http://www.gnu.org/software/coreutils/chmod
查看info手册:info ‘(coreutils) chmod invocation’
参考文献
- man 1 chmod, version GNU coreutils 8.26
- What is a capital X in posix / chmod?
更新日志
- 06/20/2017 这天只是把手册导入了,但是没有整理
- 06/09/2018 整理手册,也是周六,刚把chgrp整理完,紧接着就过来了