跳转到内容

Linux 文件权限管理 | chmod、chown 命令完全解析与最佳实践

Linux File Permissions

Linux 操作系统中对权限的管理很严格。Linux 系统中不仅是对用户与组根据 UID,GID 进行了管理,还对 Linux 系统中的文件,按照用户与组进行分类,针对不同的群体进行了权限管理,用他来确定谁能通过何种方式和目录进行访问和操作。

理解并正确配置文件权限是 Linux 系统安全的基石。本文将全面解析 Linux 权限系统的工作原理和实际应用。

Linux 的文件权限详解

权限共有 10 个字符,我们将它分为 4 大部分来理解:

表示文件的类型

-表示是一个文件
d表示是一个目录
l表示是一个连接(理解为快捷方式)
c字符设备文件
b块设备文件
ssocket 文件
p命名管道文件

用户组类型

缩写用户组类型
uowner属主 :当前用户具有的对该文件的权限
ggroup当前组内其他用户具有对该文件的权限
oother其他组的用户具有的对该文件的权限
aall所有用户(u+g+o)

权限类型

  • rRead
  • wWrite
  • xexecute 执行
  • -:无权限

针对目录加执行权限,文件不加执行权限(因文件具备执行权限有安全隐患)

针对文件和目录来说,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)
数字表示42142142
权限分配文件所有者文件所属组用户其他用户

用户获取文件权限的顺序:先看是否为所有者,如果是,则后面权限不看;再看是否为所属组,如果是,则后面权限不看。

权限的数字表示法

权限值计算

每个权限都有对应的数值:

  • r (读) = 4
  • w (写) = 2
  • x (执行) = 1
  • - (无) = 0

常见权限组合

权限字符串计算方式八进制值说明
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无权限

三位权限码示例

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)

修改文件权限

chownchange owner 的意思,主要作用就是改变文件或者目录所有者。

chmod修改文件和文件夹读写执行属性。使用权限:所有使用者
chown修改文件和文件夹的用户和用户组属性。使用权限:root

chmod 命令详解

mode 方式(符号模式)

bash
chmod who opt per file
who u g o a(all) (u 用户 userg 用户组 groupo 其他用户a 所有用户默认)
opt+ 添加某个权限 - 取消某个权限 = 赋予权限
perr 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 是一个三位数,分别表示用户、用户组、其他用户的权限。

权限对应关系表

权限数字值权限总和
rwx4217
rw-4206
r--4004
  • 0 表示无权限
  • 1 表示执行权限(x
  • 2 表示写权限(w
  • 4 表示读权限(r

权限示例

bash
-rwxr--r-- 1 root root 10 oct 16 02:55 yhp.log
权限类别权限字符串数值拆解权限总和
用户权限rwx4+2+17
用户组权限r--4+0+04
其他用户权限r--4+0+04

权限组合示例: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/project

Sticky 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" >> ~/.bashrc

2. 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_file

2. 敏感文件保护

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.yml

3. 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/uploads

4. 定期权限检查

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 文件权限系统是系统安全的核心:

  1. 理解权限模型:用户、组、其他用户三层权限
  2. 掌握两种表示法:符号模式和数字模式
  3. 善用特殊权限:SUID、SGID、Sticky Bit
  4. 遵循最小权限原则:只授予必要的权限
  5. 定期审计:检查异常权限设置

关键命令速查:

bash
chmod 755 file        # 设置权限
chown user:group file # 更改所有者
ls -l                 # 查看权限
umask 022             # 设置默认权限掩码
getfacl file          # 查看 ACL

下一步学习:

掌握权限管理,让你的 Linux 系统更安全!🔒