第五章、Linux 的文件权限与目录配置
5.1 使用者与群组
Linux 的多用户多任务
Linux 是一个多用户、多任务的操作系统:
- 多用户:多个用户可以同时使用系统
- 多任务:系统可以同时运行多个程序
三种身份
Linux 系统中的每个文件都有三种身份:
| 身份 | 说明 |
|---|---|
| user (u) | 文件所有者(owner) |
| group (g) | 文件所属群组 |
| others (o) | 其他人(非所有者且非群组成员) |
特殊身份:
- root:超级管理员,拥有系统最高权限,不受权限限制
使用者与群组的关系
1 | 系统使用者 |
一个用户可以属于多个群组,但只有一个主要群组(primary group)。
查看用户信息
1 | whoami # 显示当前用户名 |
id 命令输出示例:
1 | $ id |
输出说明:
- uid:用户ID
- gid:主要群组ID
- groups:所属的所有群组
5.2 Linux 文件权限概念
查看文件权限
使用 ls -l 命令查看文件权限:
1 | ls -l filename |
输出示例:
1 | $ ls -l |
权限字符串解析
权限字符串共 10 个字符:
1 | -rwxr-xr-x |
第1位:文件类型
| 符号 | 类型 |
|---|---|
- |
普通文件 |
d |
目录 |
l |
符号链接(软链接) |
b |
块设备文件(如硬盘) |
c |
字符设备文件(如键盘) |
s |
套接字文件 |
p |
管道文件 |
第2-10位:权限
每组3个字符,共3组:
| 位置 | 含义 | 字符 |
|---|---|---|
| r | 读权限 | 可读(文件内容/目录列表) |
| w | 写权限 | 可写(修改文件/创建删除目录内容) |
| x | 执行权限 | 可执行(运行程序/进入目录) |
| - | 无权限 | 该权限未授予 |
权限的具体含义
文件权限
| 权限 | 对文件的作用 |
|---|---|
| r (读) | 可以读取文件内容(cat, less, 打开) |
| w (写) | 可以修改文件内容(编辑、覆盖、追加) |
| x (执行) | 可以将文件作为程序运行(./script.sh) |
目录权限
| 权限 | 对目录的作用 |
|---|---|
| r (读) | 可以列出目录内容(ls) |
| w (写) | 可以在目录中创建、删除、重命名文件 |
| x (执行) | 可以进入目录(cd),访问目录中的文件 |
⚠️ 重要说明:
- 对目录有 w 权限,就可以删除目录中的任何文件,即使对该文件没有权限!
- 要访问目录中的文件,需要对目录有 x 权限
修改文件权限:chmod
chmod 命令用于修改文件或目录的权限。
符号模式
1 | chmod [ugoa][+-=][rwx] file |
示例:
1 | chmod u+x script.sh # 给所有者添加执行权限 |
数字模式(八进制)
权限可以用数字表示:
| 权限 | 数值 | 二进制 |
|---|---|---|
| r (读) | 4 | 100 |
| w (写) | 2 | 010 |
| x (执行) | 1 | 001 |
| - (无) | 0 | 000 |
组合值:
| 数字 | 权限 | 说明 |
|---|---|---|
| 7 | rwx | 读+写+执行 |
| 6 | rw- | 读+写 |
| 5 | r-x | 读+执行 |
| 4 | r– | 只读 |
| 3 | -wx | 写+执行 |
| 2 | -w- | 只写 |
| 1 | –x | 只执行 |
| 0 | — | 无权限 |
语法:
1 | chmod XYZ file |
示例:
1 | chmod 755 script.sh # -rwxr-xr-x (所有者全权限,其他读+执行) |
常见文件权限组合:
| 文件类型 | 权限 | 说明 |
|---|---|---|
| 普通文件 | 644 (-rw-r–r–) | 普通文档 |
| 可执行脚本 | 755 (-rwxr-xr-x) | 脚本程序 |
| 配置文件 | 600 (-rw——-) | 敏感配置 |
| 日志文件 | 640 (-rw-r—–) | 日志(组可读) |
| 目录 | 755 (drwxr-xr-x) | 普通目录 |
| 共享目录 | 2775 (drwxrwsr-x) | 组共享(SGID) |
| 临时目录 | 1777 (drwxrwxrwt) | 公共可写(粘滞位) |
递归修改权限
对目录及其所有内容修改权限:
1 | chmod -R 755 directory/ # 递归修改目录及其内容的权限 |
⚠️ 警告: 谨慎使用 -R 选项,特别是在系统目录上!
修改文件所有者和群组:chown
chown 命令用于修改文件或目录的所有者和/或群组。
基本语法
1 | chown [选项] [所有者][:[群组]] 文件... |
示例
1 | chown alice file.txt # 将文件所有者改为 alice |
常用选项
1 | chown -R user:group dir/ # 递归修改目录及其内容 |
只修改群组:chgrp
chgrp 专门用于修改文件的群组,功能与 chown :group 相同。
1 | chgrp group file # 修改文件群组 |
特殊权限位
除了基本的 rwx 权限,Linux 还有三种特殊权限位:
1. SUID (Set User ID)
- 符号:
s(在所有者的 x 位置) - 数值:
4000 - 作用:执行该文件时,以文件所有者的身份运行
1 | # 设置SUID |
注意: SUID 对脚本文件无效,只对二进制可执行文件有效。
2. SGID (Set Group ID)
- 符号:
s(在群组的 x 位置) - 数值:
2000 - 作用:
- 对文件:执行时以文件群组的身份运行
- 对目录:在该目录下创建的文件继承目录的群组
1 | # 设置SGID |
3. Sticky Bit (粘滞位)
- 符号:
t(在其他的 x 位置) - 数值:
1000 - 作用:只有文件所有者、目录所有者或 root 才能删除该目录下的文件
1 | # 设置粘滞位 |
典型应用: /tmp 目录允许所有人读写,但只能删除自己的文件。
特殊权限总结表
| 权限 | 符号 | 数值 | 作用 |
|---|---|---|---|
| SUID | s (u+s) | 4000 | 以文件所有者身份执行 |
| SGID | s (g+s) | 2000 | 以文件群组身份执行 / 继承目录群组 |
| Sticky | t (+t) | 1000 | 限制删除权限 |
设置特殊权限
1 | # 符号模式 |
查看特殊权限
1 | ls -l /usr/bin/passwd # 查看SUID |
文件隐藏属性
Linux 文件系统还支持隐藏属性,使用 chattr 命令设置,lsattr 命令查看。
1 | lsattr file # 查看文件隐藏属性 |
常用属性:
| 属性 | 说明 |
|---|---|
i |
不可变(immutable),不能修改、删除、重命名、创建链接 |
a |
只能追加(append-only),只能添加内容 |
A |
不更新访问时间(atime) |
S |
同步更新(synchronous),立即写入磁盘 |
d |
dump 命令忽略 |
e |
使用extents格式(ext4) |
文件访问控制列表 (ACL)
ACL (Access Control List) 提供了比传统权限更细粒度的访问控制。
1 | # 查看ACL |
示例:
1 | # 允许特定用户读写文件 |
5.3 Linux目录配置
Linux 目录结构标准 (FHS)
FHS (Filesystem Hierarchy Standard) 定义了 Linux 系统中目录的用途和组织方式。
根目录结构
1 | / |
重要目录详解
/bin (Binary)
- 用途:存放所有用户都可以使用的基本命令
- 内容:ls, cp, mv, rm, cat, echo, mkdir 等
- 特点:单用户模式下也可用
/sbin (System Binary)
- 用途:存放系统管理命令
- 内容:fdisk, fsck, reboot, shutdown, ifconfig 等
- 特点:通常需要 root 权限
/usr/bin 和 /usr/sbin
- 用途:存放应用程序的命令
- 关系:现代 Linux 中,/bin 和 /sbin 通常是到 /usr/bin 和 /usr/sbin 的符号链接
/boot
- 用途:存放启动加载器相关文件
- 内容:
- 内核文件(vmlinuz-*)
- 初始化内存盘(initrd.img-* 或 initramfs-*)
- GRUB 配置文件
- 注意事项:不要删除此目录中的文件
/dev (Device)
- 用途:存放设备文件
- 类型:
- 块设备(b):如硬盘(/dev/sda)、光驱
- 字符设备(c):如终端(/dev/tty)、键盘
- 伪设备:如 /dev/null(黑洞)、/dev/zero(零字节)、/dev/random(随机数)、/dev/urandom
常用设备文件:
1 | /dev/sda # 第一块SCSI/SATA硬盘 |
/etc (Editable Text Configuration)
- 用途:存放系统配置文件
- 特点:纯文本格式,可编辑
- 重要配置文件:
1 | /etc/passwd # 用户账户信息 |
/home
- 用途:普通用户的主目录
- 结构:
1
2
3
4/home/
├── alice/ # 用户alice的主目录
├── bob/ # 用户bob的主目录
└── charlie/ # 用户charlie的主目录 - 环境变量:
$HOME或~指向当前用户的主目录 - 注意:root 用户的主目录是
/root,不在/home下
用户主目录中的常见文件:
1 | ~/.bashrc # bash配置 |
/lib, /lib64, /lib32
- 用途:存放共享库文件(Shared Libraries)
- 内容:
- 动态链接库(.so 文件,如 libc.so.6)
- 内核模块
- 启动所需的库
- 目录说明:
/lib:32位和通用的库/lib64:64位库(在64位系统上)/lib32:32位库(在32位系统上)
常见库文件:
1 | /lib/x86_64-linux-gnu/libc.so.6 # C标准库 |
查看程序依赖的库:
1 | ldd /bin/ls # 查看ls命令依赖的库 |
/media 和 /mnt
- 用途:挂载点(Mount Points)
- 区别:
/media:系统自动挂载的可移动设备(U盘、光盘、移动硬盘)/mnt:手动挂载临时文件系统的传统挂载点
- 现代趋势:
/media越来越常用,/mnt更多用于临时手动挂载
查看挂载的文件系统:
1 | mount # 显示所有挂载点 |
/opt
- 用途:存放可选的应用程序包
- 内容:通常是第三方商业软件或大型独立软件
- 特点:
- 每个软件有自己的子目录
- 不依赖于系统包管理器
- 可以方便地安装和卸载
典型结构:
1 | /opt/ |
/proc
- 用途:虚拟文件系统,提供进程和内核信息
- 特点:
- 不占用磁盘空间,存在于内存中
- 实时反映系统状态
- 许多文件是只读的
- 重要文件和目录:
1 | /proc/cpuinfo # CPU信息 |
查看进程信息:
1 | ls /proc/$$ # 查看当前shell的信息 |
通过 /proc 调整内核参数:
1 | # 查看当前值 |
/root
- 用途:root 用户的主目录
- 为什么单独:
- root 是超级管理员,拥有最高权限
- 为了安全,与其他用户主目录分开
- 系统故障时,其他分区可能无法挂载,但 /root 在根分区上始终可用
- 路径:
/root(不是/home/root) - 权限:通常是
700(drwx——),只有 root 能访问
/run
- 用途:存放运行时变量数据
- 内容:
- 进程 PID 文件(/run/nginx.pid)
- 服务状态信息
- 运行时生成的临时数据
- 特点:
- tmpfs 文件系统(内存中)
- 重启后清空
- 早期在 /var/run,现在迁移到 /run
- 相关路径:
/run=/var/run(符号链接)/run/lock=/var/lock
/sbin
- 用途:存放系统管理命令
- 与 /bin 的区别:
/bin:基本命令,所有用户都需要/sbin:系统管理命令,通常需要 root 权限
- 内容:
fdisk、mkfs:磁盘分区格式化ifconfig、ip:网络配置reboot、shutdown、poweroff:关机重启iptables:防火墙配置
/srv
- 用途:存放服务提供的数据
- 内容:
- Web 服务器的数据(/srv/www)
- FTP 服务器的数据(/srv/ftp)
- Git 仓库(/srv/git)
- 与 /var 的区别:
/srv:服务的数据文件/var:运行时产生的可变数据(日志、缓存等)
/sys
- 用途:虚拟文件系统,提供内核参数和设备信息
- 与 /proc 的区别:
/proc:进程信息和运行时内核数据/sys:设备和内核对象的统一视图(sysfs)
- 内容:
1 | /sys/class/ # 按类别组织的设备(块设备、网络接口等) |
常用操作:
1 | # 查看CPU信息 |
通过 /sys 调整内核参数:
1 | # 开启/关闭IP转发(临时,重启失效) |
/tmp
- 用途:存放临时文件
- 特点:
- 所有用户都有读写权限(通常是 777 + sticky bit = 1777)
- 定期清理(通常每天或重启时)
- 可能使用 tmpfs(内存文件系统)
- 使用场景:
- 程序运行时的临时数据
- 下载和解压文件
- 编译过程中的临时文件
/usr (Unix System Resources)
- 用途:存放用户程序和文件
- 含义:历史上是 “user” 的缩写,现在是 “Unix System Resources”
- 结构:
1 | /usr/ |
重要子目录:
/usr/bin:用户命令,比/bin更丰富(如 gcc, python, vim)/usr/sbin:系统管理命令,比/sbin更丰富(如 apachectl, mysqld)/usr/lib:程序的库文件/usr/share:与架构无关的共享数据(文档、图标、字体等)/usr/local:本地安装的软件,与系统包管理器分开
/var (Variable)
- 用途:存放运行时产生的可变数据
- 特点:数据会随时间增长或变化
- 内容:
1 | /var/ |
重要子目录:
/var/log:日志文件,排查问题的重要依据/var/lib:程序的运行时数据(如数据库文件)/var/cache:缓存数据,可清理以释放空间/var/spool:队列数据(如邮件队列、打印队列)
路径与目录操作
绝对路径与相对路径
绝对路径 (Absolute Path):
- 从根目录
/开始的完整路径 - 不管当前在什么位置,都能准确找到
- 示例:
/home/user/documents/file.txt
相对路径 (Relative Path):
- 相对于当前目录的路径
- 不从
/开始 - 依赖当前所在位置
| 符号 | 含义 |
|---|---|
. |
当前目录 |
.. |
上级目录 |
~ |
当前用户的主目录 |
~username |
指定用户的主目录 |
- |
上一次所在的目录 |
相对路径示例:
1 | # 当前目录:/home/user |
路径切换命令
cd - 切换目录
1 | cd /path/to/directory # 切换到绝对路径 |
pwd - 显示当前路径
1 | pwd # 显示逻辑路径(可能包含符号链接) |
目录操作命令
mkdir - 创建目录
1 | mkdir dirname # 创建单个目录 |
rmdir - 删除空目录
1 | rmdir dirname # 删除空目录 |
⚠️ 注意: rmdir 只能删除空目录。要删除非空目录,使用 rm -r。
rm - 删除文件或目录
1 | rm file.txt # 删除文件 |
⚠️ 危险命令警告:
1 | rm -rf / # 删除整个系统!永远不要执行! |
文件与目录的默认权限
umask
umask(user file-creation mode mask)决定了新创建文件和目录的默认权限。
查看 umask:
1 | umask # 显示umask值(四位八进制数) |
默认权限计算:
- 文件:
666 - umask - 目录:
777 - umask
常见 umask 值:
| umask | 文件权限 | 目录权限 | 说明 |
|---|---|---|---|
| 002 | 664 (rw-rw-r–) | 775 (rwxrwxr-x) | 用户和组可写 |
| 022 | 644 (rw-r–r–) | 755 (rwxr-xr-x) | 仅用户可写(常见) |
| 077 | 600 (rw——-) | 700 (rwx——) | 仅用户可访问(安全) |
设置 umask:
1 | umask 022 # 设置umask为022 |
永久设置 umask:
编辑 ~/.bashrc 或 ~/.profile:
1 | echo "umask 022" >> ~/.bashrc |
特殊权限的实践应用
1. SUID 应用:passwd 命令
1 | ls -l /usr/bin/passwd |
为什么需要 SUID?
- 普通用户需要修改自己的密码
- 密码存储在
/etc/shadow,只有 root 可写 - 通过 SUID,passwd 以 root 身份运行,可以修改 shadow 文件
2. SGID 应用:共享目录
1 | # 创建共享目录 |
效果:
- 任何人在此目录创建的文件,群组都是
developers - 实现组内文件共享
3. 粘滞位应用:/tmp 目录
1 | ls -ld /tmp |
效果:
- 所有人都可以在 /tmp 读写文件
- 但只能删除自己创建的文件
- 保护了用户的临时文件不被他人删除
权限管理最佳实践
1. 最小权限原则
- 只授予必要的权限
- 不要滥用 root 权限
- 使用 sudo 而不是直接登录 root
2. 敏感文件权限
1 | # 密码文件 |
3. 目录权限设置
1 | # Web 目录 |
4. 使用 ACL 进行细粒度控制
1 | # 允许特定用户访问 |
5. 定期审计权限
1 | # 查找SUID/SGID文件 |
本章命令总结
| 命令 | 功能 |
|---|---|
ls -l |
查看文件权限 |
chmod |
修改权限 |
chown |
修改所有者 |
chgrp |
修改群组 |
umask |
设置默认权限 |
id |
查看用户信息 |
whoami |
显示当前用户 |
groups |
查看所属群组 |
getfacl / setfacl |
管理ACL |
lsattr / chattr |
管理隐藏属性 |
find |
查找文件(支持按权限查找) |
5.4 重点回顾
- 三种身份:user(所有者)、group(群组)、others(其他人)
- 三种权限:r(读,4)、w(写,2)、x(执行,1)
- 权限查看:
ls -l显示10位权限字符串 - 修改权限:
chmod(符号模式或数字模式) - 修改所有者:
chown(可同时改群组) - 修改群组:
chgrp(或chown :group) - 默认权限:
umask决定新文件的默认权限 - 特殊权限:SUID(4)、SGID(2)、粘滞位(1)
- 隐藏属性:
chattr、lsattr - ACL:
setfacl、getfacl提供更细粒度的权限控制 - FHS标准:Linux 目录结构遵循 FHS 标准
- 重要目录:/etc(配置)、/var(可变数据)、/home(用户主目录)
5.5 本章练习
解释
-rwxr-xr-- 1 alice developers 1234 Jan 1 10:00 script.sh中各字段的含义。如何给文件添加执行权限?如何移除写权限?分别使用符号模式和数字模式。
创建一个目录,使得组内成员可以读写,其他人只能进入但不能列出内容。
解释 SUID、SGID 和粘滞位的作用,并各举一个应用场景。
设置 umask 使得新建文件的权限为 640,新建目录的权限为 750。
使用 ACL 允许特定用户访问你主目录下的某个文件,但不改变文件的基本权限。
解释以下目录的用途:/etc、/var、/usr、/opt、/proc。
查找系统中所有设置了 SUID 位的文件。
创建一个共享目录,要求:
- 任何人都可以创建文件
- 只能删除自己的文件
- 新文件的群组自动继承目录的群组
检查你主目录下文件的权限,找出可能存在安全隐患的文件(如所有人可写)。
5.6 参考资料与延伸阅读
man 1 chmodman 1 chownman 1 lsman 2 umaskman 1 getfacl- Filesystem Hierarchy Standard
- Linux 文件权限详解
- 鸟哥的 Linux 私房菜 - 文件权限与目录配置