chmod (Change Mode) 是 Linux/Unix 系统中用于改变文件或目录权限的核心命令。它允许你控制谁可以读取、写入或执行某个文件。
注意 :你输入的
chomd是拼写错误,正确的命令是chmod。
1. 核心概念:权限基础
在理解 chmod 之前,必须先看懂 ls -l 输出的权限字符串(例如 -rwxr-xr--):
-rwxr-xr--
^ ^ ^ ^
| | | └─ 其他用户 (Others) 的权限
| | └──── 所属组 (Group) 的权限
| └─────── 所有者 (User/Owner) 的权限
└────────── 文件类型 (- 代表文件, d 代表目录)
- r (Read) : 读权限(文件可看内容,目录可列出文件)。数值:4
- w (Write) : 写权限(文件可修改,目录可创建/删除文件)。数值:2
- x (Execute) : 执行权限(文件可运行,目录可进入)。数值:1
2. 两种设置模式
chmod 支持两种方式来修改权限:数字法(绝对模式) 和字母法(符号模式)。
A. 数字法 (Absolute Mode) - 最常用
将 r, w, x 的数值相加得到三位数字。
- rwx = 4+2+1 = 7
- rw- = 4+2+0 = 6
- r-x = 4+0+1 = 5
- r-- = 4+0+0 = 4
- --- = 0
语法 :chmod [数字][数字][数字] 文件名
- 第一位:所有者 (User)
- 第二位:所属组 (Group)
- 第三位:其他人 (Others)
常用示例:
# 赋予所有者读写执行,组和其他人只读执行 (最常见脚本权限)
chmod 755 script.sh
# 结果:-rwxr-xr-x
# 赋予所有者读写,组和其他人只读 (常见配置文件)
chmod 644 config.txt
# 结果:-rw-r--r--
# 赋予所有人所有权限 (危险!慎用)
chmod 777 file.txt
# 结果:-rwxrwxrwx
# 只有所有者能读写执行,其他人无任何权限 (私密文件)
chmod 700 secret.key
# 结果:-rwx------
B. 字母法 (Symbolic Mode) - 更灵活
通过字符来增加、移除或设定权限。
语法 :chmod [谁][操作符][权限] 文件名
- 谁 :
u: 所有者 (user)g: 所属组 (group)o: 其他人 (others)a: 所有人 (all, 默认)
- 操作符 :
+: 添加权限-: 移除权限=: 设定确切权限 (覆盖原有)
- 权限 :
r,w,x
常用示例:
# 给文件添加执行权限 (所有人都能执行)
chmod +x script.sh
# 等同于 chmod a+x script.sh
# 移除其他人的写权限 (保护文件不被误改)
chmod o-w file.txt
# 让所有者拥有读写执行,组和其他人只有读权限
chmod u=rwx,g=r,o=r file.txt
# 递归地给目录下所有文件添加执行权限
chmod -R +x my_folder/
3. 常用场景速查表
表格
| 场景 | 命令 | 解释 |
|---|---|---|
| 运行脚本 | chmod +x script.sh |
让脚本可执行 |
| 上传网页文件 | chmod 644 index.html |
网站标准权限,安全且可读 |
| 私有密钥 | chmod 600 id_rsa |
SSH 密钥必须严格限制,否则报错 |
| 临时目录 | chmod 1777 /tmp |
任何人可写,但只能删除自己的文件 (粘滞位) |
| 修复权限 | chmod -R 755 dir/ |
递归修复目录权限 |
| 修复文件权限 | find dir -type f -exec chmod 644 {} \; |
递归修复目录下仅文件的权限 (不改动目录) |
4. 高级用法
A. 特殊权限位 (Special Bits)
除了 rwx,Linux 还有三个特殊权限位,通常用4位数字 表示(例如 4755)。
-
SUID (Set User ID, 4xxx)
- 作用 :用户执行该文件时,暂时拥有文件所有者的权限。
- 典型应用 :
passwd命令。普通用户需要修改/etc/shadow(root 所有),所以passwd设置了 SUID。 - 设置 :
chmod 4755 file(显示为-rwsr-xr-x,注意s)。 - 风险:如果被黑客利用,可能导致提权。
-
SGID (Set Group ID, 2xxx)
- 作用 (文件) :执行时拥有文件所属组的权限。
- 作用 (目录) :非常重要 。在该目录下创建的新文件,会自动继承该目录的所属组,而不是创建者的主组。常用于团队协作目录。
- 设置 :
chmod 2775 shared_folder(显示为drwxrwsr-x)。
-
Sticky Bit (粘滞位, 1xxx)
- 作用 :主要用于公共目录 (如
/tmp)。开启后,即使用户对目录有写权限,也只能删除自己拥有的文件,不能删除别人的文件。 - 设置 :
chmod 1777 /tmp(显示为drwxrwxrwt,注意末尾的t)。
- 作用 :主要用于公共目录 (如
组合示例:
# 设置一个协作目录:
# 2 (SGID): 新文件继承组
# 7 (Owner): rwx
# 7 (Group): rwx
# 5 (Other): r-x
chmod 2775 /team_project
B. 参考文件设置权限 (--reference)
如果你想让文件 A 的权限完全变得和文件 B 一样,不需要计算数字:
chmod --reference=config_backup.txt config_new.txt
C. 递归修改中的陷阱
使用 chmod -R 时要非常小心,因为它会同时修改目录和文件的权限。
-
错误做法 :
chmod -R 755 /var/www- 后果:所有文件都变成了可执行 (
x),这可能带来安全风险,且不符合常规文件权限规范。
- 后果:所有文件都变成了可执行 (
-
正确做法 :分别处理目录和文件。bash
# 1. 目录设为 755 (可进入) find /var/www -type d -exec chmod 755 {} \; # 2. 文件设为 644 (不可执行) find /var/www -type f -exec chmod 644 {} \;
D. 使用 chmod 的 verbose 模式
查看具体改变了哪些文件:
chmod -v 755 script.sh
# 输出:mode of 'script.sh' changed to 0755 (rwxr-xr-x)
总结
- 日常使用 :推荐用 数字法 (
755,644),简单直观。 - 微调权限 :推荐用 字母法 (
+x,o-w),无需计算。 - 协作目录 :记得用 SGID (
2xxx)。 - 公共目录 :记得用 粘滞位 (
1xxx)。 - 安全第一 :永远不要随意使用
777,除非你明确知道自己在做什么且处于隔离环境。