Linux 权限如何工作
Linux 中的每个文件和目录都有三组权限,分别对应三种用户类型:
-rwxr-xr-- 1 alice developers 4096 May 26 script.sh
^^^ ^^^ ^^^
| | └── 其他人(所有其他用户)
| └── 组("developers" 组的成员)
└── 所有者(alice)
每组有三个位:读 (r)、写 (w)、执行 (x)。
| 符号 | 文件 | 目录 |
|---|---|---|
| r(读) | 读取文件内容 | 列出目录内容(ls) |
| w(写) | 修改文件 | 在目录内创建/删除文件 |
| x(执行) | 作为程序运行 | 进入目录(cd)并访问内容 |
第一个字符表示类型:- = 普通文件,d = 目录,l = 符号链接。

数字(八进制)表示法
每组权限映射为一个 3 位数字:
| 二进制 | 八进制 | 权限 |
|---|---|---|
| 000 | 0 | ---(无) |
| 001 | 1 | --x |
| 010 | 2 | -w- |
| 011 | 3 | -wx |
| 100 | 4 | r-- |
| 101 | 5 | r-x |
| 110 | 6 | rw- |
| 111 | 7 | rwx |
chmod 755 script.sh 表示:
- 所有者:7 = rwx(读、写、执行)
- 组:5 = r-x(读、执行)
- 其他人:5 = r-x(读、执行)
常见权限模式
chmod 644 file.txt # -rw-r--r-- 普通文件:所有者编辑,其他人只读
chmod 755 script.sh # -rwxr-xr-x 脚本:所有者运行,其他人可执行
chmod 700 private.key # -rwx------ 敏感文件:仅所有者
chmod 664 shared.txt # -rw-rw-r-- 协作文件:组可编辑
chmod 775 shared-dir/ # drwxrwxr-x 共享目录:组可添加/删除
chmod 750 config/ # drwxr-x--- 应用配置:组可读,其他人无权限
Web 服务器模式
# 静态 Web 文件——Web 服务器(www-data)可读
find /var/www/html -type f -exec chmod 644 {} \; # 文件:所有者写,服务器读
find /var/www/html -type d -exec chmod 755 {} \; # 目录:可遍历
# 上传目录——Web 服务器可写
chmod 755 /var/www/html/uploads
chown www-data:www-data /var/www/html/uploads
# 配置文件——Web 服务器不可读
chmod 600 .env
chmod 600 config/database.php
符号表示法
chmod u+x script.sh # 为所有者添加执行权限(u = user/owner)
chmod g-w shared.txt # 从组移除写权限(g = group)
chmod o-rwx private/ # 从其他人移除所有权限(o = others)
chmod a+r public.txt # 为所有人添加读权限(a = all)
chmod u+x,g-w file # 同时进行多项更改
chmod go=r file # 将组和其他人的权限精确设置为只读

更改所有权:chown 和 chgrp
chown alice file.txt # 将所有者更改为 alice
chown alice:developers file.txt # 更改所有者和组
chown :developers file.txt # 仅更改组
chown -R alice:alice /home/alice/ # 递归(-R)
chgrp www-data /var/www/ # 将组更改为 www-data
特殊权限位
Setuid(4000)
当设置在可执行文件上时,它将以文件所有者的身份运行,而不是执行它的用户。passwd、sudo 等系统工具使用此权限。
chmod 4755 /usr/bin/example # -rwsr-xr-x (所有者执行位置显示 's')
ls -la /usr/bin/passwd # -rwsr-xr-x 1 root root ...
Setgid(2000)
在可执行文件上:以文件所属组运行。在目录上:新文件继承目录的组,而不是创建者的主组。
chmod 2755 /shared-dir/ # drwxr-sr-x (新文件继承组)
适用于共享项目目录,其中所有文件应属于项目组。

粘滞位(1000)
在目录上:用户只能删除自己拥有的文件,即使他们对目录有写权限。用于 /tmp。
chmod 1777 /tmp # drwxrwxrwt (其他人执行位置显示 't')
ls -la / # /tmp 显示 'drwxrwxrwt'
完整特殊位示例
chmod 6755 file # setuid + setgid + 755
chmod 7777 file # setuid + setgid + sticky + 777(很少合适)
umask:默认权限掩码
新文件和目录不会获得完整权限——umask 从默认权限中减去权限。
umask # 显示当前 umask(通常为 022 或 002)
umask 022 # 设置 umask
# 应用 umask 前的默认权限:
# 文件:666(rw-rw-rw-)
# 目录:777(rwxrwxrwx)
# 使用 umask 022:
# 文件:666 - 022 = 644(rw-r--r--)
# 目录:777 - 022 = 755(rwxr-xr-x)
# 使用 umask 002(常见于组协作):
# 文件:666 - 002 = 664(rw-rw-r--)
# 目录:777 - 002 = 775(rwxrwxr-x)
按权限查找文件
# 其他人可写的文件(潜在安全风险)
find /var/www -type f -perm -o+w
# 由 root 拥有且设置了 setuid 的可执行文件
find / -type f -perm -4000 2>/dev/null
# 没有所有者的文件
find / -nouser 2>/dev/null
# 全局可写的目录
find / -type d -perm -o+w 2>/dev/null
ACL:细粒度访问控制
对于比所有者/组/其他人更复杂的场景,使用 POSIX ACL:
# 授予特定用户读权限
setfacl -m u:bob:r-- file.txt
# 授予特定组写权限
setfacl -m g:contractors:rw- project/
# 查看 ACL
getfacl file.txt
# 移除所有 ACL 条目
setfacl -b file.txt
安全清单
# ✅ 敏感文件
chmod 600 ~/.ssh/id_rsa # 私钥
chmod 644 ~/.ssh/id_rsa.pub # 公钥
chmod 700 ~/.ssh/ # SSH 目录
# ✅ Web 应用
chmod 644 /var/www/html/*.php # PHP 文件:Web 服务器不可执行
chmod 755 /var/www/html/ # Web 根目录:可遍历
chmod 600 /var/www/.env # 环境变量
# ❌ 切勿在生产环境中执行以下操作
chmod 777 /var/www/html/ # 全局可写的 Web 根目录
chmod 777 uploads/ # 全局可写的上传目录
→ 使用 chmod 计算器 即时计算 chmod 权限值。