chmod (Change Mode) 是 Linux/Unix 系统中用于修改文件或目录权限的核心命令,理解它的参数是掌握 Linux 权限管理的关键。
chmod 命令有两种主要的修改权限的方式:
- 符号模式:使用
who、operator和permission的组合来直观地修改权限。 - 绝对模式:使用八进制数字来精确地设置权限。
下面我们分别对这两种模式进行详细说明。
符号模式
符号模式的语法结构是:chmod [who][operator][permission] file...
who (对象)
指定要修改权限的用户类别。
| 符号 | 类别 | 说明 |
|---|---|---|
u |
user | 文件所有者 |
g |
group | 文件所属组 |
o |
others | 其他用户(既不是所有者,也不属于所属组) |
a |
all | 所有用户(u + g + o 的简写) |
operator (操作符)
指定要执行的操作。
| 符号 | 说明 |
|---|---|
| 添加 指定的权限 | |
| 移除 指定的权限 | |
| 设置 仅有指定的权限(会覆盖原有权限) |
permission (权限)
指定要添加、移除或设置的权限。
| 符号 | 权限 | 对文件 | 对目录 |
|---|---|---|---|
r |
读 | 可以查看文件内容 | 可以列出目录中的文件列表 |
w |
写 | 可以修改、删除文件内容 | 可以在目录中创建、删除、重命名文件 |
x |
执行 | 可以运行文件(如脚本、程序) | 可以进入目录(cd) |
s |
SUID/SGID | 特殊权限,稍后详述 | 特殊权限,稍后详述 |
t |
Sticky Bit | 无意义 | 特殊权限,稍后详述 |
绝对模式
绝对模式使用 3 位或 4 位八进制数字来表示权限,每一位数字都对应一组权限的累加。
权限对应的数值
| 权限 | 数值 | 说明 |
|---|---|---|
r (读) |
4 | Read |
w (写) |
2 | Write |
x (执行) |
1 | eXecute |
| (无权限) | 0 | No permission |
用户类别对应的位
| 用户类别 | 位 |
|---|---|
u (所有者) |
第一个八进制数字 |
g (所属组) |
第二个八进制数字 |
o (其他用户) |
第三个八进制数字 |
a (所有用户) |
通常不直接对应一个位,而是用 u、g、o 的和表示 |
如何组合
将用户类别的权限数值相加,就得到了对应的八进制数字。
| 权限组合 | 计算方式 | 八进制数字 | 含义 |
|---|---|---|---|
| 0 + 0 + 0 | 0 |
无任何权限 | |
--x |
0 + 0 + 1 | 1 |
仅执行 |
-w- |
0 + 2 + 0 | 2 |
仅写 |
-wx |
0 + 2 + 1 | 3 |
写和执行 |
r-- |
4 + 0 + 0 | 4 |
仅读 |
r-x |
4 + 0 + 1 | 5 |
读和执行 |
rw- |
4 + 2 + 0 | 6 |
读和写 |
rwx |
4 + 2 + 1 | 7 |
读写执行 |
常用的绝对模式组合
| 八进制数字 | 含义 |
|---|---|
755 |
所有者 rwx (7),所属组 r-x (5),其他用户 r-x (5),最常见的可执行文件或目录权限。 |
644 |
所有者 rw- (6),所属组 r-- (4),其他用户 r-- (4),最常见的普通文件权限。 |
777 |
所有人都有 rwx 权限。极其危险,应尽量避免使用。 |
600 |
所有者 rw- (6),所属组和其他用户无任何权限,常用于配置文件。 |
特殊权限
除了基础的 rwx,还有三个重要的特殊权限。
| 权限 | 八进制 | 作用 | 示例 |
|---|---|---|---|
| SUID | 4 |
Set User ID,当一个可执行文件设置了 SUID,任何用户执行该文件时,都会暂时获得该文件所有者的权限。 | /usr/bin/passwd 命令,普通用户可以修改自己的密码,就是因为这个命令有 SUID 权限,它会以 root 身份运行。 |
| SGID | 2 |
Set Group ID,对文件:执行者会获得文件所属组的权限,对目录:在此目录下创建的新文件,会自动继承该目录的所属组。 | 用于团队项目目录,确保新文件都属于同一个组。 |
| Sticky Bit | 1 |
粘滞位,只对目录有效,一个用户可以删除或重命名一个目录中的文件,仅当该文件是该用户自己的,或者是该目录的所有者。 | /tmp 目录,任何用户都可以在 /tmp 创建文件,但只有文件所有者或 root 才能删除自己的文件。 |
如何设置特殊权限?
- 符号模式:直接在权限前加上特殊权限字母。
- SUID:
chmod u+s file - SGID:
chmod g+s directory - Sticky Bit:
chmod +t directory
- SUID:
- 绝对模式:在正常的 3 位数字前加上特殊权限的数字。
4755-> SUID +rwxr-xr-x2775-> SGID +rwxrwxr-x1777-> Sticky Bit +rwxrwxrwx
其他重要参数
| 参数 | 全称 | 说明 |
|---|---|---|
-R 或 --recursive |
Recursive | 递归地修改权限,会作用于指定目录及其下的所有子文件和子目录。使用时务必小心! |
-v 或 --verbose |
Verbose | 显示详细的操作过程,即哪些文件的权限被修改了。 |
-c 或 --changes |
Changes | 类似 -v,但只显示被实际修改了权限的文件。 |
-f 或 --silent 或 --quiet |
Silent | 忽略大部分错误信息,例如尝试修改一个你没有权限读取的文件的权限。 |
实践示例
假设我们有以下文件和目录:
$ ls -l total 8 -rw-r--r-- 1 alice staff 0 Jan 1 10:00 document.txt drwxr-xr-x 2 alice staff 160 Jan 1 10:01 my_project/
示例 1:使用符号模式
-
让所属组对
document.txt有写权限chmod g+w document.txt
结果:
-rw-rw-r-- -
移除其他用户对
document.txt的读权限chmod o-r document.txt
结果:
-rw-rw---- -
让所有用户对
my_project目录都有执行权限chmod a+x my_project
结果:
drwxr-xr-x(执行权限已经是x,所以无变化)chmod a+wx my_project # 让所有用户都有写和执行权限
结果:
drwxrwxr-x -
仅设置文件所有者为读写执行,其他人无权限
chmod u=rwx,go= document.txt
结果:
-rwx------
示例 2:使用绝对模式
-
设置
document.txt为644权限chmod 644 document.txt
-
设置
my_project目录为775权限chmod 775 my_project
-
递归地将
my_project目录及其所有内容设置为755chmod -R 755 my_project/
警告:
-R会递归修改,请确保你理解其影响,避免错误地修改系统文件。
示例 3:设置特殊权限
-
给
my_script设置 SUID 权限chmod u+s my_script # 或者用绝对模式 chmod 4755 my_script
检查权限:
ls -l my_script,如果所有者的执行位是s而不是x,表示成功,如果是S(大写),表示执行位没有被设置。 -
给
shared_dir设置 SGID 权限chmod g+s shared_dir # 或者用绝对模式 chmod 2775 shared_dir
-
给
public_tmp设置 Sticky Bit 权限chmod +t public_tmp # 或者用绝对模式 chmod 1777 public_tmp
检查权限:
ls -ld public_tmp,如果其他用户的执行位是t而不是x,表示成功,如果是T(大写),表示执行位没有被设置。
希望这份详细的解释能帮助你完全掌握 chmod 命令!
