Are you an LLM? You can read better optimized documentation at /fe/linux/file-permission.md for this page in Markdown format
Linux 文件权限管理 | chmod、chown 命令完全解析与最佳实践
Linux 操作系统中对权限的管理很严格。Linux 系统中不仅是对用户与组根据 UID,GID 进行了管理,还对 Linux 系统中的文件,按照用户与组进行分类,针对不同的群体进行了权限管理,用他来确定谁能通过何种方式和目录进行访问和操作。
理解并正确配置文件权限是 Linux 系统安全的基石。本文将全面解析 Linux 权限系统的工作原理和实际应用。
Linux 的文件权限详解
权限共有 10 个字符,我们将它分为 4 大部分来理解:
表示文件的类型
- | 表示是一个文件 |
|---|---|
d | 表示是一个目录 |
l | 表示是一个连接(理解为快捷方式) |
c | 字符设备文件 |
b | 块设备文件 |
s | socket 文件 |
p | 命名管道文件 |
用户组类型
| 缩写 | 用户组 | 类型 |
|---|---|---|
u | owner | 属主 :当前用户具有的对该文件的权限 |
g | group | 当前组内其他用户具有对该文件的权限 |
o | other | 其他组的用户具有的对该文件的权限 |
a | all | 所有用户(u+g+o) |
权限类型
r:Read读w:Write写x:execute执行-:无权限
针对目录加执行权限,文件不加执行权限(因文件具备执行权限有安全隐患)
针对文件和目录来说,r,w,x 有着不同的作用和含义
| 命令 | 针对文件 | 针对目录 |
|---|---|---|
r | 读取文件内容 | 查看目录下的文件列表 |
w | 修改文件内容 | 删除和创建目录下的文件 |
x | 执行权限对除二进制程序以外的文件没什么意义 | 可以 cd 进入目录,能查看目录中文件的详细属性,能访问目录下文件内容(基础权限) |
TIP
root 账户不受文件权限的读写限制,执行权限受限制
权限位完整解析
bash
# 查看文件权限
ls -l filename
# 示例输出
-rwxr-xr-- 1 user group 1024 Jan 15 10:30 script.sh
^ ^^^ ^^^ ^^^
| | | |
| | | └─ 其他用户权限 (r--)
| | └───── 组权限 (r-x)
| └───────── 所有者权限 (rwx)
└─────────── 文件类型 (-)| 权限项 | 文件类型 | 读 | 写 | 执行 | 读 | 写 | 执行 | 读 | 写 |
| 字符表示 | (d|l|c|s|p) | (r) | (w) | (x) | (r) | (w) | (x) | (r) | (w) |
| 数字表示 | 4 | 2 | 1 | 4 | 2 | 1 | 4 | 2 | |
| 权限分配 | 文件所有者 | 文件所属组用户 | 其他用户 |
用户获取文件权限的顺序:先看是否为所有者,如果是,则后面权限不看;再看是否为所属组,如果是,则后面权限不看。
权限的数字表示法
权限值计算
每个权限都有对应的数值:
r(读) = 4w(写) = 2x(执行) = 1-(无) = 0
常见权限组合
| 权限字符串 | 计算方式 | 八进制值 | 说明 |
|---|---|---|---|
rwx | 4+2+1 | 7 | 完全控制 |
rw- | 4+2+0 | 6 | 读写 |
r-x | 4+0+1 | 5 | 读执行 |
r-- | 4+0+0 | 4 | 只读 |
-wx | 0+2+1 | 3 | 写执行 |
-w- | 0+2+0 | 2 | 只写 |
--x | 0+0+1 | 1 | 只执行 |
--- | 0+0+0 | 0 | 无权限 |
三位权限码示例
bash
# 755 = rwxr-xr-x
chmod 755 script.sh
# 所有者:rwx (7)
# 组:r-x (5)
# 其他:r-x (5)
# 644 = rw-r--r--
chmod 644 file.txt
# 所有者:rw- (6)
# 组:r-- (4)
# 其他:r-- (4)
# 600 = rw-------
chmod 600 private.key
# 所有者:rw- (6)
# 组:--- (0)
# 其他:--- (0)修改文件权限
chown 是 change owner 的意思,主要作用就是改变文件或者目录所有者。
chmod | 修改文件和文件夹读写执行属性。使用权限:所有使用者 |
|---|---|
chown | 修改文件和文件夹的用户和用户组属性。使用权限:root |
chmod 命令详解
mode 方式(符号模式)
bash
chmod who opt per filewho | u g o a(all) (u 用户 user,g 用户组 group,o 其他用户,a 所有用户默认) |
|---|---|
opt | + 添加某个权限 - 取消某个权限 = 赋予权限 |
per | r w x X |
示例:
bash
chmod u=rwx,g=r a.txt
chmod u+x,g+w,o+w test.log #r 读,w 写, x 执行
# 更多示例
chmod +x script.sh # 所有人添加执行权限
chmod u-w file.txt # 移除所有者写权限
chmod go=r file.txt # 组和其他用户设为只读
chmod a+x program # 所有人添加执行权限数字方式设置权限
命令语法
使用数字方式修改文件权限的基本语法如下:
bash
chmod xxx file其中 xxx 是一个三位数,分别表示用户、用户组、其他用户的权限。
权限对应关系表
| 权限 | 数字值 | 权限总和 |
|---|---|---|
rwx | 421 | 7 |
rw- | 420 | 6 |
r-- | 400 | 4 |
0表示无权限1表示执行权限(x)2表示写权限(w)4表示读权限(r)
权限示例
bash
-rwxr--r-- 1 root root 10 oct 16 02:55 yhp.log| 权限类别 | 权限字符串 | 数值拆解 | 权限总和 |
|---|---|---|---|
| 用户权限 | rwx | 4+2+1 | 7 |
| 用户组权限 | r-- | 4+0+0 | 4 |
| 其他用户权限 | r-- | 4+0+0 | 4 |
权限组合示例:744
代表用户拥有读、写、执行权限,组和其他用户只有读权限。
chown 命令详解
基本语法
bash
chown [选项]... [所有者][:[组]] 文件...常用用法
bash
# 修改文件所有者
chown user file.txt
# 修改所有者和组
chown user:group file.txt
# 仅修改组
chown :group file.txt
# 或
chgrp group file.txt
# 递归修改目录
chown -R user:group directory/
# 参考其他文件的权限
chown --reference=ref_file target_file实际应用场景
bash
# 1. Web 服务器文件权限
sudo chown -R www-data:www-data /var/www/html
sudo chmod -R 755 /var/www/html
# 2. SSH 密钥权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 644 ~/.ssh/authorized_keys
# 3. 脚本文件权限
chmod 755 deploy.sh
chown deployer:deployers deploy.sh
# 4. 数据库文件权限
chown mysql:mysql /var/lib/mysql
chmod 750 /var/lib/mysql修改权限示例
以下操作展示如何修改文件权限:
- 所有人都加入写入权限(+2)
- 给用户组加入写入权限(+2)
- 给其他用户加入执行权限(+1)
权限组合结果:765
bash
chmod 765 a.txt权限修改实战案例
bash
# 案例 1:创建安全的私钥文件
touch private.key
chmod 600 private.key
# 结果:-rw------- (只有所有者可读写)
# 案例 2:设置共享目录
mkdir shared_folder
chmod 775 shared_folder
chown :developers shared_folder
# 结果:drwxrwxr-x (组成员可读写执行)
# 案例 3:Web 应用权限
find /var/www/app -type f -exec chmod 644 {} \;
find /var/www/app -type d -exec chmod 755 {} \;
chmod 600 /var/www/app/config/database.yml
# 案例 4:批量修改权限
# 将所有 .sh 文件设为可执行
find . -name "*.sh" -exec chmod +x {} \;
# 将所有配置文件设为只读
find /etc/myapp -name "*.conf" -exec chmod 644 {} \;特殊权限位
除了基本的 rwx 权限,Linux 还有三个特殊权限位:
SUID (Set User ID) - 4000
bash
# 设置 SUID
chmod u+s executable
chmod 4755 executable
# 效果:运行该文件时,以文件所有者的权限执行
# 常见于:passwd, sudo 等命令
ls -l /usr/bin/passwd
# -rwsr-xr-x 1 root root ...
# ^ SUID 位SGID (Set Group ID) - 2000
bash
# 设置 SGID
chmod g+s directory
chmod 2775 directory
# 效果:
# - 对文件:以文件所属组权限执行
# - 对目录:新创建的文件继承目录的组
# 应用场景:共享协作目录
mkdir /shared/project
chmod 2775 /shared/project
chown :developers /shared/projectSticky Bit - 1000
bash
# 设置粘滞位
chmod +t directory
chmod 1777 directory
# 效果:目录中的文件只能被所有者删除
# 常见于:/tmp 目录
ls -ld /tmp
# drwxrwxrwt ...
# ^ Sticky bit特殊权限组合示例
bash
# 同时设置多个特殊权限
chmod 6755 script.sh
# SUID (4) + SGID (2) + rwxr-xr-x (755)
# 查看特殊权限
stat filename
ls -l filename高级权限管理技巧
1. umask - 默认权限掩码
bash
# 查看当前 umask
umask
# 输出:0022
# 计算默认权限
# 文件:666 - 022 = 644 (rw-r--r--)
# 目录:777 - 022 = 755 (rwxr-xr-x)
# 临时修改 umask
umask 027
# 文件:666 - 027 = 640 (rw-r-----)
# 目录:777 - 027 = 750 (rwxr-x---)
# 永久修改(添加到 ~/.bashrc)
echo "umask 027" >> ~/.bashrc2. ACL (Access Control Lists)
bash
# 查看 ACL
getfacl file.txt
# 设置 ACL
setfacl -m u:username:rwx file.txt
setfacl -m g:groupname:rx file.txt
# 删除 ACL
setfacl -x u:username file.txt
# 递归设置 ACL
setfacl -R -m u:username:rwx directory/3. 权限审计
bash
# 查找 SUID 文件
find / -perm -4000 -type f 2>/dev/null
# 查找 SGID 文件
find / -perm -2000 -type f 2>/dev/null
# 查找世界可写文件
find / -perm -0002 -type f 2>/dev/null
# 查找无主文件
find / -nouser -o -nogroup 2>/dev/null权限安全最佳实践
1. 最小权限原则
bash
# ❌ 不安全:所有人可写
chmod 777 important_file
# ✅ 安全:仅所有者可读写
chmod 600 important_file
# ✅ 适中:所有者读写,组只读
chmod 640 important_file2. 敏感文件保护
bash
# SSH 密钥
chmod 700 ~/.ssh
chmod 600 ~/.ssh/*
chmod 644 ~/.ssh/*.pub
# GPG 密钥
chmod 700 ~/.gnupg
chmod 600 ~/.gnupg/*
# 密码文件
chmod 600 .env
chmod 600 config/secrets.yml3. Web 服务器权限
bash
# Nginx/Apache 推荐权限
chown -R www-data:www-data /var/www
find /var/www -type d -exec chmod 755 {} \;
find /var/www -type f -exec chmod 644 {} \;
# 上传目录特殊处理
chmod 775 /var/www/uploads
chown www-data:www-data /var/www/uploads4. 定期权限检查
bash
#!/bin/bash
# permission_audit.sh
echo "=== SUID Files ==="
find / -perm -4000 -type f 2>/dev/null
echo -e "\n=== World-Writable Files ==="
find / -perm -0002 -type f 2>/dev/null
echo -e "\n=== Unowned Files ==="
find / -nouser -o -nogroup 2>/dev/null
echo -e "\nAudit complete!"常见问题排查
问题 1:Permission denied
bash
# 错误:Permission denied
# 诊断步骤
ls -l file.txt # 检查权限
whoami # 确认当前用户
groups # 查看用户组
# 解决方案
sudo chmod +r file.txt # 添加读权限
sudo chown $USER file.txt # 更改所有者问题 2:无法执行脚本
bash
# 错误:Permission denied
# 检查执行权限
ls -l script.sh
# -rw-r--r-- (缺少 x 权限)
# 添加执行权限
chmod +x script.sh
# 或
chmod 755 script.sh问题 3:目录无法进入
bash
# 错误:cd: permission denied: directory
# 目录需要执行权限才能进入
ls -ld directory
# drwxr-x--- (如果用户不在组中,无法进入)
# 解决方案
chmod o+x directory # 添加其他人执行权限
# 或
usermod -a -G groupname username # 将用户加入组问题 4:权限递归问题
bash
# 递归修改时保留特殊权限
chmod -R u+rwX,go+rX,go-w directory/
# X (大写) 只对目录和已有执行权限的文件生效总结
Linux 文件权限系统是系统安全的核心:
- 理解权限模型:用户、组、其他用户三层权限
- 掌握两种表示法:符号模式和数字模式
- 善用特殊权限:SUID、SGID、Sticky Bit
- 遵循最小权限原则:只授予必要的权限
- 定期审计:检查异常权限设置
关键命令速查:
bash
chmod 755 file # 设置权限
chown user:group file # 更改所有者
ls -l # 查看权限
umask 022 # 设置默认权限掩码
getfacl file # 查看 ACL下一步学习:
掌握权限管理,让你的 Linux 系统更安全!🔒