🔐 Linux 文件权限详解

chmod / chown / umask 完全指南 · 2026-04-12

一、权限基础概念

1.1 权限类型

Linux 中每个文件都有三种权限类型:

r (Read)

读取权限
文件:可查看内容
目录:可列出文件

w (Write)

写入权限
文件:可修改内容
目录:可创建/删除文件

x (Execute)

执行权限
文件:可运行程序
目录:可进入目录

1.2 用户分类

每种权限针对三类用户:

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

权限组合计算数字
rwx4+2+17
rw-4+2+06
r-x4+0+15
r--4+0+04
-wx0+2+13
-w-0+2+02
--x0+0+11
---0+0+00
# 常用权限设置 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 决定新建文件/目录的默认权限:

# 查看当前 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/

七、安全最佳实践

  1. 最小权限原则 - 只授予必要权限
  2. 敏感文件 600 - SSH 密钥、配置文件、密码文件
  3. 脚本文件 755 - 所有者可写,其他人只读 + 执行
  4. Web 文件 644 - 防止 Web 服务器被利用修改文件
  5. 定期审计 - 检查 SUID 文件和 777 权限
  6. 避免 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 最安全
← 返回首页