chmod 是 Linux/Unix 系统中用于更改文件或目录权限的核心命令。它通过控制所有者(u)、所属组(g)和其他用户(o)的读®、写(w)、执行(x)权限来保障系统安全与协作。权限设置有两种主要方式:一是直观的符号法(如 chmod u+x file 为所有者添加执行权),二是简洁的数字法(如 chmod 755 file 表示所有者拥有全部权限,其他人可读和执行)。常用选项 -R 可递归处理目录下所有内容。使用时应遵循最小权限原则,避免随意赋予 777 等宽松权限。掌握 chmod 能有效管理文件访问,是系统运维和开发中的基础必备技能。

博主博客

一、命令概述

chmod(change mode)命令用于改变 Linux/Unix 系统中文件或目录的访问权限。Linux 系统中的每个文件或目录都有一套权限系统,用于控制不同用户对其的访问能力。

基本语法

chmod [选项]... 权限模式 文件或目录...

权限层级

Linux 文件权限针对三类用户进行设置:

  • u (User/Owner):文件所有者
  • g (Group):文件所属组的成员
  • o (Others):其他用户(既不是所有者,也不在所属组中)
  • a (All):所有用户(即 u、g、o 的总和)

二、Linux 权限基础

2.1 权限类型

三种基本权限:

  • r (Read):读取权限
    • 文件:可查看内容
    • 目录:可列出目录内容(使用 ls
  • w (Write):写入权限
    • 文件:可修改内容
    • 目录:可在目录内创建、删除、重命名文件
  • x (Execute):执行权限
    • 文件:可作为程序执行
    • 目录:可进入该目录(使用 cd

2.2 查看权限

使用 ls -l 命令查看文件权限:

-rwxr-xr--  1 user group  4096 Jan 1 10:00 example.sh
↑↑↑↑↑↑↑↑↑
└── 权限字符串

权限字符串由10个字符组成:

  • 第1位:文件类型(- 普通文件,d 目录,l 链接等)
  • 第2-4位:所有者(u)权限
  • 第5-7位:所属组(g)权限
  • 第8-10位:其他用户(o)权限

三、权限设置方法

3.1 符号表示法(相对设置)

格式:[ugoa...][[+-=][rwxX]...][,...]

操作符说明:

  • +:添加权限
  • -:移除权限
  • =:精确设置权限(清除原有权限,设置指定权限)

特殊符号:

  • X:特殊执行权限
    • 仅当目标是目录,或已有执行权限时,才添加执行权限
    • 常用于递归设置目录权限时保护普通文件

常用示例:

# 为所有者添加执行权限
chmod u+x script.sh

# 为所有用户添加读取权限
chmod a+r file.txt
chmod +r file.txt      # a 可省略,默认为所有用户

# 移除组和其他用户的写入权限
chmod go-w file.txt

# 精确设置权限:所有者可读写执行,组可读执行,其他用户无权限
chmod u=rwx,g=rx,o= example.sh

# 多种操作组合
chmod u+x,go-wx script.sh

# 使用 X 安全设置目录执行权限
chmod -R a+rX directory/  # 目录添加 x,文件只有可执行时才添加 x

3.2 数字表示法(绝对设置)

格式:chmod abc file

  • a:所有者权限(0-7)
  • b:组权限(0-7)
  • c:其他用户权限(0-7)

权限数值计算:

  • r (读) = 4
  • w (写) = 2
  • x (执行) = 1

权限值 = 所需权限数值之和:

权限 二进制 数字 说明
000 0 无权限
–x 001 1 仅执行
-w- 010 2 仅写入
-wx 011 3 写入 + 执行
r– 100 4 仅读取
r-x 101 5 读取 + 执行
rw- 110 6 读取 + 写入
rwx 111 7 读取 + 写入 + 执行

常用数字权限示例:

# 所有人可读、写、执行(不安全,谨慎使用)
chmod 777 file.txt

# 所有者完全控制,组和其他用户只读
chmod 644 file.txt

# 所有者完全控制,组可读执行,其他用户无权限
chmod 750 script.sh

# 目录常用权限:所有者完全控制,其他用户可读和执行(进入目录)
chmod 755 directory/

# 私有文件:仅所有者可读写
chmod 600 private.txt

四、特殊权限位

4.1 SUID(Set User ID)

  • 数字表示:在百位前加 4(如 4755
  • 符号表示:u+s
  • 作用:程序运行时以文件所有者的身份执行,而不是执行者
  • 显示:在所有者执行位显示为 s(如 rwsr-xr-x
chmod u+s program
chmod 4755 program

4.2 SGID(Set Group ID)

  • 数字表示:在百位前加 2(如 2755
  • 符号表示:g+s
  • 作用:
    • 对文件:运行时以文件所属组的身份执行
    • 对目录:在该目录创建的文件继承目录的组所有权
  • 显示:在组执行位显示为 s(如 rwxr-sr-x
chmod g+s directory
chmod 2755 directory

4.3 Sticky Bit(粘滞位)

  • 数字表示:在百位前加 1(如 1777
  • 符号表示:+t
  • 作用:常用于共享目录,用户只能删除自己创建的文件
  • 典型应用:/tmp 目录
  • 显示:在其他用户执行位显示为 t(如 rwxrwxrwt
chmod +t shared_directory
chmod 1777 shared_directory

4.4 组合特殊权限

# SUID + SGID
chmod 6755 program

# SGID + Sticky Bit
chmod 3777 shared_dir

# 查看特殊权限
ls -l /usr/bin/passwd  # 显示 rwsr-xr-x (SUID)
ls -ld /tmp            # 显示 drwxrwxrwt (Sticky Bit)

五、常用选项

选项 说明
-c 仅在权限更改时显示提示信息
-f 静默模式,不显示错误信息
-v 显示详细信息
-R 递归处理,修改目录及其子目录下所有文件
--help 显示帮助信息
--version 显示版本信息

递归选项 -R 的注意事项:

# 递归设置目录及其内容为所有人可读
chmod -R a+r directory/

# 安全递归:使用 X 而非 x,避免给不可执行文件添加执行权限
chmod -R a+rX directory/

# 错误示例:可能给文本文件添加执行权限
chmod -R a+rx directory/  # 不安全!

# 递归设置特殊权限
chmod -R g+s project_dir/  # 目录下新建文件继承组权限

六、实用示例

6.1 文件权限管理

# 设置脚本可执行
chmod +x script.sh
./script.sh

# 保护配置文件:仅所有者可读写
chmod 600 ~/.ssh/config

# 共享文件:团队成员可读写,其他人只读
chmod 664 shared_file.txt

# 撤销所有执行权限
chmod a-x *.py

6.2 目录权限管理

# 创建共享目录:组成员可读写,其他人无权限
mkdir shared_dir
chmod 770 shared_dir

# Web服务器目录标准权限
chmod 755 public_html/

# 安全下载目录:用户只能写入自己的文件
chmod 733 downloads/  # 或使用 Sticky Bit: chmod 1777 downloads/

6.3 权限复制

# 将 file1 的权限复制给 file2
chmod --reference=file1 file2

七、最佳实践与注意事项

7.1 安全准则

  1. 最小权限原则:仅授予必要的最小权限
  2. 脚本文件:通常需要 755(所有者读写执行,其他人读执行)
  3. 配置文件:通常使用 644600(保护敏感信息)
  4. 数据文件:通常使用 644(所有者读写,其他人只读)
  5. 目录权限:需要执行权限才能进入目录

7.2 常见问题

# 问题:无法删除文件
# 原因:需要父目录的写权限,而非文件本身
chmod +w directory/  # 给目录添加写权限

# 问题:脚本无法执行
# 检查:1. 是否有执行权限 2. 是否有读取权限 3. shebang是否正确
chmod +x script.sh && ./script.sh

# 问题:权限更改无效
# 可能原因:文件系统挂载为只读,或使用无权限的用户
sudo chmod 755 file  # 使用root权限

7.3 权限对照表

数字 符号 文件含义 目录含义
0 --- 不可读、写、执行 不可列、不可进入
4 r-- 只读 可列目录内容,不可进入
5 r-x 可读、执行 可列目录内容,可进入
6 rw- 可读、写 可列、可创建文件,不可进入
7 rwx 可读、写、执行 完全控制

八、调试与验证

8.1 检查当前权限

# 详细列出权限
ls -l filename

# 显示数字权限
stat -c "%a %n" filename

# 递归查看目录权限
find . -type f -exec ls -l {} \;

8.2 测试权限效果

# 测试读取权限
cat filename

# 测试写入权限
echo "test" >> filename

# 测试执行权限
./executable_file

# 测试目录权限
cd directory
ls directory/
touch directory/newfile

总结

chmod 是 Linux 系统管理中至关重要的命令,掌握它的正确使用对于系统安全和管理效率都至关重要。记住:

  1. 理解权限模型:用户-组-其他三级权限体系
  2. 掌握两种表示法:符号法灵活,数字法精确
  3. 谨慎使用递归-R 选项会改变所有子项,使用前确认
  4. 遵循最小权限原则:不要随意授予 777 权限
  5. 了解特殊权限:SUID、SGID、Sticky Bit 的适用场景

通过合理设置文件权限,可以有效保护系统安全,防止未授权访问,同时确保合法用户能够正常完成工作。