文件权限 #
一、权限基础概念 #
1.1 用户与用户组 #
Linux 是多用户系统,每个文件都有所有者和所属组:
bash
ls -l file.txt
# -rw-r--r-- 1 user group 1024 Mar 27 10:00 file.txt
# ↑ ↑ ↑
# 所有者 所属组 文件大小
用户类型:
- 所有者(Owner):文件的创建者
- 所属组(Group):文件所属的用户组
- 其他人(Others):既不是所有者也不是所属组的用户
1.2 权限类型 #
| 权限 | 文件含义 | 目录含义 | 数字表示 |
|---|---|---|---|
| r(读) | 查看文件内容 | 列出目录内容 | 4 |
| w(写) | 修改文件内容 | 创建/删除目录内文件 | 2 |
| x(执行) | 执行文件 | 进入目录 | 1 |
| -(无权限) | 无权限 | 无权限 | 0 |
1.3 权限表示法 #
符号表示法:
text
-rw-r--r--
| 位置 | 含义 |
|---|---|
| 第 1 位 | 文件类型(- 普通文件,d 目录,l 链接) |
| 第 2-4 位 | 所有者权限 |
| 第 5-7 位 | 所属组权限 |
| 第 8-10 位 | 其他人权限 |
数字表示法:
bash
rwx = 4 + 2 + 1 = 7
rw- = 4 + 2 + 0 = 6
r-x = 4 + 0 + 1 = 5
r-- = 4 + 0 + 0 = 4
1.4 常见权限组合 #
| 权限 | 数字 | 说明 |
|---|---|---|
| -rw------- | 600 | 只有所有者可读写 |
| -rw-r–r– | 644 | 所有者读写,其他人只读 |
| -rw-rw-rw- | 666 | 所有人可读写 |
| -rwx------ | 700 | 只有所有者可读写执行 |
| -rwxr-xr-x | 755 | 所有者全权限,其他人可读执行 |
| -rwxrwxrwx | 777 | 所有人全权限 |
| drwxr-xr-x | 755 | 目录标准权限 |
二、chmod - 修改权限 #
2.1 数字模式 #
bash
# 设置权限为 755
chmod 755 file.txt
# 设置权限为 644
chmod 644 file.txt
# 设置权限为 700
chmod 700 file.txt
# 递归设置目录权限
chmod -R 755 directory/
# 设置所有文件为 644
find . -type f -exec chmod 644 {} \;
# 设置所有目录为 755
find . -type d -exec chmod 755 {} \;
2.2 符号模式 #
bash
# 基本语法
chmod [ugoa][+-=][rwx] file
# u: 所有者
# g: 所属组
# o: 其他人
# a: 所有人(默认)
# +: 添加权限
# -: 移除权限
# =: 设置权限
添加权限:
bash
# 给所有者添加执行权限
chmod u+x file.txt
# 给所属组添加写权限
chmod g+w file.txt
# 给所有人添加执行权限
chmod +x file.txt
# 同时添加多个权限
chmod u+rwx,g+rx,o+rx file.txt
移除权限:
bash
# 移除所有人的写权限
chmod a-w file.txt
# 移除其他人的执行权限
chmod o-x file.txt
# 移除所有权限
chmod a-rwx file.txt
设置权限:
bash
# 设置所有者权限为 rwx
chmod u=rwx file.txt
# 设置所属组和其他人权限为 r-x
chmod go=rx file.txt
# 设置所有人权限
chmod a=rw file.txt
2.3 参考模式 #
bash
# 参考其他文件设置权限
chmod --reference=file1.txt file2.txt
# 复制目录权限
chmod -R --reference=source_dir/ dest_dir/
2.4 实用示例 #
bash
# 设置脚本可执行
chmod +x script.sh
# 设置私密文件
chmod 600 ~/.ssh/id_rsa
# 设置配置文件
chmod 644 /etc/nginx/nginx.conf
# 设置网站目录
chmod -R 755 /var/www/html/
# 设置上传目录可写
chmod 777 /var/www/html/uploads/
三、chown - 修改所有者 #
3.1 基本用法 #
bash
# 修改所有者
chown user file.txt
# 修改所有者和所属组
chown user:group file.txt
# 只修改所属组
chown :group file.txt
# 递归修改
chown -R user:group directory/
# 显示修改过程
chown -v user file.txt
# 只修改所有者匹配的文件
chown --from=olduser newuser file.txt
3.2 实用示例 #
bash
# 修改网站目录所有者
sudo chown -R www-data:www-data /var/www/html/
# 修改用户主目录
sudo chown -R user:user /home/user/
# 修改日志文件所有者
sudo chown root:adm /var/log/nginx/
# 修改 SSH 目录
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 644 ~/.ssh/known_hosts
四、chgrp - 修改所属组 #
4.1 基本用法 #
bash
# 修改所属组
chgrp group file.txt
# 递归修改
chgrp -R group directory/
# 显示修改过程
chgrp -v group file.txt
# 参考文件修改
chgrp --reference=file1.txt file2.txt
4.2 实用示例 #
bash
# 修改文件所属组
sudo chgrp developers project/
# 修改日志组
sudo chgrp -R adm /var/log/myapp/
# 修改共享目录组
sudo chgrp -R users /shared/
五、特殊权限 #
5.1 SUID(Set User ID) #
当可执行文件设置 SUID 时,执行者将获得文件所有者的权限。
bash
# 设置 SUID
chmod u+s file
# 数字方式(在原权限前加 4)
chmod 4755 file
# 查看设置结果
ls -l /usr/bin/passwd
# -rwsr-xr-x 1 root root ... /usr/bin/passwd
应用场景:
/usr/bin/passwd:普通用户修改密码需要 root 权限/usr/bin/sudo:普通用户以 root 身份执行命令
5.2 SGID(Set Group ID) #
对于文件: 执行者获得文件所属组的权限
对于目录: 在该目录下创建的文件继承目录的所属组
bash
# 设置 SGID
chmod g+s directory/
# 数字方式(在原权限前加 2)
chmod 2755 directory/
# 查看设置结果
ls -ld /shared/
# drwxrwsr-x 2 root users ... /shared/
应用场景:
- 共享目录:团队成员创建的文件自动继承组
- 协作项目:统一文件所属组
5.3 Sticky Bit #
设置 Sticky Bit 的目录,只有文件所有者才能删除自己的文件。
bash
# 设置 Sticky Bit
chmod +t directory/
# 数字方式(在原权限前加 1)
chmod 1777 directory/
# 查看设置结果
ls -ld /tmp/
# drwxrwxrwt 15 root root ... /tmp/
应用场景:
/tmp目录:所有用户可写,但只能删除自己的文件- 共享上传目录
5.4 特殊权限总结 #
| 特殊权限 | 数字 | 符号 | 说明 |
|---|---|---|---|
| SUID | 4 | u+s | 执行时获得所有者权限 |
| SGID | 2 | g+s | 执行时获得组权限/继承组 |
| Sticky | 1 | +t | 只能删除自己的文件 |
bash
# 组合使用
chmod 6755 file # SUID + SGID
chmod 7755 directory # SUID + SGID + Sticky
六、默认权限 #
6.1 umask - 默认权限掩码 #
bash
# 查看当前 umask
umask
# 输出: 0022
# 查看符号形式
umask -S
# 输出: u=rwx,g=rx,o=rx
# 设置 umask
umask 022
umask 077
6.2 umask 计算方法 #
text
默认权限 - umask = 实际权限
文件默认权限: 666
目录默认权限: 777
示例:
umask 022
文件: 666 - 022 = 644 (rw-r--r--)
目录: 777 - 022 = 755 (rwxr-xr-x)
6.3 设置永久 umask #
bash
# 编辑 ~/.bashrc
echo "umask 022" >> ~/.bashrc
# 或编辑 /etc/profile(全局)
sudo echo "umask 022" >> /etc/profile
七、访问控制列表(ACL) #
7.1 ACL 简介 #
ACL 提供更细粒度的权限控制,可以为特定用户或组设置权限。
7.2 getfacl - 查看 ACL #
bash
# 查看文件 ACL
getfacl file.txt
# 查看目录 ACL
getfacl directory/
# 递归查看
getfacl -R directory/
7.3 setfacl - 设置 ACL #
bash
# 给用户添加权限
setfacl -m u:username:rwx file.txt
# 给组添加权限
setfacl -m g:groupname:rx file.txt
# 移除用户权限
setfacl -x u:username file.txt
# 移除所有 ACL
setfacl -b file.txt
# 递归设置
setfacl -R -m u:user:rwx directory/
# 设置默认 ACL(对新文件生效)
setfacl -d -m u:user:rwx directory/
7.4 ACL 示例 #
bash
# 设置项目目录权限
setfacl -R -m u:developer:rwx project/
setfacl -R -m u:tester:rx project/
setfacl -R -m g:team:rwx project/
# 查看权限
getfacl project/
八、实践练习 #
8.1 练习一:基本权限操作 #
bash
# 1. 创建测试文件
touch test.txt
# 2. 查看默认权限
ls -l test.txt
# 3. 设置权限为 755
chmod 755 test.txt
# 4. 添加执行权限
chmod +x test.txt
# 5. 移除写权限
chmod a-w test.txt
8.2 练习二:所有者管理 #
bash
# 1. 创建测试目录
mkdir test_dir
# 2. 修改所有者
sudo chown $USER test_dir
# 3. 修改所属组
sudo chgrp $USER test_dir
# 4. 同时修改所有者和组
sudo chown $USER:$USER test_dir
# 5. 递归修改
mkdir -p test_dir/subdir
sudo chown -R $USER:$USER test_dir
8.3 练习三:特殊权限 #
bash
# 1. 创建共享目录
sudo mkdir /shared
# 2. 设置 SGID
sudo chmod 2775 /shared
# 3. 设置 Sticky Bit
sudo chmod +t /shared
# 4. 查看权限
ls -ld /shared
# 5. 测试效果
touch /shared/test_file
ls -l /shared/
8.4 练习四:ACL 权限 #
bash
# 1. 创建测试文件
touch acl_test.txt
# 2. 设置 ACL
setfacl -m u:$USER:rwx acl_test.txt
# 3. 查看 ACL
getfacl acl_test.txt
# 4. 移除 ACL
setfacl -b acl_test.txt
九、权限故障排查 #
9.1 常见问题 #
问题 1:Permission denied
bash
# 检查文件权限
ls -l file.txt
# 检查目录权限
ls -ld directory/
# 检查父目录权限
ls -ld $(dirname /path/to/file)
问题 2:无法删除文件
bash
# 检查目录权限(需要写权限)
ls -ld directory/
# 检查 Sticky Bit
ls -ld directory/
# 检查文件所有权
ls -l file.txt
问题 3:无法执行脚本
bash
# 检查执行权限
ls -l script.sh
# 添加执行权限
chmod +x script.sh
# 检查 shebang
head -1 script.sh
9.2 权限检查工具 #
bash
# 查找权限不安全的文件
find / -perm -002 -type f
# 查找 SUID 文件
find / -perm -4000
# 查找可写目录
find / -perm -0002 -type d
# 查找无主文件
find / -nouser -o -nogroup
十、小结 #
本章学习了 Linux 文件权限系统的核心概念和管理命令。
关键要点:
- 理解 rwx 权限对文件和目录的不同含义
- 掌握 chmod 的数字和符号两种模式
- 使用 chown 和 chgrp 管理文件所有权
- 了解 SUID、SGID、Sticky Bit 特殊权限
- 使用 ACL 实现细粒度权限控制
下一章预告: 文件查看 - 学习查看文件内容的各种命令和方法。
最后更新:2026-03-27