使用 '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 -l 或 stat 验证。