文件权限管理 #

权限基础 #

权限类型 #

text
┌─────────────────────────────────────────────────────────────┐
│                      文件权限类型                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   权限    字符    数字    对文件的含义      对目录的含义       │
│   ─────────────────────────────────────────────────────     │
│   读      r       4       查看文件内容      列出目录内容      │
│   写      w       2       修改文件内容      创建/删除文件     │
│   执行    x       1       执行文件          进入目录          │
│   无权限  -       0       无任何权限        无任何权限        │
│                                                             │
└─────────────────────────────────────────────────────────────┘

权限分类 #

text
┌─────────────────────────────────────────────────────────────┐
│                      权限分类                                │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   -rwxr-xr--  1  user  group  1234  Apr 11  file.txt       │
│    │├──┤├──┤├──┤                                           │
│    │ │  │ │  │ │                                            │
│    │ │  │ │  │ └── 其他用户权限 (other): r-- (4)            │
│    │ │  │ │  └── 组用户权限 (group): r-x (5)                │
│    │ │  │ └── 所有者权限 (user/owner): rwx (7)              │
│    │ │  └── 权限区域                                        │
│    │ └── 文件类型                                           │
│    └── 文件类型标识                                         │
│                                                             │
│   权限计算示例:                                             │
│   rwx = 4 + 2 + 1 = 7                                       │
│   r-x = 4 + 0 + 1 = 5                                       │
│   r-- = 4 + 0 + 0 = 4                                       │
│                                                             │
└─────────────────────────────────────────────────────────────┘

常见权限组合 #

数字 字符 说明
777 rwxrwxrwx 所有人完全权限
755 rwxr-xr-x 所有者全权限,其他人读和执行
700 rwx------ 只有所有者有权限
644 rw-r–r– 所有者读写,其他人只读
600 rw------- 只有所有者可读写
711 rwx–x–x 所有者全权限,其他人只能执行

chmod - 修改权限 #

数字模式 #

bash
# 设置权限为 755
$ chmod 755 script.sh

# 设置权限为 644
$ chmod 644 file.txt

# 设置权限为 700
$ chmod 700 private_dir/

# 递归修改
$ chmod -R 755 public_html/

# 同时修改多个文件
$ chmod 644 *.txt

符号模式 #

bash
# u = user (所有者)
# g = group (组)
# o = other (其他)
# a = all (所有人)

# 添加权限 (+)
$ chmod u+x script.sh      # 所有者添加执行权限
$ chmod g+w file.txt       # 组添加写权限
$ chmod o+r file.txt       # 其他人添加读权限
$ chmod a+x script.sh      # 所有人添加执行权限

# 移除权限 (-)
$ chmod u-w file.txt       # 所有者移除写权限
$ chmod g-x script.sh      # 组移除执行权限
$ chmod o-r file.txt       # 其他人移除读权限

# 设置权限 (=)
$ chmod u=rwx file.txt     # 所有者设置为 rwx
$ chmod go=r file.txt      # 组和其他设置为只读
$ chmod a=r file.txt       # 所有人设置为只读

# 组合使用
$ chmod u+rwx,g+rx,o+r file.txt
$ chmod ug=rw,o=r file.txt
$ chmod u=rwx,go=rx script.sh

常用选项 #

bash
# -v 显示详细信息
$ chmod -v 755 script.sh
mode of 'script.sh' changed from 0644 (rw-r--r--) to 0755 (rwxr-xr-x)

# -c 只显示改变的文件
$ chmod -c 755 script.sh

# -R 递归修改
$ chmod -R 755 directory/

# --reference 参考其他文件的权限
$ chmod --reference=reference.txt target.txt

# -f 静默模式
$ chmod -f 755 nonexistent

特殊权限 #

bash
# SUID (Set User ID) - 4
# 执行时以文件所有者身份运行
$ chmod u+s /usr/bin/passwd
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root ... /usr/bin/passwd

# SGID (Set Group ID) - 2
# 目录中创建的文件继承目录的组
$ chmod g+s /shared/project
$ ls -ld /shared/project
drwxrwsr-x 2 user group ... /shared/project

# Sticky Bit - 1
# 目录中的文件只能由所有者删除
$ chmod +t /tmp
$ ls -ld /tmp
drwxrwxrwt 15 root root ... /tmp

# 数字方式设置特殊权限
$ chmod 4755 script.sh    # SUID + 755
$ chmod 2755 directory/   # SGID + 755
$ chmod 1777 /tmp         # Sticky + 777

# 符号方式
$ chmod u+s file          # SUID
$ chmod g+s directory     # SGID
$ chmod +t directory      # Sticky Bit

权限示例 #

bash
# 脚本文件
$ chmod 755 script.sh      # 可执行脚本

# 配置文件
$ chmod 644 config.ini     # 配置文件

# 私钥文件
$ chmod 600 id_rsa         # SSH 私钥

# 公钥文件
$ chmod 644 id_rsa.pub     # SSH 公钥

# Web 目录
$ chmod 755 public_html/
$ chmod 644 public_html/*.html

# 日志目录
$ chmod 755 /var/log/app/
$ chmod 644 /var/log/app/*.log

# 共享目录
$ chmod 1777 /shared/      # Sticky Bit

chown - 修改所有者 #

基本用法 #

bash
# 修改所有者
$ chown user file.txt

# 修改所有者和组
$ chown user:group file.txt

# 只修改组
$ chown :group file.txt

# 递归修改
$ chown -R user:group directory/

常用选项 #

bash
# -R 递归修改
$ chown -R user:group directory/

# -v 显示详细信息
$ chown -v user file.txt
changed ownership of 'file.txt' from root to user

# -c 只显示改变的文件
$ chown -cv user directory/

# --reference 参考其他文件
$ chown --reference=reference.txt target.txt

# --from 只修改匹配的所有者
$ chown --from=root user file.txt

# -h 修改符号链接本身
$ chown -h user:group symlink

实用示例 #

bash
# 修改 Web 目录所有者
$ sudo chown -R www-data:www-data /var/www/html

# 修改用户家目录
$ sudo chown -R user:user /home/user

# 修改日志文件所有者
$ sudo chown -R nginx:nginx /var/log/nginx

# 修改配置文件所有者
$ sudo chown root:root /etc/nginx/nginx.conf

# 批量修改
$ find . -type f -exec chown user:group {} \;

chgrp - 修改所属组 #

基本用法 #

bash
# 修改组
$ chgrp group file.txt

# 递归修改
$ chgrp -R group directory/

# 常用选项
$ chgrp -v group file.txt
$ chgrp -R group directory/
$ chgrp --reference=reference.txt target.txt
$ chgrp -h group symlink

chgrp vs chown #

bash
# chgrp 只能修改组
$ chgrp developers file.txt

# chown 可以同时修改所有者和组
$ chown user:developers file.txt

# chown 只修改组
$ chown :developers file.txt

# 推荐使用 chown,功能更全面

umask - 默认权限掩码 #

基本概念 #

text
┌─────────────────────────────────────────────────────────────┐
│                      umask 工作原理                          │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   默认权限 - umask = 实际权限                                │
│                                                             │
│   文件默认权限:666 (rw-rw-rw-)                              │
│   目录默认权限:777 (rwxrwxrwx)                              │
│                                                             │
│   示例(umask = 022):                                      │
│   文件:666 - 022 = 644 (rw-r--r--)                          │
│   目录:777 - 022 = 755 (rwxr-xr-x)                          │
│                                                             │
└─────────────────────────────────────────────────────────────┘

查看和设置 #

bash
# 查看当前 umask
$ umask
0022

# 查看符号形式
$ umask -S
u=rwx,g=rx,o=rx

# 设置 umask
$ umask 022
$ umask 077

# 在 ~/.bashrc 中设置
$ echo "umask 022" >> ~/.bashrc

常见 umask 值 #

umask 文件权限 目录权限 使用场景
022 644 755 默认值,组和其他人只读
027 640 750 组可读,其他人无权限
077 600 700 只有所有者有权限
002 664 775 组可写,共享目录

实际应用 #

bash
# 安全设置
$ umask 077    # 创建的文件只有所有者可访问

# 共享项目设置
$ umask 002    # 组成员可以修改文件

# 临时修改
$ (umask 077; touch secret.txt)
# 只影响这条命令

stat - 查看权限详情 #

bash
# 查看文件权限
$ stat -c "%A %a %n" file.txt
-rw-r--r-- 644 file.txt

# 查看所有者和组
$ stat -c "%U:%G %n" file.txt
user:group file.txt

# 查看完整信息
$ stat file.txt

ACL - 访问控制列表 #

查看 ACL #

bash
# 查看 ACL
$ getfacl file.txt
# file: file.txt
# owner: user
# group: group
user::rw-
user:alice:rw-
group::r--
mask::rw-
other::r--

# 查看 ACL 选项
$ ls -la
-rw-rw-r--+ 1 user group 0 Apr 11 file.txt
# + 表示有 ACL

设置 ACL #

bash
# 给用户添加权限
$ setfacl -m u:alice:rw file.txt

# 给组添加权限
$ setfacl -m g:developers:rx file.txt

# 设置默认 ACL(目录)
$ setfacl -d -m g:developers:rx directory/

# 删除 ACL
$ setfacl -x u:alice file.txt

# 清除所有 ACL
$ setfacl -b file.txt

# 复制 ACL
$ getfacl source.txt | setfacl --set-file=- target.txt

# 递归设置
$ setfacl -R -m g:developers:rx directory/

ACL 应用场景 #

bash
# 项目目录权限
$ setfacl -R -m g:developers:rwx /project
$ setfacl -R -d -m g:developers:rwx /project

# 单个用户权限
$ setfacl -m u:alice:rw /project/config.ini

# Web 服务器权限
$ setfacl -R -m u:www-data:rwx /var/www/html

权限问题排查 #

常见问题 #

bash
# 权限被拒绝
$ ./script.sh
bash: ./script.sh: Permission denied
$ chmod +x script.sh

# 无法进入目录
$ cd directory/
bash: cd: directory/: Permission denied
$ chmod +x directory/

# 无法修改文件
$ echo "test" >> file.txt
bash: file.txt: Permission denied
$ chmod u+w file.txt

# 无法删除文件
$ rm file.txt
rm: cannot remove 'file.txt': Permission denied
# 检查目录权限
$ ls -ld .

排查步骤 #

bash
# 1. 检查文件权限
$ ls -la file.txt

# 2. 检查目录权限
$ ls -ld .

# 3. 检查所有者
$ stat file.txt

# 4. 检查 ACL
$ getfacl file.txt

# 5. 检查 SELinux/AppArmor(如果启用)
$ getenforce    # SELinux
$ aa-status     # AppArmor

小结 #

通过本节学习,你应该掌握:

  1. 权限基础:读、写、执行权限的含义
  2. chmod:数字模式和符号模式修改权限
  3. chown:修改文件所有者和组
  4. chgrp:修改文件所属组
  5. umask:设置默认权限掩码
  6. ACL:高级访问控制列表
  7. 权限排查:常见权限问题解决

下一步,我们将学习文件搜索命令。

最后更新:2026-04-11