一、权限基础概念
1.1 权限类型
Linux 中每个文件都有三种权限类型:
r (Read)
读取权限
文件:可查看内容
目录:可列出文件
w (Write)
写入权限
文件:可修改内容
目录:可创建/删除文件
x (Execute)
执行权限
文件:可运行程序
目录:可进入目录
1.2 用户分类
每种权限针对三类用户:
- u (user/owner) - 文件所有者
- g (group) - 文件所属组
- o (others) - 其他用户
1.3 查看权限
$ ls -l file.txt
-rwxr-xr-- 1 alice developers 4096 Apr 12 10:30 file.txt
↑ ↑ ↑ ↑ ↑
权限 链接数 所有者 组 大小
权限解读:
第 1 位:文件类型(- 文件,d 目录,l 链接)
2-4 位:所有者权限(rwx)
5-7 位:组权限(r-x)
8-10 位:其他用户权限(r--)
二、chmod 命令 - 修改权限
2.1 数字模式(推荐)
每个权限对应一个数字:r=4, w=2, x=1
| 权限组合 | 计算 | 数字 |
| rwx | 4+2+1 | 7 |
| rw- | 4+2+0 | 6 |
| r-x | 4+0+1 | 5 |
| r-- | 4+0+0 | 4 |
| -wx | 0+2+1 | 3 |
| -w- | 0+2+0 | 2 |
| --x | 0+0+1 | 1 |
| --- | 0+0+0 | 0 |
# 常用权限设置
chmod 755 script.sh # 所有者全权,其他人读 + 执行
chmod 644 file.txt # 所有者读写,其他人只读
chmod 600 secret.key # 仅所有者读写(最安全)
chmod 777 public/ # 所有人全权(⚠️ 危险,不推荐)
chmod 444 readonly.txt # 所有人只读(不可修改)
# 三位数字含义
chmod 644 file.txt
↑↑↑
||└─ 其他用户权限(4 = r--)
|└── 组权限(4 = r--)
└──── 所有者权限(6 = rw-)
2.2 符号模式
# 添加权限
chmod +x script.sh # 所有人添加执行权限
chmod u+x script.sh # 所有者添加执行权限
chmod g+w file.txt # 组添加写权限
chmod o+r file.txt # 其他人添加读权限
# 移除权限
chmod -x script.sh # 移除所有人执行权限
chmod u-w file.txt # 所有者移除写权限
chmod go-w file.txt # 组和其他人移除写权限
# 设置权限
chmod u=rwx,g=rx,o=r file # 精确设置所有权限
chmod a=r file.txt # 所有人只读
# 组合操作
chmod u+rwx,g+rx,o+r file # 多个操作逗号分隔
2.3 递归修改
chmod -R 755 /var/www/ # 递归修改目录权限
chmod -R 644 /var/www/* # 递归修改文件权限
💡 最佳实践:
- 脚本文件:
755(所有者可写,其他人只读 + 执行)
- 普通文件:
644(所有者可写,其他人只读)
- 敏感文件:
600(仅所有者可读写)
- 公开目录:
755(所有人可进入)
三、chown 命令 - 修改所有者
# 修改所有者
chown alice file.txt # 修改文件所有者为 alice
chown -R alice dir/ # 递归修改目录所有者
# 修改所属组
chgrp developers file.txt # 修改组为 developers
chown :developers file.txt # 同上(推荐)
# 同时修改所有者和组
chown alice:developers file.txt
chown -R alice:developers /var/www/
# 从另一个文件复制所有权
chown --reference=file1.txt file2.txt
实际应用场景
# Web 服务器文件权限
chown -R www-data:www-data /var/www/html
chmod -R 755 /var/www/html
chmod -R 644 /var/www/html/*
# SSH 密钥权限(必须严格)
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
# 脚本文件权限
chown root:root /usr/local/bin/myscript.sh
chmod 755 /usr/local/bin/myscript.sh
四、umask - 默认权限掩码
4.1 理解 umask
umask 决定新建文件/目录的默认权限:
- 文件默认权限:
666 - umask
- 目录默认权限:
777 - umask
# 查看当前 umask
umask
0022
# 计算默认权限
文件:666 - 022 = 644 (rw-r--r--)
目录:777 - 022 = 755 (rwxr-xr-x)
# 临时修改 umask
umask 002 # 新建文件 664,目录 775(组可写)
umask 077 # 新建文件 600,目录 700(仅自己)
umask 007 # 新建文件 660,目录 770(组内共享)
# 永久修改(添加到 ~/.bashrc)
echo "umask 022" >> ~/.bashrc
五、特殊权限
5.1 SUID (Set User ID)
使程序以文件所有者权限运行:
chmod u+s /usr/bin/passwd # 设置 SUID
chmod 4755 /path/to/file # 数字模式(4 表示 SUID)
ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root ... # 注意 s 位置
5.2 SGID (Set Group ID)
目录中创建的文件继承目录的组:
chmod g+s /shared/dir # 设置 SGID
chmod 2775 /shared/dir # 数字模式(2 表示 SGID)
ls -ld /shared/dir
drwxrwsr-x 2 root shared ...
5.3 Sticky Bit
目录中只有文件所有者可删除文件:
chmod +t /tmp # 设置粘滞位
chmod 1777 /tmp # 数字模式(1 表示 Sticky)
ls -ld /tmp
drwxrwxrwt 10 root root ... # 注意 t 位置
⚠️ 安全警告:
- SUID 程序可能被利用提权,谨慎使用
- 不要对脚本设置 SUID(极不安全)
- 定期检查 SUID 文件:
find / -perm -4000
六、权限故障排查
6.1 无法执行脚本
# 问题:Permission denied
./script.sh
# 解决:添加执行权限
chmod +x script.sh
./script.sh
# 或者用解释器执行
bash script.sh
6.2 无法写入文件
# 问题:Permission denied
echo "test" > file.txt
# 检查权限
ls -l file.txt
# 检查所有者
ls -ln file.txt # 显示数字 UID/GID
# 解决:修改权限或所有者
chmod u+w file.txt
# 或
chown $(whoami) file.txt
6.3 无法进入目录
# 问题:Permission denied
cd /restricted/
# 检查目录权限
ls -ld /restricted/
# 需要 x 权限才能进入
chmod u+x /restricted/
七、安全最佳实践
- 最小权限原则 - 只授予必要权限
- 敏感文件 600 - SSH 密钥、配置文件、密码文件
- 脚本文件 755 - 所有者可写,其他人只读 + 执行
- Web 文件 644 - 防止 Web 服务器被利用修改文件
- 定期审计 - 检查 SUID 文件和 777 权限
- 避免 777 - 除非绝对必要且理解风险
# 安全检查命令
find / -perm -4000 2>/dev/null # 查找 SUID 文件
find / -perm -2000 2>/dev/null # 查找 SGID 文件
find / -perm -0002 2>/dev/null # 查找全局可写文件
find / -type f -perm 777 2>/dev/null # 查找 777 文件
💡 记忆口诀:
- 文件默认 644,目录默认 755
- 脚本要执行,+x 不能少
- 密钥最敏感,600 保护好
- Web 服务器,644 最安全