用来变更文件或目录的权限
chmod
(全称:change mode)命令是用来更改文件或目录的权限。通过适当配置权限,可以控制哪些用户或用户组可以访问、读取、写入或执行特定文件或目录。
chmod
命令在所有主流的Linux发行版中都是可用的,包括但不限于Debian、Ubuntu、Alpine、Arch Linux、Kali Linux、RedHat/CentOS、Fedora、Raspbian等。如果某个Linux发行版中没有预装chmod
命令,用户可以通过该发行版的包管理器(如apt、yum、dnf、pacman等)来安装。
例如,在Debian或Ubuntu上,可以使用以下命令来安装:
$ sudo apt-get install coreutils
在CentOS 7上,可以使用以下命令来安装:
$ sudo yum install coreutils
在CentOS 8上,可以使用以下命令来安装:
$ sudo dnf install coreutils
chmod [options] mode file...
其中,mode
是权限设定字符串,file
是要更改权限的文件或目录。
-c, --changes:只有在文件权限确实更改时才显示其更改动作。
--no-preserve-root:不将'/'特殊化处理,默认选项。
--preserve-root:不能在根目录下递归操作。
-f, --silent, --quiet:如果文件权限无法更改,不显示错误信息。
-v, --verbose:无论文件是否更改了权限,一律输出操作信息。
--reference=RFILE:使用参考文件或参考目录RFILE的权限来设置目标文件或目录的权限。
-R, --recursive:对目录以及目录下的文件递归执行更改权限操作。
--help:显示帮助信息并退出。
--version:显示版本信息并退出。
在Linux/Unix中,文件的权限分为三级:文件所有者(Owner)、用户组(Group)、其他用户(Other Users),每个文件都与一个所有者用户或组相关联,只有文件所有者和超级用户可以修改文件或目录的权限。
可以使用绝对模式(八进制数字模式)或者符号模式指定文件的权限。
使用符号模式可以设置多个项目:who(用户类型),operator(操作符)和 permission(权限),每个项目的设置可以用逗号隔开。 命令 chmod 将修改 who 指定的用户类型对文件的访问权限,用户类型由一个或者多个字母在 who 的位置来说明,如 who 的符号模式表所示:
who | 用户类型 | 说明 |
---|---|---|
u |
user | 文件所有者 |
g |
group | 文件所有者所在组 |
o |
others | 所有其他用户 |
a |
all | 所有用户, 相当于 ugo |
operator 的符号模式表:
Operator | 说明 |
---|---|
+ |
为指定的用户类型增加权限 |
- |
去除指定用户类型的权限 |
= |
设置指定用户权限的设置,即将用户类型的所有权限重新设置 |
permission 的符号模式表:
模式 | 名字 | 说明 |
---|---|---|
r |
读 | 设置为可读权限 |
w |
写 | 设置为可写权限 |
x |
执行权限 | 设置为可执行权限 |
X |
特殊执行权限 | 只有当文件为目录文件,或者其他类型的用户有可执行权限时,才将文件权限设置可执行 |
s |
setuid/gid | 当文件被执行时,根据who参数指定的用户类型设置文件的setuid或者setgid权限 |
t |
粘贴位 | 设置粘贴位,只有超级用户可以设置该位,只有文件所有者u可以使用该位 |
chmod命令可以使用八进制数来指定权限。文件或目录的权限位是由9个权限位来控制,每三位为一组,它们分别是文件所有者(User)的读、写、执行,用户组(Group)的读、写、执行以及其它用户(Other)的读、写、执行。历史上,文件权限被放在一个比特掩码中,掩码中指定的比特位设为1,用来说明一个类具有相应的优先级。
# | 权限 | rwx | 二进制 |
---|---|---|---|
7 | 读 + 写 + 执行 | rwx | 111 |
6 | 读 + 写 | rw- | 110 |
5 | 读 + 执行 | r-x | 101 |
4 | 只读 | r-- | 100 |
3 | 写 + 执行 | -wx | 011 |
2 | 只写 | -w- | 010 |
1 | 只执行 | --x | 001 |
0 | 无 | --- | 000 |
例如, 765 将这样解释:
假设我们有一个名为file1.txt
的文件,我们想要给所有用户增加读取权限,可以使用以下命令:
$ chmod a+r file1.txt
这个命令将给file1.txt
的所有用户增加读取权限。
如果我们想要删除所有用户对file1.txt
的执行权限,可以使用以下命令:
$ chmod a-x file1.txt
这个命令将删除所有用户对file1.txt
的执行权限。
如果我们想要递归地给一个目录及其所有子目录和文件增加读取权限,可以使用以下命令:
$ chmod -R a+r directory
这个命令将给directory
及其所有子目录和文件的所有用户增加读取权限。
如果想要同时设置用户组(g)和其他用户(o)的权限,可以使用逗号将它们分开。例如,如果希望给用户组增加写权限,并给其他用户增加读权限,可以使用以下命令:
$ chmod g+w,o+r file1.txt
此命令将给file1.txt
的用户组增加写权限,并给其他用户增加读权限。
假如我们希望设置文件所有者具有读取、写入和执行权限(rwx),其他用户则仅有读取权限(r),可以用数值方式表示,并使用以下命令:
$ chmod 744 file1.txt
这个命令设置file1.txt
的权限,使得文件所有者具有读取、写入和执行权限,其他用户则仅有读取权限。
如果我们希望赋予文件所有用户所有权限,可以使用以下命令:
$ chmod 777 file1.txt
此命令将赋予file1.txt
所有用户(用户组和其他用户)所有的读取、写入和执行权限。
反之,如果我们希望移除文件的所有权限,可以使用以下命令:
$ chmod 000 file1.txt
使用chmod
命令时,需要注意文件的所有者和当前用户的关系。只有文件的所有者和超级用户可以更改文件的权限。
该命令是GNU coreutils
包中的命令,相关的帮助信息请查看man chmod
或info coreutils 'chmod invocation'
。
符号连接的权限无法变更,如果用户对符号连接修改权限,其改变会作用在被连接的原始文件。
使用-R
选项一定要保留当前用户的执行和读取权限,否则会报错!