文件权限管理 #
权限基础 #
权限类型 #
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
小结 #
通过本节学习,你应该掌握:
- 权限基础:读、写、执行权限的含义
- chmod:数字模式和符号模式修改权限
- chown:修改文件所有者和组
- chgrp:修改文件所属组
- umask:设置默认权限掩码
- ACL:高级访问控制列表
- 权限排查:常见权限问题解决
下一步,我们将学习文件搜索命令。
最后更新:2026-04-11