使用 'chmod' 命令精通 Linux 文件权限

学习 chmod 的符号模式和数字模式、安全默认值、递归更改以及特殊权限位。

掌握 Linux 文件权限:chmod 命令详解

Linux 文件权限决定了谁可以读取、修改或运行文件。当脚本无法执行、Web 服务器无法读取文件,或私钥因权限过于开放而被拒绝时,chmod 通常是解决方案的一部分。

chmod 命令用于更改权限位。你可以使用易读的符号模式(如 u+x)或紧凑的数字模式(如 755)。

读取权限字符串

运行 ls -l 查看文件的类型和权限:

ls -l deploy.sh

示例输出:

-rwxr-xr-- 1 app deploy 1200 May 23 10:00 deploy.sh

第一个字符表示文件类型。普通文件以 - 开头,目录以 d 开头,符号链接以 l 开头。

接下来的九个字符分为三个权限组:

  • 用户:文件所有者。
  • 组:文件所属组的成员。
  • 其他:其他所有人。

每组可以包含:

  • r:读取文件内容,或列出目录中的名称。
  • w:修改文件,或在目录中创建、删除、重命名条目。
  • x:执行文件,或进入目录。

目录的执行权限很重要。如果没有目录的 x 权限,你无法进入该目录或按名称访问其中的文件,即使你可以在其他地方列出一些元数据。

使用符号模式进行小幅更改

符号语法如下:

chmod [who][operator][permissions] path

who 可以是 u(用户)、g(组)、o(其他)或 a(所有)。操作符 + 表示添加,- 表示移除,= 表示精确设置。

为所有者添加脚本的可执行权限:

chmod u+x deploy.sh

允许组编辑共享文件:

chmod g+w shared_document.txt

移除组和其他人的写权限:

chmod go-w config.yml

将其他人的权限设置为只读,替换其现有权限:

chmod o=r project_plan.txt

符号模式很有用,因为它们只更改你指定的位。

使用数字模式设置完整权限集

数字模式通过一个命令设置用户、组和其他人的权限。每个权限都有一个值:

  • 读取:4
  • 写入:2
  • 执行:1

将每个组的值相加:

模式 含义
7 rwx
6 rw-
5 r-x
4 r--
0 ---

将普通文本文件设置为所有者可读写,其他人只读:

chmod 644 important_file.txt

将普通目录设置为所有者可管理,其他人可进入和读取:

chmod 755 public_assets

锁定私钥,仅所有者可读写:

chmod 600 private_key.pem

除非在临时测试环境中且了解风险,否则避免使用 777

chmod 777 scratch

777 允许任何本地用户读取、写入和执行或进入路径。在共享系统上,这通常不可接受。

区别处理文件和目录

文件和目录通常需要不同的权限。文件常用 644,目录常用 755。如果盲目运行以下命令,会使每个文件都可执行:

chmod -R 755 web_root/

对于 Web 目录,更安全的模式是:

find web_root -type d -exec chmod 755 {} +
find web_root -type f -exec chmod 644 {} +

然后仅为实际需要执行的脚本添加执行权限:

chmod 755 web_root/scripts/deploy.sh

谨慎使用特殊权限位

数字模式可以包含一个前导的第四位数字,用于特殊位:

名称 常见效果
4 SetUID 可执行文件以文件所有者的有效用户 ID 运行。
2 SetGID 可执行文件以文件组的有效组 ID 运行;对于目录,新条目继承目录的组。
1 粘滞位 对于目录,用户只能删除自己拥有的文件、目录所有者拥有的文件,或 root 可以删除的文件。

在共享项目目录上设置 SetGID 位,使新文件继承目录组:

chmod 2770 shared_group_files

在共享可写目录上设置粘滞位:

chmod 1777 /srv/shared-upload

经典示例是 /tmp,它是全局可写的,但受粘滞位保护。

谨慎使用可执行文件上的 SetUID 和 SetGID。如果程序可写、设计不良或接受不安全输入,它们可能造成严重的权限提升风险。许多类 Unix 系统出于安全原因也会忽略脚本上的 SetUID。

验证结果

更改权限后,检查它们:

ls -ld web_root web_root/index.html

需要数字模式时使用 stat

stat -c '%a %n' web_root/index.html

在 macOS 上,stat 格式不同:

stat -f '%Lp %N' web_root/index.html

要点总结

当你只想添加或移除一个权限时,使用符号模式的 chmod。当你想要精确设置完整模式时,使用数字模式的 chmod。谨慎处理递归更改,区分文件和目录,并在继续之前使用 ls -lstat 验证。