Linux 目录结构
Linux 遵循 FHS(Filesystem Hierarchy Standard) 文件系统层级标准,和 Windows 最核心的差异在于目录组织方式:
Windows:多根目录结构,文件按 C:\、D:\、E:\ 分盘存储
Linux:单根目录结构,所有文件和目录都从唯一的根 / 延伸而来

在终端执行以下命令,即可查看根目录下的所有一级目录:
ls /
Linux ls 命令标准格式:
ls [选项] [目标目录]
ls:固定主命令,必须写
[选项]:可选,用来切换显示效果(简写加 -)
[目标目录]:可选,指定查看哪个文件夹;不写默认查看当前所在文件夹
**注意:**ls 选项 目标目录 这三个之间都是有空格分隔的,不强制空格数量只要空开就行。
命令解释:
日常鼠标操作:ls 等同于 双击打开一个文件夹,查看里面所有文件、文件夹
Windows 命令行:ls 完全对应 CMD/PowerShell 里的 dir 命令
举个简单的例子说明:你站在「 Downloads 下载文件夹 」里,敲一下 ls,屏幕立刻列出:照片.jpg、笔记.txt、安装包.zip 等你在这个文件夹里存储的内容。

| 目录 | 核心功能 |
|---|---|
/bin | 普通用户可执行的基础命令,如 ls、date、cat 等 |
/sbin | 管理员 root 专属的系统管理命令,如服务管理、磁盘分区相关指令 |
/boot | 系统启动相关文件,包括内核 kernel、引导装载程序 grub 等 |
/dev | 设备文件目录,所有硬件设备都会映射为这里的文件,如硬盘 /dev/sda、分区 /dev/sda1 |
/etc | 系统和服务的核心配置文件目录,如网络配置、服务参数、用户权限配置都存放在这里 |
/home | 普通用户的家目录,每个普通用户都会在这里有一个同名专属目录,如用户 alice 的家目录为 /home/alice |
/root | 超级用户 root 的专属家目录 |
/lib /lib64 | 系统共享库文件(Glibc),/lib64 为 64 位系统专属的库文件目录 |
/media | 移动设备默认挂载点,如 U 盘、光盘等插入后会自动挂载到这里 |
/mnt | 手动挂载设备的目录,常用于临时挂载硬盘、网络存储等 |
/opt | 第三方软件的可选安装目录 |
/proc | 虚拟文件系统,不占用实际磁盘空间,实时反映内核、进程、硬件的运行状态 |
/sys | 虚拟文件系统,主要管理硬件设备相关信息 |
/tmp | 全局可写的临时文件目录,进程运行产生的临时文件默认存放在这里,重启后数据会清空 |
/usr | 系统核心文件目录,相当于 Windows 的 C:\Windows;其中 /usr/local 是软件默认安装目录,相当于 Windows 的 C:\Program Files |
/var | 动态变化文件目录,存放数据库数据、系统日志、邮件、缓存等持续增长的内容 |
/lost+found | 文件系统修复时,存放无链接的碎片文件的目录 |
所有命令均提供可直接复制执行的示例,新手可直接在终端练习。
类似于 Windows 系统中右键新建空白文本文档或其他文件的操作
使用 touch 命令,语法:touch 文件名
# 在当前目录创建 file1.txt 文件 touch file1.txt # 查看创建结果 ls
https://cdn.benszen.com/blogs-photo/linux-2/3.png
相当于 Windows 系统中右键新建文件夹的操作
使用 mkdir 命令,语法:mkdir [选项] 目录名
核心选项 -p:递归创建多级目录,上级目录不存在时自动创建
# 创建单个目录 dir1 mkdir dir1 # 递归创建多级嵌套目录 a/b/c mkdir -p a/b/c # 查看创建结果 ls

相当于 Windows 系统中对文件 / 文件夹执行复制 + 粘贴的操作,-r 选项可完整复制整个文件夹及内部所有内容
使用 cp 命令,语法:cp [选项] 源文件/目录 目标路径
核心选项 -r:递归复制目录及目录内所有内容
# 把 file1.txt 复制到 dir1 目录中 cp file1.txt dir1/ # 递归复制 dir1 目录为 dir2 目录 cp -r dir1 dir2 # 查看复制结果 ls dir1

相当于 Windows 系统中对文件 / 文件夹执行剪切 + 粘贴操作,同时也能直接实现文件 / 文件夹重命名的功能
使用 mv 命令,语法:mv 源文件/目录 目标路径/新名称
# 把 file3.txt 移动到 dir1 目录中 mv file3.txt dir1/ # 把 file1.txt 重命名为 file2.txt mv file1.txt file2.txt # 查看结果 ls

相当于 Windows 系统中删除文件 / 文件夹后直接清空回收站,会彻底删除数据,务必谨慎操作
使用 rm 命令,语法:rm [选项] 文件/目录
常用选项 -r:递归删除目录及所有内容
常用选项 -f:强制删除,不提示确认
⚠️ 警告:
rm -rf命令删除的文件极难恢复,执行前务必确认路径正确!
# 同时删除 file2.txt 文件 rm -rf file2.txt # 删除 dir1 和 dir2 两个目录及目录内所有内容 rm -rf dir1 dir2 # 查看删除结果 ls

相当于 Windows 系统中在文件资源管理器里双击打开 / 返回文件夹,切换当前正在浏览的文件夹路径
使用 cd 命令,路径分为绝对路径和相对路径两种:
绝对路径:从根目录 / 开始写的完整路径,无论当前在哪个目录都能精准定位
相对路径:相对于当前所在目录的路径,写法更简洁
pwd命令可以显示我们目前在哪个目录下
# 绝对路径:直接切换到 /home 目录 cd /home # 相对路径:切换到当前目录下的 zhangsan 目录 cd zhangsan # 切换到上一级目录 cd .. # 直接切换到当前用户的家目录 cd

类似于 Windows 系统中用记事本 / Office 打开文档查看内容,或是用查找功能筛选文档内的关键 信息
根据文件大小和使用场景,选择对应的查看方式,无需每次都打开 编辑器 。
| 命令 | 适用场景 | 示例 |
|---|---|---|
cat | 一次性展示文件全部内容,适合小文件 | cat /root/file1.txt |
more | 翻页查看大文件,回车向下翻行,空格向下翻页 | more /root/file1.txt |
head | 查看文件开头部分,默认显示前 10 行 | head /root/file1.txt |
tail | 查看文件结尾部分,默认显示最后 10 行,常用来查看实时日志 | tail /root/file1.txt |
grep | 过滤文件中包含指定关键字的内容,精准定位信息 | grep 'abc' /root/file1.txt |
grep 示例:过滤出 file1.txt 中包含 root 的所有行
grep 'root' /root/file1.txt
这里简单做个简单示例:
# 我准备了一个file1.txt文件,里面有11行内容 # 使用cat查看全部内容 [root@localhost ~]# cat file1.txt 111111111111111111 22222222222222222222 333333333333 4444444444444root 55555555555555 666666666666666 777777777777 888888888888 999999999999 aaaaaaaaaaaaroot bbbbbbbbbbbbb # 使用more查看/etc/passwd文件,这里内容比较长,可以自己手动试试回车空格翻页 more /etc/passwd # 使用head查看文件内容(默认前10行) [root@localhost ~]# head file1.txt 111111111111111111 22222222222222222222 333333333333 4444444444444root 55555555555555 666666666666666 777777777777 888888888888 999999999999 aaaaaaaaaaaaroot [root@localhost ~]# head -5 file1.txt 111111111111111111 22222222222222222222 333333333333 4444444444444root 55555555555555 [root@localhost ~]# head -3 file1.txt 111111111111111111 22222222222222222222 333333333333 [root@localhost ~]# # 使用tail查看文件内容(默认后10行) [root@localhost ~]# tail file1.txt 22222222222222222222 333333333333 4444444444444root 55555555555555 666666666666666 777777777777 888888888888 999999999999 aaaaaaaaaaaaroot bbbbbbbbbbbbb [root@localhost ~]# [root@localhost ~]# tail -4 file1.txt 888888888888 999999999999 aaaaaaaaaaaaroot bbbbbbbbbbbbb [root@localhost ~]# # 使用grep筛选出root的行 [root@localhost ~]# grep root file1.txt 4444444444444root aaaaaaaaaaaaroot [root@localhost ~]#
Linux 中一切皆文件,不同类型的文件有明确的标识,与Windows不同的是Linux不能通过文件颜色或扩展名判断文件类型(Linux 系统本身没有文件扩展名的概念)。
执行以下命令,即可查看文件的类型:
# 查看文件类型与详细属性 ll -d /bin/ls /dev/sda /home # 这里的 ll 是 ls -ld 这个命令的简写,用于以长格式显示文件 / 目录本身的详细信息,不会进入目录内部。

可以看到红框圈出来的地方就是代表每个文件的类型,分别是普通文件,块设备文件,目录文件。
| 标识 | 文件类型 | 说明 |
|---|---|---|
- | 普通文件 | 包括文本文件、二进制文件、压缩包、图片、视频等 |
d | 目录文件 | 也就是文件夹,终端中默认显示为蓝色 |
| 标识 | 文件类型 | 说明 |
|---|---|---|
b | 块设备文件 | 存储设备,如硬盘、U 盘,示例 /dev/sda |
c | 字符设备文件 | 终端、打印机等串行输入输出设备,示例 /dev/tty1 |
l | 链接文件 | 相当于 Windows 的快捷方式,终端中默认显示为淡蓝色 |
s | 套接字文件 | 用于网络通信的特殊文件 |
p | 管道文件 | 用于进程间通信的特殊文件 |
Linux 中修改文件内容最常用的工具是 vi/vim 编辑器同时也是个程序开发工具,掌握基础操作即可应对绝大部分的编辑场景。
vi/vim 是 Linux 系统中核心的文本编辑器,其操作核心分为三种模式,分别是命令模式(Command Mode,又称普通模式)、输入模式(Insert Mode,又称插入模式)**和**命令行模式(Command-Line Mode,又称底线命令模式),三种模式可相互切换,覆盖文本编辑的全流程操作,下面讲述内容可以结合这幅图来理解。

用户启动 vi/vim 后,会默认进入命令模式。
此状态下所有键盘敲击动作都会被 Vim 识别为编辑命令,而非输入字符;该模式是 vi/vim 的核心中枢,可完成光标移动、文本复制剪切、模式切换等核心操作,无法直接进行文本输入。
常用命令如下:
i – 切换到输入模式,在光标当前位置开始输入文本
a – 切换到输入模式,在光标下一个位置开始输入文本
o – 切换到输入模式,在当前行的下方插入一个新行并开始输入
O – 切换到输入模式,在当前行的上方插入一个新行并开始输入
dd – 剪切(删除)光标所在的整行内容
yy – 复制光标所在的整行内容
p(小写) – 粘贴剪贴板内容到光标所在位置的下方
P(大写) – 粘贴剪贴板内容到光标所在位置的上方
u – 撤销上一次操作
: – 切换到底线命令模式,在编辑器最底一行输入命令
若想要编辑文本,启动 Vim 进入命令模式后,按下i/a/o等按键即可切换到输入模式。命令模式仅支持基础编辑命令,更复杂的文件操作需通过底线命令模式完成。
在命令模式下按下i/a/o等插入类按键,即可进入输入模式;按下Esc键可退出输入模式,切回命令模式。
此模式下的键盘操作会被识别为文本输入,可完成正文的编写与修改,支持以下常用按键操作:
ENTER(回车键):文本换行
BACK SPACE(退格键):删除光标前一个字符
方向键:在文本中移动光标位置
ESC:退出输入模式,切换回命令模式
在命令模式下按下英文冒号:,即可进入底线命令模式,此时编辑器底部会出现:提示符,可输入单字符或多字符的操作命令,支持文件保存、退出、查找替换等大量扩展操作。按下ESC键可随时退出该模式,切回命令模式。
基础常用命令如下(命令需配合前缀:使用):
:w – 保存当前文件的修改
:q – 退出 Vim 编辑器(文件无修改时可正常退出)
:wq – 保存文件修改并退出 Vim 编辑器
:q! – 强制退出 Vim 编辑器,放弃所有未保存的修改
打开文件 → 默认进入【命令模式】 命令模式 → 按 i/a/o → 【插入模式】(编辑内容) 命令模式 → 按 v/V/Ctrl+v → 【可视模式】(批量选择编辑) 命令模式 → 按 : → 【末行模式】(保存/退出/查找替换) 任意模式 → 按 ESC → 回到命令模式
在命令模式下按 : 进入末行模式,常用指令如下:
# 另存为 file9.txt 文件 :w file9.txt # 显示文件行号 :set nu # 取消显示行号 :set nonu # 显示文件中的控制字符 :set list # 查找替换:将 1-5 行中所有的 root 替换为 zhangsan :1,5s/root/zhangsan/g
举个简单的例子,这里我们主要学会如何在文件里写入内容更改内容然后保存退出即可:
# 编辑file10.txt vim file10.txt

此时我们进入了命令模式,我们要想写入内容就得按i,进入输入模式

可以看到左下角出现了插入/ insert 的字样,这是代表我们进入了输入模式,可以开始编辑内容了

当我们编辑完内容想保存退出时,可以按Esc回到命令模式

可以看到左下角的插入/insert的字样消失,这时如果还想编辑可以继续按i去更改内容,或者输入:wq即可保存并退出

最后我们可以使用cat查看该文件的内容是否被我们写入

Linux 是多用户多任务操作系统,系统中每一个运行的进程、每一个文件,都有对应的归属用户和用户组,用户权限直接决定了对文件 / 进程的操作权限。
系统上运行的每一个进程(运行中的程序),都会以一个特定用户的身份运行
系统中的每一个文件和目录,都有对应的归属用户
用户对文件和目录的访问权限,由用户身份和文件的权限配置共同决定
每一个用户都有一个专属的基本组,同时可以加入多个附加组
# 查看当前登录用户的 UID、GID、所属组等信息 id # 查看文件 / 目录的归属用户和归属组 ll /home/ # 查看系统中运行的进程对应的启动用户 ps aux
用户和用户组的所有信息,都存储在系统固定的配置文件中我们可以使用vim进去查看,无需手动修改,了解结构即可看懂用户权限规则。
每一行对应一个用户,用冒号 : 分割为 7 个字段,格式如下:
用户名:x:UID:GID:描述信息:家目录:登录shell
示例:root 用户的信息
root:x:0:0:root:/root:/bin/bash
字段详细说明
用户名:登录系统的账号名称
密码占位符:x 代表密码存储在 /etc/shadow 中,不在这里明文存储
UID:用户的唯一标识,系统约定:
0:特权用户 root,拥有系统最高权限
1~999:系统用户,用于运行系统服务,默认禁止登录
1000+:普通用户,我们手动创建的用户默认从 1000 开始
GID:用户所属基本组的 ID
描述信息:用户的备注说明,默认为用户名
家目录:用户登录系统后默认进入的目录,root 用户为 /root,普通用户默认为 /home/用户名
登录 shell:用户登录后使用的命令解释器,默认是 /bin/bash;设置为 /sbin/nologin 代表禁止该用户登录系统
存储用户的加密密码和密码策略,仅 root 用户可访问,每一行用冒号 : 分割为 9 个字段,格式如下:
登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:保留
示例:root 用户的信息
root:$6$Yohyv//NSkE./6zz$KK2LwBwkDy2weJJ6kR/5lebq1E9RzRy8ASjWOwMZSpbvg5K2LjUNylkG0kxbY/kxU.QNMsIRW6gMqQdO/FWQU0::0:99999:7:::
字段详细说明
登录名:与 /etc/passwd 中的用户名一致
加密口令:加密后的用户密码,加密算法标识:
$1$ 开头:MD5 加密
$5$ 开头:SHA-256 加密
$6$ 开头:SHA-512 加密(系统默认)
空值:用户无密码,登录无需输入密码
*:账号被锁定
!!:密码已过期
最后一次修改时间:从 1970 年 1 月 1 日起,到用户最后一次修改密码的天数
最小时间间隔:两次修改密码之间需要间隔的最小天数,0 代表无限制
最大时间间隔:密码保持有效的最大天数,默认 99999 代表永不过期
警告时间:密码过期前多少天开始提醒用户修改密码
不活动时间:密码过期后,用户仍可登录的宽限天数,到期后账号禁用
失效时间:账号的绝对过期时间,到该日期后账号直接失效,无法登录
保留字段:暂无用途
每一行对应一个用户组,用冒号 : 分割为 4 个字段,格式如下:
组名:组密码:组ID:组成员 示例:root:x:0:
组分类
基本组:创建用户时,系统自动创建的与用户名同名的组,是用户的默认组
附加组:用户额外加入的其他组,用于给用户分配额外权限
使用 useradd 命令,不指定选项时,系统会自动创建同名基本组、家目录、默认 shell。
# 创建普通用户 user01,使用默认配置 useradd user01 # 查看用户信息 id user01 # 创建用户 user02,并指定 UID 为 6666 useradd user02 -u 6666 # 创建用户 user03,并指定家目录为 /user03 useradd user03 -d /user05
这里id不是1000开始是因为创建系统时候被强制创建了一个zhangsan的用户,1000就给它占用了。

使用 userdel 命令,核心选项 -r 会同时删除用户的家目录和相关配置文件。
# 删除 user02 用户,同时删除家目录 userdel -r user02

使用 passwd 命令,root 用户可以修改所有用户的密码,普通用户只能修改自己的密码。
# root 用户修改 user01 用户的密码 passwd user01 # 普通用户登录后,修改自己的密码 passwd

使用 usermod 命令,可修改用户的 shell、所属组、家目录等属性。
# 修改 user02 的登录 shell 为 /sbin/nologin(禁止登录) usermod -s /sbin/nologin user02
使用 groupadd 命令。
# 创建名为 hr 的用户组 groupadd hr # 查看创建结果 tail -3 /etc/group # 创建组 net01,并指定 GID 为 1007 groupadd net01 -g 1007 # 查看组信息 grep 'net01' /etc/group

使用 groupdel 命令。
# 删除 net01 组 groupdel net01

# 把 user01 用户追加到 hr 附加组(-aG 代表追加,不会覆盖原有组) usermod -aG hr user01 # 查看用户所属组 id user01 # 把 user01 从 hr 组中移除 gpasswd -d user01 hr

普通用户默认没有系统管理权限,需要执行管理员命令时,有两种常用提权方式。
切换到 root 用户,获得完整的管理员权限,操作完成后退出即可回到原用户。
# 普通用户切换到 root 用户,- 代表切换到 root 的完整环境 su - root
输入 root 用户的密码后,即可获得完整的管理员权限,执行所有系统操作。

仅给当前执行的命令临时赋予 root 权限,执行完成后自动退回普通用户,权限可控、更安全,是生产环境的首选方案。
用户执行 sudo 命令时,系统会查找 /etc/sudoers 文件,判断用户是否有 sudo 执行权限
确认用户有权限后,提示用户输入自己的密码确认
密码验证通过后,以 root 身份执行后续的命令
执行完成后,自动退回到原普通用户
给普通用户 lisi 配置 sudo 权限,最简单的方式是将用户加入 wheel 组(RHEL/CentOS 系统默认给 wheel 组配置了完整的 sudo 权限)。
# 1. 创建 lisi 用户,并加入 wheel 附加组 useradd lisi -G wheel # 2. 查看用户信息,确认已加入 wheel 组 id lisi # 3. 给 lisi 用户设置密码 passwd lisi # 4. 切换到 lisi 用户,使用 sudo 执行管理员命令 su - lisi # 直接创建用户会提示权限不足 useradd wanger # 加上 sudo 即可临时提权执行 sudo useradd wanger # 查看创建结果 id wanger

/etc/sudoers 是 sudo 的核心授权文件,语法如下:
用户 登录的主机=(可切换的身份) 可以执行的命令

这是单用户 sudo 权限配置,规则为 root ALL=(ALL) ALL
授权对象:系统的root超级用户
完整含义:允许 root 用户,在任意主机上,以系统中任意用户的身份,执行系统里的所有命令。这是 Linux 默认给 root 用户的全量管理员 sudo 权限。
这是用户组 sudo 权限配置,%开头代表授权对象是用户组,规则为 %wheel ALL=(ALL) ALL
授权对象:系统的wheel用户组(所有加入这个组的用户,都会继承这条权限)
完整含义:允许 wheel 组内的所有用户,在任意主机上,以系统中任意用户的身份,执行系统里的所有命令。这是 Linux 常用的、给普通用户批量授予管理员权限的方式。
示例:
针对 lisi 用户的配置示例 注意:修改/etc/sudoers使用visudo命令直接回车编辑,它会自动校验语法,避免配置错误导致 sudo 权限锁死,也可以用vi/vim编辑器。
示例 1:给 lisi 单独授予全量 sudo 权限(和 root 一致) 在 sudoers 文件中添加一行:
lisi ALL=(ALL) ALL
效果:lisi 可通过sudo 命令执行所有管理员操作,执行时需要输入 lisi 自己的用户密码。 示例 2:把 lisi 加入 wheel 组,继承组的全量权限 无需修改 sudoers 文件,直接执行终端命令:
usermod -aG wheel lisi
效果:和示例 1 完全一致,适合给多个用户批量授权的场景。 示例 3:给 lisi 免密全量 sudo 权限(执行 sudo 无需输密码) 在 sudoers 文件中添加一行:
lisi ALL=(ALL) NOPASSWD: ALL
效果:lisi 执行 sudo 命令时,无需输入密码,直接获得 root 权限,适合自动化脚本等场景。
| 对比维度 | su 命令 | sudo 命令 |
|---|---|---|
| 权限范围 | 切换到目标用户后,获得该用户的完整权限,无时间限制 | 仅给当前执行的单条命令赋予临时权限,执行完成后立即回收 |
| 密码要求 | 需要输入目标用户(如 root)的密码 | 只需要输入当前用户自己的密码,无需泄露 root 密码 |
| 权限控制 | 无法精细化控制,切换后可执行所有操作 | 可通过配置文件精细化限制用户可执行的命令,权限粒度更细 |
| 日志审计 | 无法审计切换后执行的具体操作 | 所有执行的 sudo 命令都会记录日志,可审计追溯 |
| 适用场景 | 需要长时间执行大量管理员操作的场景 | 临时执行单条 / 少量管理员命令的场景,生产环境首选 |