Unix文件权限几乎会让每个人在某个时刻感到困惑。这些晦涩的 rwxr-xr-x 在 ls -la 输出,三位八进制数字,权限集之间的区别 chmod, chown,并且 chgrp —— 这些内容很难全部记住。这是一个你可以收藏的参考资料。
如果你现在需要计算一个值,请使用 chmod 计算器 —— 你可以通过视觉方式选择权限,它会生成正确的八进制或符号表示法。
权限模型
每个文件和目录都有三个权限集:
- 所有者 (u) —— 拥有该文件的用户
- 组 (g) —— 属于该文件分配组的成员
- 其他人 (o) —— 其他人
每个权限集包含三个位: 读取 (r = 4), 写入 (w = 2), 执行 (x = 1)。将它们相加以获得该权限集的八进制数字。因此 rwx = 4+2+1 = 7, r-x = 4+0+1 = 5, r-- = 4+0+0 = 4.
像 755 这样的三位八进制数表示:所有者获得7(rwx),组获得5(r-x),其他人获得5(r-x)。
读取 ls -la 输出
-rwxr-xr-x 1 thien www-data 4096 Apr 10 10:00 deploy.sh
drwxr-x--- 2 thien www-data 4096 Apr 10 09:00 private/
第一个字符是文件类型: - 对于普通文件, d 对于目录, l 对于符号链接。接下来的九个字符是按顺序排列的三个权限集——所有者、组、其他人——每个权限集三个字符。
常见的 chmod 值
| 价值 | 所有者 | 团体 | 其他的 | 典型用途 |
|---|---|---|---|---|
| 644 | rw- | r– | r– | 网页文件(HTML、CSS、PHP) |
| 755 | rwx | r-x | r-x | 目录、shell脚本 |
| 600 | rw- | — | — | SSH密钥、私有配置文件 |
| 640 | rw- | r– | — | 配置文件(组可读) |
| 664 | rw- | rw- | r– | 共享项目文件 |
| 700 | rwx | — | — | 私有脚本 |
| 777 | rwx | rwx | rwx | 不要使用 —— 给所有人完全控制权 |
为什么777是错误的
chmod 777 是常见的“稍后修复”快捷方式,往往会长期存在。它会给予系统上的每个用户——在Web环境中,任何PHP进程——对文件的写入权限。在共享服务器上这会成为一个安全漏洞,在VPS上则显得粗心大意。应通过 chown 反而。
chmod 与 chown 与 chgrp
| 命令 | 它改变了什么 |
|---|---|
chmod | 文件的读取/写入/执行权限 |
chown | 文件的所有用户(以及可选的组) |
chgrp | 文件所属的组 |
chmod 644 index.php # Set permissions
chown www-data:www-data . # Change owner and group
chgrp developers config.yml # Change group only
粘滞位、setUID、setGID
这些由一个额外的八进制数字(作为前缀)或符号表示法中的字母替换表示。
- 粘滞位 (1 / t) —— 在目录中,只有文件所有者才能删除自己的文件。用于
/tmp. - setUID (4 / s 在所有者 x 上) —— 文件以所有者身份运行,而不是执行用户。用于
sudo且passwd. - setGID (2 / s 在组 x 上) —— 对于文件:以文件所属的组运行。对于目录:新文件继承目录的组,这对共享项目目录非常有用。
chmod +t /shared/dir # Add sticky bit
chmod 1755 /shared/dir # Sticky bit + standard 755
chmod g+s /var/www/project/ # setGID on a directory
在 ls -l 输出中,目录上的setGID看起来像 drwxrwsr-x;粘滞位看起来像 drwxrwxrwt.
递归权限:小心使用 -R
chmod -R 对目录及其内部所有内容应用权限。常见的错误是使用 755 递归地为所有文件设置执行权限,即使它们并不需要。一个更安全的方法是将目录和文件分开处理:
# Apply 755 to directories, 644 to files
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;
解决常见的权限问题
# Web server can't read your files (403 Forbidden)
chown -R www-data:www-data /var/www/html
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;
# SSH key refused (WARNING: UNPROTECTED PRIVATE KEY FILE)
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 700 ~/.ssh
# Script won't execute (Permission denied)
chmod +x deploy.sh
# PHP can't write to uploads directory
chown www-data:www-data wp-content/uploads
chmod 755 wp-content/uploads
跳过脑力计算
在脑海中翻译 rwxr-x--- 到 750 是可行的,但很繁琐。在 IO Tools 的 chmod 计算器 让你通过视觉方式切换权限,并立即显示八进制值和符号表示法——当你需要在运行 chmod -R 之前确保正确时非常有用。
