文件权限 #

一、权限基础概念 #

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 文件权限系统的核心概念和管理命令。

关键要点:

  1. 理解 rwx 权限对文件和目录的不同含义
  2. 掌握 chmod 的数字和符号两种模式
  3. 使用 chown 和 chgrp 管理文件所有权
  4. 了解 SUID、SGID、Sticky Bit 特殊权限
  5. 使用 ACL 实现细粒度权限控制

下一章预告: 文件查看 - 学习查看文件内容的各种命令和方法。

最后更新:2026-03-27