名称

chmod - 更改文件模式位(权限)

简介

chmod [选项]... 模式[,模式]... 文件...
chmod [选项]... 八进制模式 文件...
chmod [选项]... --reference=参考文件 文件...

描述

chmod 用于更改指定文件或目录的访问权限。权限决定了文件所有者、所属组以及其他用户对文件的读、写、执行权限。可以使用符号模式(如 u+x)或八进制数字模式(如 755)来设置权限。

权限位分为三类:

  • 所有者(user):文件的所有者。

  • 组(group):文件所属组的成员。

  • 其他用户(others):既不是所有者也不在所属组中的用户。

每个类别可设置以下权限:

  • 读(r):允许读取文件内容或列出目录内容。

  • 写(w):允许修改文件或在目录中创建/删除文件。

  • 执行(x):允许执行文件或进入目录。

此外,还有特殊权限位(setuid、setgid、sticky bit),可通过符号模式或额外的数字位设置。

选项

短选项

长选项

描述

-c

--changes

类似 -v,但仅在权限实际更改时才输出诊断信息。

-f

--silent, --quiet

静默模式,抑制大多数错误信息。

-v

--verbose

显示每个文件处理的详细信息(无论权限是否更改)。

--no-preserve-root

不特殊对待“/”(根目录),默认行为。

--preserve-root

禁止对根目录“/”递归操作,防止意外。

--reference=参考文件

将指定文件的权限设置为与 参考文件 相同,忽略 模式

-R

--recursive

递归修改目录及其内部所有文件和子目录的权限。

--help

显示帮助信息并退出。

--version

显示版本信息并退出。

模式说明

符号模式

格式:[ugoa...][[+-=][perms...]...]

  • 用户标识(可组合):

    • u:所有者(user)

    • g:组(group)

    • o:其他用户(others)

    • a:所有用户(all,等同于 ugo

  • 操作符

    • +:添加权限

    • -:移除权限

    • =:设置精确权限(现有权限被覆盖)

  • 权限

    • r:读

    • w:写

    • x:执行

    • X:仅当文件是目录或已有执行权限时才添加执行权限(对目录总是可执行)

    • s:setuid/setgid(根据用户标识而定)

    • t:sticky bit

    • ugo:将权限设置为与当前所有者、组或其他用户的权限相同

多个模式可以用逗号分隔(无空格),例如 u+r,g-w

八进制数字模式

使用3或4位八进制数表示权限:

  • 第一位(可选):特殊权限(setuid=4,setgid=2,sticky=1)

  • 第二位:所有者权限(读=4,写=2,执行=1,和值如7=rwx)

  • 第三位:组权限(同上)

  • 第四位:其他用户权限(同上)

例如:

  • 755:所有者 rwx(7),组 r-x(5),其他 r-x(5)

  • 644:所有者 rw-(6),组 r--(4),其他 r--(4)

  • 4755:setuid + 所有者 rwx,组 r-x,其他 r-x

退出状态

  • 0 – 成功。

  • >0 – 发生错误(例如文件不存在、权限不足等)。

常用示例

1. 使用符号模式添加或移除权限

chmod u+x script.sh          # 为所有者添加执行权限
chmod g-w file.txt           # 移除组的写权限
chmod o=r file.txt           # 设置其他用户权限为只读(覆盖原有)
chmod a+x script.sh          # 为所有用户添加执行权限
chmod u=rw,g=r,o= file.txt   # 所有者读写,组只读,其他无权限

2. 使用八进制模式设置权限

chmod 755 script.sh # 所有者可读写执行,组和其他只读执行 chmod 644 file.txt # 所有者可读写,组和其他只读 chmod 600 private.key # 所有者可读写,其他无权限

3. 递归修改目录权限

chmod -R 755 /path/to/dir    # 将目录及其内部所有文件设为 755

注意:递归修改时,对文件通常只需 644,对目录需要 755,可使用 find 配合 chmod 分别处理。

4. 使用参考文件复制权限

chmod --reference=template.txt target.txt

5. 设置特殊权限

chmod u+s executable         # 设置 setuid 位(执行时以所有者身份运行)
chmod g+s shared_dir         # 设置 setgid 位(新文件继承目录的组)
chmod +t /tmp                # 设置 sticky 位(仅文件所有者可删除)

使用八进制:

chmod 4755 executable        # setuid + 755
chmod 2755 shared_dir        # setgid + 755
chmod 1777 /tmp              # sticky + 777

6. 显示详细更改信息

chmod -v 644 file.txt

输出类似:

mode of 'file.txt' changed from 0644 (rw-r--r--) to 0644 (rw-r--r--)

仅在实际更改时显示:

chmod -c 644 file.txt

7. 使用大写 X 为目录添加执行权限

chmod -R u+X dir/            # 为目录添加所有者执行权限,文件保持原样

这对于确保目录可进入但普通文件不被意外添加执行权限很有用。

注意事项

  • 只有文件所有者或超级用户(root)才能更改文件权限。

  • 使用 -R 递归时要格外小心,避免设置错误的权限导致系统安全问题或功能异常。

  • 对于符号链接,chmod 通常不影响链接本身,而是修改链接指向的文件(如果支持)。要更改链接自身的权限,可使用 -h 选项(某些系统支持,如 chmod -h),但并非所有 chmod 实现都有此选项。

  • 使用八进制模式时,前导零可省略,但建议保持三位数清晰。

  • 权限更改立即生效,无需重启任何服务。

相关命令

  • chown – 更改文件所有者和组。

  • chgrp – 更改文件所属组。

  • umask – 设置默认权限掩码,影响新创建文件的默认权限。

  • ls -l – 查看文件权限。

  • stat – 显示详细的文件状态(包括权限)。

  • getfacl / setfacl – 管理访问控制列表(ACL),提供更细粒度的权限控制。