Linux 零基础入门教程
一本写给"完全没接触过 Linux"的人的教程。 不需要任何基础,只要会开机、会打字,就能从头学到能上手干活。
写给翻开这本书的你
如果你有过下面这些念头,这本书就是为你写的:
- "Linux 是不是很难?我数学不好、英语不好,能学吗?"
- "命令那么多,我记不住怎么办?"
- "网上的教程一上来就是一堆术语,我看两行就懵了。"
- "敲错了会不会把电脑搞坏?"
先给你三个放心的答案:
- 能学。 Linux 常用命令其实只有几十个,而且在真实工作里反复出现的就是那些。你不需要背,你需要的是"知道有这么个东西、用的时候能查回来"。
- 不用背。 这本书里每一条命令都告诉你"它解决什么问题"。只要记住问题,命令忘了随时能查。
- 不会搞坏。 我们会让你在虚拟机里练习。虚拟机是电脑里"模拟出来的一台电脑",你怎么折腾都行,坏了删掉重建,你的真实电脑一点事没有。
这本书和其他教材有什么不一样
| 别的教材常见问题 | 这本书怎么做 |
|---|---|
| 一上来就列命令表,不告诉你为什么 | 每个知识点都先说"它是什么、为什么需要它",再给命令 |
| 术语一个接一个,看不懂就放弃 | 术语第一次出现一定用括号解释,并且尽量配一个生活比喻 |
| 示例只有命令,没有结果 | 每个命令后面都写 # 你会看到:,让你知道自己做对了没有 |
| 不讲新手会踩的坑 | 每章都有"常见坑 ⚠️",专讲最容易错的地方 |
| 看完不知道自己会不会 | 每章末尾有"动手练",附参考答案,自己就能检验 |
怎么用这本书
先看懂标记
- 🔰 必学:所有人都要掌握,后面会反复用到。
- 🔧 进阶:第一遍看不懂可以先跳过,只要知道"有这回事",等用到了再回来。
全书 10 篇、59 章。第一遍建议只学 🔰 章节,🔧 章节当"选修课"。
每章都是同一个结构
每章都长这样,你熟悉一次就够了:
第N章 标题
> 学完这一章,你能:…… ← 每章开头告诉你目标
N.1 小节(先讲人话,再给命令)
N.2 小节
本章小结(一张表,把这一章的东西收拢)
动手练(几道小题 + 参考答案)
学习节奏:一天一章就够
| 每天投入 | 建议 |
|---|---|
| 20~30 分钟 | 学 1 章,把章里的命令全部亲手敲一遍 |
| 45 分钟以上 | 学 2 章,再加 20 分钟做前一章的动手练 |
⚠️ 注意:宁可一天一章敲扎实,不要一天十章看过去。看会了≠会了,手指头敲出来的才算会。
三步学习法(很重要)
- 照着敲:把书里的例子一字不差敲进终端,看结果和书上写的是不是一样。
- 改一改:把文件名、路径、数字改掉再敲一次,看会不会报错、为什么报错。这一步才是真正学东西的地方。
- 合上书重做:不看答案,自己把这道题再做一遍。做不出来就再看一眼,然后接着试。
学习路线图
| 阶段 | 内容 | 学完你能做什么 | 建议用时 |
|---|---|---|---|
| 第 0 步 | 装好实验环境、学会登录 | 能进到 Linux 里,看到命令行 | 半天 |
| 第一阶段 | 第一篇~第四篇(第 1–21 章) | 会用命令行、会看目录、会增删改查文件、会用 vim 改配置 | 5~7 天 |
| 第二阶段 | 第五篇~第六篇(第 22–39 章) | 会建用户、会配权限、会装软件、会压缩解压 | 5~7 天 |
| 第三阶段 | 第七篇~第八篇(第 40–51 章) | 会挂新硬盘、会看系统状态、会排查网络 | 5~7 天 |
| 第四阶段 | 第九篇~第十篇(第 52–59 章) | 会用 grep/sed/awk 处理文本、会开服务、会配防火墙 | 4~6 天 |
一个零基础的人,按每天 1 章的节奏,大约 3~4 周可以把全书 🔰 部分学完。
你需要准备什么
- 一台电脑(Windows 就可以,不需要很新)。
- 一个虚拟机软件:VMware Workstation 或 VirtualBox(免费)。
- 一个 Linux 系统镜像:推荐 CentOS 7(本书示例都用它)或 Ubuntu 22.04。
- 一个远程连接工具:Windows 自带的
cmd或 PowerShell 就够,也可以装 Xshell、MobaXterm。
💡 小贴士:如果装虚拟机对你来说太麻烦,还有一个更省事的办法——用云服务器。很多云厂商有几十块钱一个月的入门配置,甚至学生可以免费领。这样你也不用担心"敲坏了"。
具体怎么装、怎么连,见第 6 章。
遇到问题怎么办(按这个顺序)
- 先看报错。Linux 的报错一般第一行就说了原因,比如
No such file or directory(没有这个文件或目录)、Permission denied(权限不够)。看不懂就把它复制下来去搜。 - 查手册。
命令 --help看简版说明,man 命令看完整手册(按q退出)。 - 搜英文报错原文。中文搜不到就直接搜英文原句,命中率高得多。
- 问人的时候给出三样东西:完整命令、完整报错、你期望的结果。
三个心态提醒
- 看不懂命令的语法,是正常的。 你们学开车的时候也不会先学发动机原理。先照着开,开着开着就懂了。
- 报错是好东西,不是失败。 每一条报错都在告诉你"哪里不对"。熟练的人的差别不是不报错,而是会看报错。
- 一定要动手。 这本书最大的价值不是读,是让你在终端里敲出第一个
ls、第一次看到自己的文件。今天就去敲。
目录
第一篇 认识 Linux
- 第1章 Linux 到底是什么 🔰
- 第2章 Linux 能用来做什么 🔰
- 第3章 我该选哪个版本 🔰
- 第4章 Linux 和 Windows 有什么不一样 🔰
- 第5章 Linux 的三个核心思想 🔰
第二篇 走进 Linux
- 第6章 第一次登录 Linux 🔰
- 第7章 看懂终端里那行字 🔰
- 第8章 命令是怎么组成的 🔰
- 第9章 认识目录树:文件都放在哪 🔰
- 第10章 必学的五个基础命令 🔰
第三篇 文件和目录
- 第11章 创建文件与文件夹:touch 和 mkdir 🔰
- 第12章 复制、移动、重命名:cp 和 mv 🔰
- 第13章 删除:rm 🔰
- 第14章 查看文件内容:cat、more、less、head、tail 🔰
- 第15章 软链接与硬链接 🔧
- 第16章 通配符和花括号:一次处理一批文件 🔰
- 第17章 重定向和管道 🔰
- 第18章 键盘上的省力技巧 🔰
第四篇 文本编辑:vi / vim
- 第19章 vi 是什么,为什么非学不可 🔰
- 第20章 vim 常用的三种模式与切换 🔰
- 第21章 十个够用的 vim 操作 🔰
第五篇 用户和权限
- 第22章 为什么要分用户 🔰
- 第23章 用户管理:useradd、passwd、su、id 🔰
- 第24章 组是什么 🔰
- 第25章 权限的三个字母 rwx 🔰
- 第26章 看懂 ls -l 的输出 🔰
- 第27章 修改权限 chmod 🔰
- 第28章 修改属主和属组:chown、chgrp 🔰
- 第29章 umask:新文件的默认权限 🔧
- 第30章 三个特殊权限 🔧
- 第31章 隐藏权限:chattr 和 lsattr 🔧
- 第32章 ACL:给某个用户单独开小灶 🔧
- 第33章 sudo:临时借用 root 的权力 🔰
第六篇 装软件
- 第34章 Linux 装软件的四种方式 🔰
- 第35章 yum:最常用的装软件方式 🔰
- 第36章 配置 yum 源 🔰
- 第37章 rpm:直接安装单个安装包 🔧
- 第38章 源码编译安装 🔧
- 第39章 压缩和解压 🔰
第七篇 磁盘管理
- 第40章 磁盘、分区、格式化、挂载:四个词一次讲清 🔰
- 第41章 分区:fdisk 与 gdisk 🔧
- 第42章 格式化:mkfs 🔧
- 第43章 挂载:mount、umount 与 /etc/fstab 🔧
- 第44章 swap 交换分区 🔧
- 第45章 LVM:能变大变小的硬盘 🔧
- 第46章 RAID:多块硬盘合作 🔧
第八篇 日常运维命令
- 第47章 查看系统状态 🔰
- 第48章 进程管理 🔰
- 第49章 网络排查 🔰
- 第50章 find:按条件找文件 🔰
- 第51章 history 和 alias 🔰
第九篇 文本三剑客
- 第52章 grep:从一堆文字里挑出你要的 🔰
- 第53章 sed:批量改文字 🔰
- 第54章 awk:按列取数据 🔰
- 第55章 正则表达式入门 🔧
第十篇 服务、网络与防火墙
- 第56章 systemctl:管理服务的开关 🔰
- 第57章 配置网络 🔰
- 第58章 防火墙 🔰
- 第59章 常见基础服务一览 🔧
附录
- 附录A 命令速查表
- 附录B 常见报错与解决办法
- 附录C 学习路线与下一步
- 附录D 原始文档整理说明(勘误)
第一篇 认识 Linux
这一篇不讲命令,只讲"Linux 到底是个什么东西"。 看似没用,其实最有用——概念没清,后面每一条命令都会背得痛苦。
第1章 Linux 到底是什么 🔰
学完这一章,你能:用自己的话向别人解释 Linux 是什么,以及为什么它既叫"内核"又叫"操作系统"。
1.1 先说操作系统是什么
一台电脑,从你按下电源键到能用鼠标点东西,中间有一层东西在干活:它要管屏幕亮不亮、管键盘按了哪个键、管文件存在哪、管程序怎么抢 CPU。
这层东西就是操作系统。
比喻:把电脑想成一家公司。 硬件(CPU、内存、硬盘)是员工,只会闷头干活,不会自己安排工作。 操作系统就是总经理:它安排谁干什么、什么时候干、干多久,还负责对接外面的人(你)。 Windows 是总经理,Linux 也是总经理,只是两个总经理的管理风格不一样。
所以你平常用的 Windows、手机上的安卓、苹果的 macOS,都是操作系统。
1.2 Linux 这个名字,其实有两种意思
这是所有初学者第一个绕不过去的点,一定要分清。
狭义上的 Linux:只是"内核"。
内核(kernel)是操作系统里最核心的那一小块程序,它只干四件事:
| 内核管什么 | 通俗说 |
|---|---|
| 管进程 | 哪个程序先用 CPU,用多久 |
| 管内存 | 谁用哪段内存,用完收回 |
| 管硬件 | 硬盘、网卡、显卡怎么驱动 |
| 管文件 | 文件怎么存到硬盘、怎么读出来 |
广义上的 Linux:一整套能用的操作系统。
光有内核,你是什么都干不了的——没有 ls、没有 cd、没有编辑器的界面。所以真正交到你手上的"Linux",是内核 + 一大堆配套软件打包在一起的成品。
比喻:Linux 内核是发动机。 光有一台发动机,你开不走。要装上车架、轮子、方向盘、座椅,才是一辆能开的车。 这些"整车",就叫发行版(distribution,简称"发行版")。第 3 章专门讲怎么挑。
严格来说,我们日常用的这一整套,叫 GNU/Linux:
- GNU:一个开源软件组织,提供了大量基础工具(我们后面要用的
ls、cd、cat都是它家的)。 - Linux:Linus Torvalds 在 1991 年写的内核。
💡 小贴士:以后看到 "GNU/Linux" 这个写法,别觉得奇怪,它是在说"内核是 Linux,工具是 GNU 的"。
1.3 Linux 是怎么来的(一分钟版本)
- 1970 年前后,美国贝尔实验室做了一个叫 Unix 的操作系统,非常好用,但价格贵、还闭源。
- 1980 年代,麻省理工的 Richard Stallman(斯托曼) 发起 GNU 计划,想做一个完全自由的操作系统,工具都写好了,就差内核。
- 1991 年,芬兰大学生 Linus Torvalds(林纳斯) 写了一个内核,发在学校 BBS 上,起名 Linux。
- 两边一凑,GNU 的工具 + Linux 的内核 = 一套完整免费的操作系统。
它为什么能火?因为它开源、免费。
开源的意思是:作者把程序的源代码(人能看懂的代码)公开出来,任何人都能看、能改、能再发布。于是全世界的程序员都往里加东西,它就越做越好。
1.4 为什么全世界的服务器都在用 Linux
- 全球 90% 以上的服务器运行 Linux。
- 你手机里的安卓系统,内核就是 Linux。
- 路由器、智能电视、车机、工业机器人、超级计算机,大量在用 Linux。
原因就三条:免费、稳定、可定制。服务器一开机就要跑好几年不重启,Windows 做不到,Linux 可以。
本章小结
| 概念 | 一句话解释 |
|---|---|
| 操作系统 | 管理硬件和软件资源的"总经理" |
| 内核(kernel) | 操作系统最核心的一小块,管进程、内存、硬件、文件 |
| Linux(狭义) | 只是那个内核 |
| Linux(广义) | 内核 + 一堆配套软件,也就是我们真正在用的系统 |
| 发行版 | 把内核和软件打包好的成品,比如 CentOS、Ubuntu |
| 开源 | 源代码公开,谁都能看能改能再发布 |
动手练
- 用自己的话说一遍:为什么"Linux 只是一个内核"却不能直接拿来用?
- 你手机的操作系统内核可能是什么?
- 判断题:Linux 是 Unix。(说说你的理由)
参考答案
- 因为内核只负责管 CPU、内存、硬件、文件这些底层工作,没有给人用的命令、没有界面,也没有配套工具。必须先打包一堆软件,才能变成"能用的操作系统"。
- 安卓手机的内核是 Linux。(顺便说一句,苹果的 macOS 和 iOS 走的是另一条路:Unix → macOS/iOS。所以"类 Unix 系统"有两个大分支:Unix 那一支和 Linux 这一支。)
- 错。Linux 是类 Unix(Unix-like)系统——借鉴了 Unix 的设计思想,但不是从 Unix 的代码改出来的。真正从 Unix 代码派生出来的是 macOS、iOS 这一支。
第2章 Linux 能用来做什么 🔰
学完这一章,你能:说出 Linux 主要用在哪几个地方,以及学会它能找什么样的工作。
2.1 服务器:Linux 的主战场
服务器就是"专门给别的电脑提供服务的电脑":网站、App 后台、数据库、文件存储,都跑在服务器上。
你在浏览器打开一个网页,背后可能是几十台 Linux 服务器在干活。银行、电商、12306 抢票、微信消息,全在 Linux 上跑。
2.2 云计算和容器
现在说的"云服务器""阿里云/腾讯云/AWS",绝大多数底层是 Linux。
你可能听过 Docker、Kubernetes(K8s)这些词——它们全是跑在 Linux 上的技术。学 Linux 是学云计算的前置条件。
2.3 你口袋里的安卓手机
安卓系统的内核就是 Linux。所以严格说,你早就在用 Linux 了,只是它被包装得很漂亮。
2.4 各种智能设备(嵌入式)
路由器、机顶盒、智能音箱、汽车中控、工业机器人、ATM 机、POS 刷卡机……这些设备里塞不下 Windows,但它们塞得下 Linux。这类开发叫嵌入式开发。
2.5 超级计算机
全世界跑得最快的那些超级计算机,操作系统几乎清一色是 Linux。因为只有开源才能把它们改到极致。
2.6 学完 Linux 能找什么工作
| 岗位 | 干什么 | 和 Linux 的关系 |
|---|---|---|
| 运维工程师 / Linux 运维 | 管服务器、装软件、排故障、做备份 | 天天用,最直接对口 |
| 云计算工程师 | 管云平台、容器、自动化部署 | 必会 |
| 网络工程师 | 配网络、防火墙、路由 | 要会用 Linux 配网络 |
| 测试 / 开发 | 部署环境、看日志 | 必须会基本命令 |
| 大数据 / 人工智能 | 装集群、跑任务 | 服务器全是 Linux |
| 安全工程师 | 渗透测试、日志分析 | Kali 就是 Linux |
💡 小贴士:就算你不打算做运维,只要你的工作会碰到"服务器"这两个字,Linux 就是绕不过去的门槛。
本章小结
| 场景 | 说明 |
|---|---|
| 服务器 | 90% 以上,Linux 的主战场 |
| 云与容器 | 云主机、Docker、K8s 的底层 |
| 安卓 | 手机内核就是 Linux |
| 嵌入式 | 路由器、车机、工业设备 |
| 超级计算机 | 几乎全是 Linux |
动手练
- 举三个你身边可能正在运行 Linux 的设备。
- 为什么智能设备喜欢用 Linux,而不是 Windows?
- 如果你以后想做运维,这本书哪些部分最重要?
参考答案
- 参考:家里的路由器、安卓手机、智能电视/机顶盒。任何三个合理答案都可以。
- 因为 Linux 免费、可裁剪(只要内核和必需的工具,能做得非常小)、开源可定制,而且对硬件要求低、能长期稳定运行。Windows 体积大、要授权费、不适合深度剪裁。
- 第五篇(用户与权限)、第六篇(装软件)、第八篇(系统状态与排查)、第十篇(服务与网络)这几篇最常用,第一篇到第四篇是它们的地基。
第3章 我该选哪个版本 🔰
学完这一章,你能:认识常见的 Linux 发行版,并知道自己该装哪一个。
3.1 发行版是什么
第 1 章说过:内核是发动机,发行版是整车。同一个内核,不同厂家装出来的车,牌子、配置、用法都有差别。
这些"牌子"就叫发行版(distribution)。目前主流的可以分成两大流派,区别主要在装软件的工具不一样:
| 流派 | 代表系统 | 装软件命令 | 安装包后缀 |
|---|---|---|---|
| Red Hat 系(红帽系) | RHEL、CentOS、Rocky、Alma、麒麟、openEuler | yum 或 dnf |
.rpm |
| Debian 系(德班系) | Debian、Ubuntu、Kali、Deepin、UOS | apt |
.deb |
⚠️ 注意:这是新手最容易搞混的地方——网上的教程如果用的是
apt,而你的系统是 CentOS,那么apt install在你这儿就是不存在的命令。学习时一定要先确认教程是哪个流派。
3.2 Red Hat 系(国内企业最多)
| 发行版 | 是什么 | 一句话评价 |
|---|---|---|
| RHEL | 红帽企业版,收费但提供支持 | 企业正式用它,但个人不便宜 |
| CentOS | RHEL 的免费社区版(与 RHEL 高度兼容) | 以前最流行的学习/服务器选择 |
| CentOS Stream | CentOS 的新形态,是 RHEL 的"上游测试版" | 比 RHEL 更新,稳定性略低 |
| Rocky Linux | 原 CentOS 创始人另起炉灶,与 RHEL 兼容 | CentOS 停更后的主流替代 |
| AlmaLinux | 另一个 RHEL 兼容版 | 同上,可与 Rocky 二选一 |
| Fedora | 红帽的个人版,技术新但更新快 | 想体验新东西可以玩,不适合服务器 |
| Kylin(麒麟) | 国产,政务/金融常见 | 国产化项目会碰到 |
| openEuler(欧拉) | 华为主导,国产服务器系统 | 国内服务器新项目常见 |
💡 关于 CentOS 7:CentOS 7 已于 2024 年 6 月停止维护。但国内大量存量服务器和教材还在用它,而且它足够老、足够稳定、资料最多,所以本书的示例以 CentOS 7 为准。学完换 Rocky 9 / Ubuntu 只是换几条命令的事。
3.3 Debian 系
| 发行版 | 是什么 | 一句话评价 |
|---|---|---|
| Debian | 社区维护,追求稳定 | 稳定到有点"旧",服务器上很常见 |
| Ubuntu | 基于 Debian,对新手最友好 | 最推荐的入门选择,资料最全 |
| Kali Linux | 基于 Debian,预装大量安全工具 | 搞网络安全用的,不适合日常 |
| Deepin(深度)/ UOS(统信) | 国产,桌面做得漂亮 | 国产桌面办公会碰到 |
3.4 Ubuntu 的版本号怎么读
Ubuntu 一年发两个版本,版本号是"年份.月份":
Ubuntu 20.04= 2020 年 4 月发布Ubuntu 22.04= 2022 年 4 月发布Ubuntu 24.04= 2024 年 4 月发布
偶数年的 4 月版本(.04 结尾)是长期支持版(LTS),一般支持 5 年。装系统优先选 LTS。
3.5 那到底装哪个?
| 你的情况 | 建议 |
|---|---|
| 完全新手,想少踩坑,资料多 | Ubuntu 22.04 LTS |
| 跟本书学、以后要进企业做运维 | CentOS 7(与本书一致),或 Rocky 9 |
| 公司/项目指定 | 按公司要求(国产化项目可能是麒麟、统信) |
| 想学网络安全 | 先学 Ubuntu,熟悉后再用 Kali |
⚠️ 注意:不用纠结。Linux 的内核、命令、目录结构、权限模型在所有发行版里是一样的,差别主要在"装软件"和"配网络"。学会一个,换另一个只需要一两天。
本章小结
| 概念 | 要点 |
|---|---|
| 发行版 | 内核 + 软件的打包成品,有很多"牌子" |
| 两大流派 | 红帽系(yum/rpm)、Debian 系(apt/deb) |
| 新手首选 | Ubuntu 22.04 LTS |
| 本书示例 | CentOS 7 |
| 版本号 | Ubuntu 用"年份.月份",选 .04 LTS |
动手练
- 一个教程写着
sudo apt install nginx,另一个写着sudo yum install nginx,分别适合什么系统? - Ubuntu 24.04 是哪年哪月发布的?是长期支持版吗?
- 判断题:学会 CentOS 之后,Ubuntu 的命令要从头再学一遍。
参考答案
apt用于 Debian 系(Ubuntu、Debian、Kali);yum用于红帽系(CentOS、RHEL、Rocky、麒麟)。- 2024 年 4 月发布;是 LTS(长期支持版)。
- 错。绝大部分命令(
ls、cd、chmod、ps……)完全通用,只有装软件(yum/apt)和部分网络配置文件的写法不同。
第4章 Linux 和 Windows 有什么不一样 🔰
学完这一章,你能:说出 Linux 和 Windows 最关键的 6 个差别,避免把 Windows 的习惯带到 Linux 里。
4.1 一张表看懂
| 对比项 | Windows | Linux |
|---|---|---|
| 桌面 | 必须用鼠标点 | 用命令行敲(也能装桌面) |
| 盘符 | C 盘、D 盘 | 没有盘符,所有东西都在 / 下面 |
| 大小写 | 文件名不区分大小写 | 区分大小写(Tom.txt 和 tom.txt 是两个文件) |
| 扩展名 | 靠 .exe 判断能不能运行 |
扩展名只是名字,能不能运行看权限 |
| 装软件 | 下载 exe 双击下一步 | 从软件仓库一条命令安装(yum/apt) |
| 权限 | 管理员提示一下就过去了 | 严格,普通用户干不了管理员的事 |
| 回收站 | 有 | 往往没有(rm 删了就没了) |
| 开关机 | 天天关 | 服务器常年不关机 |
下面挑最容易出事的几个详细说。
4.2 没有 C 盘 D 盘,所有东西都在 / 下面
Windows 里,文件可能放在 C:\Users\Tom\file.txt。Linux 里没有 C: 这种东西,所有硬盘、所有文件,都被"挂"在一棵以 /(读作"根")开始的树上。
# 看看根目录下有什么
ls /
# 你会看到类似这样:
bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
具体每个目录是干什么的,第 9 章会一个个讲。这里只要记住一句话:没有盘符,只有一个 /。
4.3 Linux 区分大小写!
这是新手第一周最常见的事故来源。
在 Linux 里:
File.txt、file.txt、FILE.TXT是三个完全不同的文件。- 命令也是:
ls能运行,LS会报错command not found。
⚠️ 注意:敲命令和写文件名时,照着书上一字不差地敲,别自己"顺手"改大小写。
4.4 没有回收站,rm 删了就是删了
在 Windows 里删文件,它进回收站,你反悔了还能还原。
Linux 命令行里的 rm 直接删掉,不进回收站。而且它不会问你"确定吗"。
⚠️ 注意:第 13 章会专门讲怎么安全地删。现在先记住一句:执行
rm -rf之前,先把命令念一遍再说。
4.5 权限很严格
在 Windows 里,你平时是管理员,装软件、改系统设置一般点个"是"就过了。
Linux 里分得很清楚:平时你就是个普通用户,很多事干不了;需要管理员权限时,要在命令前面加 sudo,然后输入自己的密码。
这不是 Linux 不友好,恰恰是它安全的原因——服务器上的一个误操作,可能让整个公司的业务挂掉。
# 普通用户想改系统配置,会被拒绝
cat /etc/shadow
# 你会看到:
cat: /etc/shadow: 权限不够
# 借用管理员身份来做
sudo cat /etc/shadow
# 输入你自己(当前用户)的密码后,就能看了
💡 小贴士:这里第一次见到
#开头的注释和sudo,不用深究,第 33 章讲 sudo,第 25 章讲权限。
4.6 靠命令行干活,而且效率极高
Linux 当然也能装图形界面,但服务器上通常不装,因为图形界面占内存、还容易出问题。
用命令行的好处是:能批量、能组合、能写成脚本自动跑。
举个直观的例子——你要找出 /var/log 下面今天改过的所有 .log 文件:
- 用鼠标:一个个文件夹点开,看重的时间……点到天黑。
- 用命令:一行,几秒钟。
find /var/log -name "*.log" -mtime -1
这就是为什么学 Linux 必须学命令行——它不是"高级玩法",它就是 Linux 的日常方式。
本章小结
| 差别 | 记住这句话 |
|---|---|
| 盘符 | 没有 C/D 盘,只有 / 一棵树 |
| 大小写 | 区分!Tom ≠ tom,LS ≠ ls |
| 回收站 | rm 删了就没有了 |
| 权限 | 严格,不够权要 sudo |
| 装软件 | 从软件仓库一条命令装 |
| 操作方式 | 命令行为主,能批量、能自动化 |
动手练
- 判断题:在 Linux 里
Data.txt和data.txt是同一个文件。 - 为什么服务器通常不装图形界面?
- 你在 Windows 里习惯"复制到 D 盘备份",在 Linux 里这句话要改成什么说法?
参考答案
- 错。Linux 区分大小写,两个不同的文件。
- 图形界面占内存和 CPU、组件多容易出问题、远程操作也不方便;命令行更轻、更稳、还能自动化。
- Linux 没有 D 盘,要"复制到某个目录",比如
cp 文件 /data/备份/——这里的/data是根目录下一个叫 data 的文件夹(它的背后可能是一块单独的硬盘)。
第5章 Linux 的三个核心思想 🔰
学完这一章,你能:理解 Linux 的设计逻辑,后面学命令时"秒懂"很多设计为什么是这样。
这三句话是 Linux 的"世界观"。第一次听可能没什么感觉,学完第三篇再回来看,你会发现处处都在印证它们。
5.1 一切皆文件
Linux 里,几乎所有东西都被当成"文件"来管理:
| 你以为是 | Linux 当作 |
|---|---|
| 一块硬盘 | 文件 /dev/sda |
| 一个 U 盘 | 文件 /dev/sdb |
| 键盘、鼠标 | 文件 /dev/input/... |
| 屏幕上要显示的字符 | 文件 |
| 一个正在运行的程序 | 文件 /proc/数字/ |
| 网卡 | 文件 |
有什么好处? 既然都是文件,那么一套读写文件的命令,就能操作所有东西。查看磁盘信息可以用 cat /proc/...,往设备里写数据也是"写文件",简单统一。
比喻:这就像一个公司把所有事项都办成"一份文件走流程"。不管你是请假、报销还是领电脑,都是填表走流程。规矩统一,好管。
5.2 一个命令只干一件事,组合起来干大事
Linux 的命令都很"小":ls 只负责列文件,grep 只负责按关键字过滤,awk 只负责按列取数。它们单个都很简单,但能用管道 | 串起来。
管道的含义很直白:把前一个命令的输出,直接交给后一个命令当输入。
# 需求:只看当前系统里正在监听的网络端口
ss -lnutp
# 输出很多,看着累
# 组合起来:只保留含 sshd 的那几行
ss -lnutp | grep sshd
# 你会看到类似:
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=987,fd=3))
比喻:就像流水线。工位 A 只管拧螺丝,工位 B 只管装盖子,一个产品从 A 传到 B,最后出来的是成品。没有哪个工人会干全部的活,但流水线能干出很复杂的活。
这个思想会在第 17 章(管道)和第九篇(文本三剑客)里反复用到。
5.3 尽量少交互
"交互"就是"命令停下来等你按个 y 或 n"。
Linux 的设计倾向于:别停下来问我,要问就让我提前在命令里写好答案。
# 会停下来问你 "Is this ok [y/N]: ",要手敲 y 回车
yum install nginx
# 加 -y,表示"所有问题都替我回答 yes",一路装到底
yum install -y nginx
好处:可以把它写成脚本,让机器半夜自己跑,不用人守着。这也是"自动化运维"的基础。
5.4 顺带说说:开源和许可证
既然 Linux 是开源的,那"开源"到底是怎么规定的?靠许可证(License)。你只需要知道最常见的三种:
| 许可证 | 通俗理解 | 典型代表 |
|---|---|---|
| GPL | 你用了我的开源代码,你的程序也必须开源(有"传染性") | Linux 内核 |
| MIT | 随便用,保留版权声明就行,可以闭源、可以商用 | Vue、React、Redis |
| Apache 2.0 | 比 MIT 多一条:改动过的文件要说明 | Hadoop、Kubernetes |
💡 小贴士:做开发的同学要注意——GPL 的代码不能随便用进闭源的商业软件,否则可能被要求开源。这是真实存在的法律风险。
本章小结
| 核心思想 | 一句话 | 后面的章节 |
|---|---|---|
| 一切皆文件 | 硬盘、网卡、程序都是文件,一套命令都能操作 | 第 9 章、第 40 章 |
| 小命令 + 组合 | 每个命令只干一件事,用管道串起来干大事 | 第 17 章、第九篇 |
| 尽量少交互 | 用参数提前回答,方便自动化 | 第 35 章、第 50 章 |
| 开源许可证 | GPL 有传染性、MIT 最宽松 | — |
动手练
- 判断题:既然"一切皆文件",那用
cat命令读一块硬盘的数据,理论上是可行的。 - 用一句话解释管道
|是干什么的。 yum install和yum install -y的区别是什么?为什么运维更喜欢后一种?
参考答案
- 对。硬盘在 Linux 里就是
/dev/sda这样的文件,cat /dev/sda确实能读出二进制数据(但会刷满屏幕,实践中用dd等工具)。 - 管道把前一个命令的输出,交给后一个命令当输入,像流水线一样把两个简单命令拼成复杂功能。
yum install会中途停下来问你是否确认;yum install -y自动回答"是"。运维喜欢后一种,因为可以在脚本里无人值守地批量安装。
第二篇 走进 Linux
这一篇开始真正动手。你会第一次登进 Linux,看懂那个黑窗口里每一段字的意思, 然后学会最基本的几个命令。别怕敲错——在虚拟机里,敲坏了删掉重来就是。
第6章 第一次登录 Linux 🔰
学完这一章,你能:把自己"送进"Linux 系统,干完活再安全地退出来。
6.1 登录,就是进自己家的门
Linux 是一台"多人共用"的机器,每个人有自己的账号和密码,像一栋楼里每户人家有自己的钥匙。 登录 = 交出名字和密码,系统确认"哦,是你",然后把工作台交给你。
进 Linux 有两扇门:本地登录(人坐在虚拟机屏幕前直接敲)和远程登录(用你自己的 Windows 电脑,通过网络连服务器)。日常干活 99% 是远程。
6.2 本地登录:开机后出现 login:
系统启动完,屏幕最后一行会停下来等你:
# 屏幕显示(光标在冒号后闪):
localhost login:
# 输入用户名 root,回车,接着出现:
Password:
这时你敲键盘,屏幕上一个字符都不显示。不是键盘坏了,是 Linux 故意不显示密码,防止偷看。 把密码敲完回车,对了就会看到:
[root@localhost ~]#
这行字叫提示符,意思是"我准备好了,请下命令"。第7章会逐字拆解它。
💡 小贴士:root 的密码是装系统时设的。密码区分大小写,
Abc123和abc123不是一回事。
6.3 远程登录:用自己电脑连服务器
在 Windows 上按 Win + R,输入 cmd 回车,打开命令提示符,然后敲:
ssh root@192.168.8.120
# 第一次连接会看到:
The authenticity of host '192.168.8.120' can't be established.
Are you sure you want to continue connecting (yes/no)?
这里输入 yes 再回车(必须打完整的 yes,只打 y 不算),然后输入密码,看到下面这行就成功了:
[root@Server120 ~]#
💡 小贴士:SSH 就像给服务器打了个电话。电话通了,你的键盘和屏幕就接到服务器上;挂掉电话(关窗口),服务器还在跑,活也没停。
6.4 干完活,怎么退出
exit
# 远程登录时你会看到:
Connection to 192.168.8.120 closed.
6.5 常见坑 ⚠️
- 密码敲了没反应:正常,接着敲完回车,别反复按回车。
#不是让你敲的:[root@localhost ~]#整行都是提示符,命令从#后面的空格开始。- 登录失败别连试十次:有些系统会锁账号,先检查用户名大小写和键盘布局。
- 远程连不上:先
ping 服务器IP,网络不通时输多少次密码都没用。
本章小结
| 操作 | 命令/现象 | 说明 |
|---|---|---|
| 本地登录 | localhost login: root |
输密码时屏幕无显示是正常的 |
| 登录成功 | [root@localhost ~]# |
出现提示符才能敲命令 |
| 远程登录 | ssh root@服务器IP |
第一次要输入完整的 yes |
| 退出登录 | exit |
关掉当前连接 |
动手练
- 用自己的话说明:为什么输入密码时屏幕上什么都不显示?
- 远程登录 IP 为
192.168.8.120的服务器,用户名 root,写出完整命令。 - 登录成功后,看屏幕上什么位置能判断"可以开始敲命令了"?
参考答案:
- 防止旁边的人看到密码,Linux 连星号都不显示,这是正常的,照常输完回车即可。
ssh root@192.168.8.120;第一次连接输入yes,再输入 root 密码。- 看有没有出现提示符
[root@Server120 ~]#,光标在最右边闪,就可以敲命令了。
第7章 看懂终端里那行字 🔰
学完这一章,你能:一眼看出"我是谁、我在哪台机器上、我站在哪个文件夹",不再对着提示符发懵。
7.1 提示符:终端在"问你话"
登录成功或敲完一条命令后,屏幕上总有一行字停在那里,光标在最后闪:
[root@localhost ~]#
这行字不是命令,也不是报错,它叫提示符。它其实在回答三个问题:你是谁、你在哪台机器上、你现在站在哪个文件夹里。
把它想成电梯里的楼层显示屏:告诉你现在在几层、能去哪几层,看懂了才不会按错按钮。
7.2 逐段拆解 [root@localhost ~]#
| 片段 | 含义 | 举例 |
|---|---|---|
[ ] |
把提示符框起来,没实际作用 | — |
root |
当前登录的用户名 | 普通用户 tom 显示 tom |
@ |
分隔符,读作"在" | — |
localhost |
主机名,这台机器叫什么 | 也可能叫 Server120 |
~ |
当前所在文件夹,~ 是家目录 |
在 /etc 时显示 etc |
# |
权限标志,# = root,$ = 普通用户 |
见 7.3 |
| 最后空格 | 光标停在这,等你敲命令 | — |
注意:提示符里的文件夹只显示最后一段名字。站在 /etc/sysconfig/network-scripts 时,它只显示 network-scripts。想看完整路径,敲 pwd。
7.3 # 和 $:一眼看出自己的权限
[root@localhost ~]# # root 用户,最高权限,能改任何东西
[tom@localhost ~]$ # 普通用户 tom,权限受限
- 看到
#,说明你是 root,这时的命令都是"没有保险的命令",删除、改配置直接生效,慢点敲。 - 看到
$,说明你是普通用户。有些操作报"权限不够"不是你敲错了,是权限不够(第33章用 sudo 解决)。
⚠️ 注意:
#在配置文件里还有另一个身份——"注释",表示这一行不算数。提示符里的#只是装饰。
7.4 用命令验证提示符里的信息
whoami
# 你会看到:
root
hostname
# 你会看到:
localhost
pwd
# 你会看到:
/root
三行输出正好对应提示符的三段:用户名、主机名、所在文件夹。pwd 输出 /root,这就解释了为什么提示符里写 ~——root 的家目录就是 /root。
7.5 常见坑 ⚠️
- 把提示符一起复制进终端:网上抄命令时连
[root@localhost ~]#一起粘进去,必然报command not found。只复制#后面那部分。 - 以为
~是根目录:~是家目录(root 是/root,普通用户是/home/用户名),根目录是/,两码事。 - 提示符变了就慌:
[root@localhost etc]#只是你进了/etc,不是出错。
本章小结
| 你看到的 | 含义 | 记法 |
|---|---|---|
root |
当前用户名 | @ 前面 |
localhost |
主机名 | @ 后面 |
~ |
家目录 | root → /root |
etc |
当前在 /etc(只显示最后一段) |
用 pwd 看全路径 |
# |
超级管理员 root | 危险,慢点敲 |
$ |
普通用户 | 权限受限 |
动手练
- 提示符是
[root@localhost ~]#,现在你是哪个用户?用命令验证。 - 这个
~具体是哪个文件夹?用命令证明。 - 提示符变成
[tom@localhost ~]$,你能判断出哪两件事?
参考答案:
whoami,输出root。pwd,输出/root——root 的家目录就是/root。- ① 当前是普通用户 tom(
$号);② 你在名为 localhost 的机器上,站在 tom 的家目录/home/tom里。
第8章 命令是怎么组成的 🔰
学完这一章,你能:把一条命令拆成"命令、选项、参数"三块看懂,敲错了知道错在哪。
8.1 一条命令 = 命令 + 选项 + 参数
在饭馆点菜:"来一碗牛肉面,大份,不要香菜"。牛肉面是命令(要做的事),大份是选项(怎么做的细节),不要香菜是参数(对谁做)。
格式固定成一句话:命令 选项 参数,中间用空格隔开。比如 ls -l /etc:命令 ls、选项 -l、参数 /etc。
8.2 最小可用写法 + 完整示例
ls -l /tmp
# 你会看到(每个文件一行,含权限、大小、时间):
总用量 4
-rw-r--r--. 1 root root 12 10月 30 18:40 a.txt
drwxr-xr-x. 2 root root 6 10月 30 18:35 dir1
只要记住三件事:命令必须存在、选项必须真实、参数(路径)必须存在,三者有一个不对就报错。
8.3 短选项和长选项
同一个功能通常有两种写法,效果一样:
| 短选项 | 长选项 | 作用 |
|---|---|---|
-a |
--all |
显示所有文件,含隐藏文件 |
-h |
--human-readable |
文件大小带单位(K/M/G) |
-l、-a、-h 是新手最先要记的三个。短选项可以合并:ls -l -a = ls -la = ls -al;长选项不能合并,要一个一个写。
8.4 命令敲错了,会看到什么
| 屏幕上的报错 | 意思 | 怎么改 |
|---|---|---|
command not found |
没这个命令 | 拼错、大小写错,或软件没装 |
invalid option |
没这个选项 | 查 --help,别自己猜 |
No such file or directory |
文件或路径不存在 | 用 ls 看路径在不在 |
Permission denied |
权限不够 | 不是敲错,是权限问题(第25章) |
Linux 区分大小写:ls 能跑,LS、Ls 一律 command not found。
8.5 忘了怎么用:--help 和 man
ls --help # 一屏英文帮助,列出所有选项
man ls # 帮助手册:空格翻页,q 退出,/name 搜索
--help 短平快,man 详细权威。新手先看 --help,基本够用。
8.6 常见坑 ⚠️
ls-l中间没空格:整串被当成一个命令名,报command not found。- 中文输入法没切:打出全角空格
、中文逗号,,终端不认,报的错还看不出原因。 - 复制带提示符:连
#一起粘进去,等于让 shell 去找一个叫#的命令。
本章小结
| 成分 | 作用 | 例子 |
|---|---|---|
| 命令 | 做哪件事 | ls、pwd、cd |
| 选项 | 怎么做的细节,一般带 - |
-l、-a、--all |
| 参数 | 对谁做(文件/目录) | /etc、a.txt |
--help |
短帮助 | ls --help |
man |
手册,q 退出 |
man ls |
动手练
ls -lh /etc里,命令、选项、参数分别是什么?- 想让
ls同时显示隐藏文件和详细信息,最短怎么写? - 为什么
ls -l(中间是全角空格)会报错?
参考答案:
- 命令
ls,选项-lh(=-l+-h),参数/etc。 ls -la(或ls -al)。- 全角空格
和英文空格不是同一个字符,shell 不把它当分隔符,整串被当成一个命令,所以报command not found。
第9章 认识目录树:文件都放在哪 🔰
学完这一章,你能:像查门牌号一样,用路径准确说出"某个文件在哪",不再到处乱翻。
9.1 Linux 里只有一棵树
Windows 有 C 盘、D 盘、U 盘,各是各的"独立王国"。Linux 不一样:所有东西都挂在唯一的一棵树下面,这棵树的树根叫根目录,写法是一个斜杠 /,所有文件夹、硬盘、U 盘都从 / 往下长:
/
├── etc 配置文件
├── home 普通用户的家
├── root root 的家
├── usr 软件安装的地方
└── var 日志、数据
💡 小贴士:U 盘插进 Linux 后不是多出一个"F 盘",而是被挂载到某个文件夹上(比如
/media),那个文件夹就代表这个 U 盘。
9.2 根目录下各文件夹是干什么的
| 文件夹 | 放什么 | 新手会碰到的例子 |
|---|---|---|
/etc |
系统和服务的配置文件 | /etc/passwd、网卡配置 |
/home |
普通用户的家目录 | /home/tom |
/root |
root 的家目录 | 只有 root 能进 |
/usr |
系统和软件的程序文件 | /usr/bin/ls |
/var |
经常变的数据:日志、数据库 | /var/log/messages |
/tmp |
临时文件,谁都能写 | 练习文件放这 |
不用背,先记住:/etc 改配置、/var/log 看日志、/home 放自己的东西、/tmp 随便练。
9.3 绝对路径:从 / 开始说
绝对路径 = 从根目录 / 一路写下来,不管你现在在哪,它都指向同一个地方。
cd /etc/sysconfig/network-scripts
pwd
# 你会看到:
/etc/sysconfig/network-scripts
9.4 相对路径:相对于"我现在在哪"
相对路径 = 不以 / 开头,从你当前站的位置算起。三个符号先记牢:
| 写法 | 意思 | 例子 |
|---|---|---|
. |
当前目录 | ./a.txt = 当前目录下的 a.txt |
.. |
上一级目录 | cd .. 回上一层 |
../.. |
上两级 | cd ../.. 回上两层 |
cd /etc/sysconfig
cd network-scripts # 相对路径:进 /etc/sysconfig 下的 network-scripts
pwd
# 你会看到:
/etc/sysconfig/network-scripts
9.5 常见坑 ⚠️
cd /root和cd root完全不同:前者是根目录下的 root 文件夹,后者是当前目录里名叫 root 的子文件夹。..别写成.:cd ..是上一层,cd .是原地不动,你会觉得"没反应"。- 在根目录再
cd ..:/的上一层还是/,不报错,容易把自己绕晕。随时用pwd确认。 - 相对路径换个地方就失效:在
/etc下能cd sysconfig,跑到/root下再敲就报错。拿不准就用绝对路径。
本章小结
| 概念 | 写法 | 说明 |
|---|---|---|
| 根目录 | / |
整个文件树的起点,唯一 |
| 绝对路径 | /etc/passwd |
从 / 开始,到哪都认 |
| 相对路径 | sysconfig/、./a.txt |
从当前位置算起 |
| 家目录 | ~ |
root 是 /root |
| 我在哪 | pwd |
迷路就敲它 |
动手练
- 你当前在
/etc,用相对路径回到根目录/。 - 当前在
/usr/share/doc,用绝对路径进入/var/log。 cd root和cd /root有什么区别?
参考答案:
cd ..(/etc的上一层就是/)。cd /var/log。cd /root是绝对路径,去根目录下的 root 文件夹;cd root是相对路径,去当前目录下名叫 root 的子文件夹。在/下两者碰巧一样,换个目录就完全不同。
第10章 必学的五个基础命令 🔰
学完这一章,你能:随时回答"我在哪、这里有什么、怎么去别处",终端不再让你迷路。
10.1 pwd:我在哪
在商场找店铺,第一件事是看楼层指示牌。pwd 就是那块牌子:打印你现在站的位置。
pwd
# 你会看到:
/root
10.2 ls:这里有什么
ls
# 你会看到当前文件夹里的名字:
anaconda-ks.cfg dir1 a.txt
ls -l
# 你会看到详细信息(权限、属主、大小、时间、名字):
总用量 4
-rw-------. 1 root root 1584 9月 20 16:09 anaconda-ks.cfg
drwxr-xr-x. 2 root root 6 10月 30 18:35 dir1
-l 详细列表、-a 含隐藏文件(以 . 开头)、-h 大小带单位。先记 ls -lh。
10.3 cd:我去哪(本章重点)
cd /var/log # 绝对路径:从根开始
cd sysconfig # 相对路径:从当前位置开始
cd .. # 回上一层
cd - # 回到上一次所在的目录
最容易被搞混的几条,必须记牢:
| 写法 | 去哪 | 说明 |
|---|---|---|
cd |
家目录 | 不带参数就是回家 |
cd ~ |
家目录 | ~ 就是家目录,和 cd 一样 |
cd / |
根目录 | 整棵树的最顶层 |
cd /root |
root 的家目录 | root 家目录是 /root |
cd /home/tom |
tom 的家目录 | 普通用户是 /home/用户名 |
cd 和 cd ~ 是"回家",cd / 是"去整台机器的根"——这是新手最容易混的一对。
10.4 clear 和 history:让终端清爽一点
clear # 清屏,快捷键 Ctrl + L 效果一样
# 你会看到:屏幕清空,提示符回到左上角
history # 列出敲过的命令,带编号
history 10 # 只看最近 10 条
!2 # 重新执行编号为 2 的命令
clear 只擦屏幕,不删文件和历史。按上方向键也能翻出刚敲的命令,比 history 更常用。
10.5 常见坑 ⚠️
cd后面没写就回车:不是没反应,是回家了,用pwd确认。cd /和cd ~当成一回事:一个去根目录,一个回家目录,差很远。clear以为删了东西:只清屏,文件和命令历史都还在。
本章小结
| 命令 | 作用 | 最常用写法 |
|---|---|---|
pwd |
我在哪 | pwd |
ls |
这里有什么 | ls -lh |
cd |
去哪 | cd /var/log、cd ~、cd .. |
cd / |
去根目录 | 不是回家 |
clear |
清屏 | clear 或 Ctrl + L |
history |
历史命令 | history 10、!编号 |
动手练
- 登录后不确定自己在哪,敲什么命令?
- 从
/etc/sysconfig回到/etc,最短怎么写? - 说出
cd、cd ~、cd /分别去哪里。
参考答案:
pwd。cd ..。cd和cd ~都回家目录(root 是/root,普通用户是/home/用户名);cd /去根目录/。
第三篇 文件和目录
这一篇讲 Linux 里最日常的活:新建、复制、查看、改名、删除。 学完这一篇,你就能自己整理文件、找到东西,并且知道怎么删才安全。
第11章 创建文件与文件夹:touch 和 mkdir 🔰
学完这一章,你能:想要一个空文件、一个空文件夹(目录),随手就能建出来。
11.1 两个命令的分工
mkdir 是盖一间空房间(建文件夹),touch 是往房间里放一张白纸(建空文件)。一个管容器,一个管内容。
11.2 touch:建一个空文件
cd /tmp
touch a.txt
ls -l a.txt
# 你会看到(大小是 0,说明是空文件):
-rw-r--r--. 1 root root 0 10月 30 18:40 a.txt
一次建多个,用空格隔开:
touch b.txt c.txt d.txt
ls
# 你会看到:a.txt b.txt c.txt d.txt 都在
touch 还有第二个用途:更新文件时间。对已存在的文件敲 touch,内容不会被清空,只是"最后修改时间"变成现在。
11.3 mkdir:建一个空文件夹
cd /tmp
mkdir dir1
ls -ld dir1
# 你会看到(开头是 d,表示 directory 文件夹):
drwxr-xr-x. 2 root root 6 10月 30 18:41 dir1
-p 是最有用的选项:父目录不存在就一起建出来,目标已存在也不报错。
mkdir -p /tmp/project/src/main
cd /tmp/project/src/main
pwd
# 你会看到:
/tmp/project/src/main
不用 -p 直接建多层,系统会报 No such file or directory,因为中间那层 project 还不存在。
11.4 常用写法小表
| 想做什么 | 写法 |
|---|---|
| 建一个空文件 | touch a.txt |
| 一次建多个文件 | touch a.txt b.txt c.txt |
| 建一个空文件夹 | mkdir dir1 |
| 一次建多层文件夹 | mkdir -p a/b/c |
| 看文件夹本身的信息 | ls -ld dir1 |
11.5 常见坑 ⚠️
touch建不了文件夹:touch mydir建的是名叫 mydir 的文件。要文件夹就用mkdir。mkdir忘了-p:建多层路径直接报No such file or directory。- 文件名带空格:
mkdir my dir会建出两个文件夹。要带空格得写mkdir "my dir",但更建议用下划线。 - 以为不区分大小写:
A.txt和a.txt是两个不同的文件。 - 用
rmdir删目录:它只能删空目录,里面有一个文件就报错。真删目录用第13章的rm -r。
本章小结
| 命令 | 作用 | 例子 |
|---|---|---|
touch 文件名 |
建空文件 / 更新时间 | touch a.txt |
touch 多个文件 |
一次建一批 | touch 1.txt 2.txt |
mkdir 文件夹 |
建文件夹 | mkdir dir1 |
mkdir -p 多层 |
连父目录一起建 | mkdir -p a/b/c |
ls -ld |
查看文件夹本身的信息 | ls -ld dir1 |
动手练
- 在
/tmp下建一个空文件note.txt,并写出查看它大小的命令。 - 在
/tmp下建出三层文件夹/tmp/web/html/static,一条命令完成。 - 怎么确认建出来的是"文件夹"而不是"文件"?
参考答案:
touch /tmp/note.txt;ls -l /tmp/note.txt,大小显示 0。mkdir -p /tmp/web/html/static。ls -ld /tmp/web,输出开头是d(drwxr-xr-x)就是文件夹。
第12章 复制、移动、重命名:cp 和 mv 🔰
学完这一章,你能:把文件复制一份做备份、搬到别的文件夹、原地改个名字,都不会弄丢原件。
12.1 一个复印机,一个搬家公司
cp 像复印机:原件还在,多一份副本。
mv 像搬家公司:东西搬走了,原处就没了;如果只是从一个房间挪到隔壁,那就是"改名"。
12.2 cp 的最小写法
格式永远是 cp 源文件 目标:目标写"新名字"就是复制并改名,写"文件夹"就是复制进去、名字不变。
cd /tmp
echo "hello linux" > a.txt
cp a.txt b.txt # 复制并改名
cp a.txt dir1/ # 复制到 dir1 文件夹里
ls
# 你会看到:a.txt b.txt dir1
12.3 复制文件夹:必须加 -r
mkdir -p dir1/sub
cp dir1 dir2
# 你会看到报错:
cp: 略过目录 'dir1'
cp -r dir1 dir2
ls dir2
# 你会看到:
sub
-r 是递归:连文件夹里面的东西一起复制。复制目录忘了它,一定失败。
12.4 mv:移动、剪切、改名
mv b.txt c.txt # 原地改名:b.txt 变成 c.txt
mv c.txt dir1/ # 移动到 dir1 文件夹
mv dir1 /tmp/dir1_new # 文件夹也能移动、改名
同一个文件夹里 mv = 改名;mv 到另一个文件夹 = 剪切。 不管哪种,原位置都不会再留着。
12.5 覆盖:同名文件会怎样
目标位置已经有同名文件时,cp 和 mv 默认直接覆盖,没有回收站、没有提示。
不过 CentOS 7 的 root 账号默认加了 -i 别名,覆盖前会问你一句:
cp a.txt b.txt
# 你会看到(问你是否覆盖):
cp: 覆盖 'b.txt' 吗?
# 输入 y 回车 = 覆盖;输入 n 回车 = 不覆盖
看到提示别慌,这是好事。没看到提示就直接覆盖了也正常,说明没有这个别名,操作前自己要先想清楚。
12.6 常见坑 ⚠️
- 复制目录忘
-r:报略过目录,目录根本没复制成功。 - 把"移动"当成"备份":
mv之后原位置什么都没有了,要备份请用cp。 - 目标写错:
cp a.txt /tmp是复制进/tmp;cp a.txt /tmp/newname是复制并改名。写之前用ls确认目标存在。
本章小结
| 命令 | 作用 | 例子 |
|---|---|---|
cp 源 目标 |
复制文件 | cp a.txt b.txt |
cp -r 目录 目标 |
复制整个文件夹 | cp -r dir1 dir2 |
mv 源 新名 |
改名 | mv a.txt c.txt |
mv 文件 目录/ |
移动(剪切) | mv a.txt /tmp/ |
| 覆盖 | 默认直接覆盖 | 先备份再操作 |
动手练
- 把
/etc/hostname复制到/tmp,命令怎么写?原件还在吗? - 把
/tmp/a.txt改名为/tmp/hello.txt。 - 复制
/tmp/dir1整个文件夹到/tmp/dir3,命令怎么写?
参考答案:
cp /etc/hostname /tmp/;原件/etc/hostname还在,/tmp下多了一个副本。mv /tmp/a.txt /tmp/hello.txt。cp -r /tmp/dir1 /tmp/dir3。
第13章 删除:rm 🔰
学完这一章,你能:安全地删掉不要的文件,并且真正明白"为什么删之前要停三秒"。
13.1 rm 是一台碎纸机
Windows 删除是丢进回收站,后悔还能捞回来。Linux 的 rm 是碎纸机:纸进去就成碎片,没有回收站,删了就没了。这一章所有注意事项,都是从这一句话来的。
13.2 最小可用:删一个文件
cd /tmp
touch del.txt
ls
# 你会看到:del.txt 在列表里
rm del.txt
ls
# 你会看到:del.txt 已经不在列表里了
删的时候没有任何提示,也不问你确认。
13.3 删文件夹:-r 和 -f
rm dir1
# 你会看到报错(rm 默认不删文件夹):
rm: 无法删除 'dir1': 是一个目录
rm -r dir1 # 递归删除:文件夹和里面的东西一起删
rm -rf dir1 # 强制删除:不提示、不报错、直接删(和上一条二选一)
| 选项 | 意思 | 什么时候用 |
|---|---|---|
| 无选项 | 删文件 | 删单个文件 |
-r |
递归,删文件夹及其内容 | 删文件夹 |
-f |
强制,不提示不报错 | 确定要删、不想被打断 |
-rf |
递归 + 强制 | 最危险,删文件夹不留余地 |
-i |
每个文件都问一遍 | 想稳妥时手动加 |
13.4 真实后果:删错了会发生什么
- 删掉
/etc下的配置文件,对应的服务重启后直接起不来,网络、远程登录都可能断掉。 - 删掉数据库目录,数据只能从备份恢复;没有备份就是永久丢失。
- 在
/etc里敲rm -rf ./*,会把当前文件夹里的所有东西全删掉——它删的是你站的地方。 rm -rf /是想删掉整个系统。新版本的rm会拒绝执行并提示危险,但千万别去试绕过它的参数,那是真的会把系统删没。
⚠️ 注意:
-f会把报错也吞掉,看起来"很顺利",其实可能已经删过头了。越是安静,越要回头看。
13.5 三个安全习惯(请背下来)
- 删之前先
ls:把rm换成ls敲一遍,看看这条命令到底会选中哪些文件,确认了再删。 - 回车前从右往左读一遍路径:重点看
/和空格。rm -rf /data/logs和rm -rf / data logs是两条完全不同的命令。 - 重要的先备份,不确定的先预览:用
echo把通配符展开看一眼(第16章),或者先把文件移到/tmp放几天。
13.6 常见坑 ⚠️
- 以为删错了能恢复:不能。极少数情况可以靠专业工具,但别指望。
rm -rf手滑多打一个空格:空格会把一条命令拆成几条,后果不可控。rm ./*和rm *是一回事:都删当前目录全部,区别只是./写得明白一点。- 脚本里
rm -rf $DIR而$DIR是空的:命令会变成危险的样子。写脚本时先判断变量不为空。
本章小结
| 命令/概念 | 作用 | 说明 |
|---|---|---|
rm 文件 |
删文件 | 不提示,不可恢复 |
rm -r 目录 |
删文件夹 | 连同里面内容一起删 |
rm -rf 目录 |
强制删文件夹 | 最危险,吞掉报错 |
rm -i 文件 |
逐个确认 | 稳妥,CentOS 7 的 root 默认带 |
| 回收站 | 没有 | 删掉就是删掉 |
动手练
- 删掉
/tmp下的del.txt,要求先预览再删,写出两条命令。 rm -r和rm -rf有什么区别?什么时候千万不能用-rf?- 同事让你在
/etc下执行rm -rf ./*,你应该怎么做?
参考答案:
ls /tmp/del.txt确认存在,再rm /tmp/del.txt。-r只负责递归删文件夹,删不掉的会报错;-f强制、不提示、不报错。路径不明确、通配符没预览过时千万不能用-rf。- 停下来问清楚要删什么,先
ls ./*看清楚;/etc是系统配置目录,这条命令会毁掉系统,不能执行。
第14章 查看文件内容:cat、more、less、head、tail 🔰
学完这一章,你能:不管文件多长多短,都挑对命令看清楚它的内容。
14.1 五个命令各管一段
想象手里有一本厚书:cat 是把整本书摊在桌上,less 是一页页翻,more 是只能往后翻,head 是只看开头几页,tail 是只看最后几页。
14.2 cat:短文件,一次看完
cat /etc/os-release
# 你会看到:
NAME="CentOS Linux"
VERSION="7 (Core)"
...
加 -n 显示行号,找行、报错定位都靠它:
cat -n /etc/os-release
# 你会看到:
1 NAME="CentOS Linux"
2 VERSION="7 (Core)"
cat 文件1 文件2 可以把几个文件连着输出。
14.3 less 和 more:长文件,翻着看
less /etc/passwd
# 你会看到:整屏内容,底部显示 : 或 (END)
# 按 空格 翻一屏,回车 翻一行,按 q 退出
| 按键 | 作用 |
|---|---|
| 空格 | 往下一屏 |
b |
往上一屏(less 才有) |
/关键字 |
向下搜索,n 下一个,N 上一个 |
q |
退出 |
more 和 less 用法几乎一样,但 more 只能往下翻,翻过头只能按 q 退出重来。所以长文件优先用 less。
14.4 head 和 tail:只看头和尾
head /etc/passwd # 默认前 10 行
head -n 3 /etc/passwd
# 你会看到:
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
tail -n 2 /etc/passwd # 最后 2 行
tail -f 是看日志的神器:它不退出,一直盯着文件末尾,有新内容就立刻显示,看完按 Ctrl + C 退出。例如 tail -f /var/log/messages。
14.5 常见坑 ⚠️
- 用 cat 打开大日志:几十万行刷屏,滚半天。先
head看头,再less翻。 - 用 cat 看压缩包或二进制文件:满屏乱码,还会把终端搞乱(敲
reset恢复)。先用file 文件名看类型。 tail -f之后退不出去:它在等新日志,按Ctrl + C才停。Permission denied:不是命令写错,是没权限读这个文件(第25章)。
本章小结
| 命令 | 适合 | 关键写法 |
|---|---|---|
cat |
短文件一次看完 | cat -n 文件 |
less |
长文件上下翻、搜索 | q 退出、/ 搜索 |
more |
长文件只看下去 | 空格翻页,不能回头 |
head |
看开头 | head -n 5 文件 |
tail |
看结尾、盯日志 | tail -n 5、tail -f |
动手练
- 想只看
/etc/passwd的前 3 行,命令怎么写? - 打开一个大日志文件,想边看边搜索关键字
error,用哪个命令、按什么键? - 实时监控
/var/log/messages的新内容,命令怎么写?怎么退出?
参考答案:
head -n 3 /etc/passwd。less /var/log/文件名,输入/error回车,n跳到下一个,q退出。tail -f /var/log/messages,按Ctrl + C退出。
第15章 软链接与硬链接 🔧
学完这一章,你能:看懂
ls -l里的l和->,知道链接坏了是怎么回事;第一遍只要理解比喻,不必背命令。
15.1 两个比喻先记住
- 硬链接 = 同一个人的两个名字。人只有一个(文件只有一份),身份证号(inode)也只有一个,只是名字有两个。叫哪个名字,来的都是同一个人。
- 软链接 = 快捷方式。桌面上那个图标不是文件本身,只是一张写着"文件在那边"的纸条;原文件被删,快捷方式就打不开了。
💡 一句话说 inode:inode 是文件的"身份证",记录文件的大小、权限、数据放在哪;内容不变,inode 编号就不变。
15.2 硬链接:ln
cd /tmp
echo "hello linux" > a.txt
ln a.txt a_hard
ls -li a.txt a_hard
# 你会看到(第一列 inode 编号相同,第三列硬链接数是 2):
16777219 -rw-r--r--. 2 root root 12 10月 30 18:50 a.txt
16777219 -rw-r--r--. 2 root root 12 10月 30 18:50 a_hard
两个名字、一个 inode,就是同一个文件。删掉其中一个,另一个还能正常打开。
15.3 软链接:ln -s
ln -s a.txt a_soft
ls -l a_soft
# 你会看到(开头是 l,末尾有 -> 指向原文件):
lrwxrwxrwx. 1 root root 5 10月 30 18:50 a_soft -> a.txt
软链接自己是一个独立的小文件,里面只存着"原文件在哪"。所以:
rm a.txt
cat a_hard
# 你会看到:
hello linux
cat a_soft
# 你会看到:
cat: a_soft: 没有那个文件或目录
硬链接 a_hard 还是好的,软链接 a_soft 已经失效。
15.4 硬链接和软链接的区别
| 对比 | 硬链接 ln |
软链接 ln -s |
|---|---|---|
| 本质 | 同一个文件的另一个名字 | 指向别处的快捷方式文件 |
| inode | 和原文件相同 | 自己独立 |
| 能否跨文件系统 | 不能 | 能 |
| 能否指向目录 | 不能(系统禁止) | 能 |
| 删原文件后 | 照样能打开 | 失效 |
ls -l 看 |
普通文件,硬链接数 +1 | l 开头,带 -> |
15.5 常见坑 ⚠️
ln -s忘了写-s:变成硬链接,本想删链接结果动了原文件。- 软链接用相对路径:
ln -s a.txt /tmp/a_soft里的a.txt是按链接所在目录算的,链接一挪就失效。给软链接指路时尽量写绝对路径:ln -s /tmp/a.txt /tmp/a_soft。 - 给目录建硬链接:Linux 系统层面就禁止,root 也不行,会直接报错,这不是你操作错了。
- 把硬链接当备份:它不是副本,文件内容一改,两个名字看到的都变。
本章小结
| 命令/概念 | 作用 | 说明 |
|---|---|---|
ln 源 新名 |
建硬链接 | 同一个 inode |
ln -s 源 新名 |
建软链接 | 类似快捷方式 |
ls -l |
看是不是软链接 | l 开头、带 -> |
ls -li |
看 inode 编号 | 第一列相同 = 同一文件 |
| inode | 文件"身份证" | 不包含文件名 |
动手练
- 在
/tmp建文件x.txt,为它建一个硬链接x_hard,用什么命令? - 怎么用一条命令证明
x.txt和x_hard是同一个文件? - 软链接指向的原文件被删了,软链接会怎样?
参考答案:
ln /tmp/x.txt /tmp/x_hard。ls -li /tmp/x.txt /tmp/x_hard,两行第一列 inode 编号相同。- 软链接还在,但打开会报
没有那个文件或目录(失效了);ls -l看它还是l开头、带->。
第16章 通配符和花括号:一次处理一批文件 🔰
学完这一章,你能:用一个"模式"同时点名一批文件,批量删除、复制、创建不再一个个敲。
16.1 通配符就是"点名时说的姓什么"
老师点名:"姓张的同学站起来。"这一句能叫起一片人。通配符就是让 shell 帮你把"一片文件"写成一句话,命令照着展开。
先准备练习素材:
mkdir -p /tmp/prac
cd /tmp/prac
touch file1.txt file2.txt file3.txt file10.txt note.txt data.log
ls
# 你会看到:
data.log file1.txt file10.txt file2.txt file3.txt note.txt
16.2 *:任意多个字符
ls *.txt
# 你会看到:
file1.txt file10.txt file2.txt file3.txt note.txt
ls file*.txt
# 你会看到(file10 排在 file2 前面,因为它是按字符逐个比大小的):
file1.txt file10.txt file2.txt file3.txt
* 可以代表零个、一个、多个任意字符,是最常用的通配符。
16.3 ? 和 []:精确一点
ls file?.txt
# 你会看到(? 只代表一个字符):
file1.txt file2.txt file3.txt
ls file[12].txt
# 你会看到:
file1.txt file2.txt
| 写法 | 意思 | 例子 |
|---|---|---|
* |
任意多个字符 | *.txt 所有 txt 文件 |
? |
正好一个字符 | file?.txt 匹配 file1、file2、file3 |
[abc] |
括号里任意一个字符 | file[12].txt |
16.4 {}:生成一串,不是通配符
{ } 不负责"匹配已有文件",它负责先展开成一串:
echo {1..5}
# 你会看到:
1 2 3 4 5
mkdir -p /tmp/prac/{A,B,C}
ls /tmp/prac
# 你会看到多了 A B C 三个文件夹
16.5 常见坑 ⚠️
- 通配符是 shell 展开的,不是命令的功能:没匹配到文件时,
ls *.jpg会把*.jpg原样交给ls,于是报No such file or directory。 rm *等于删除当前目录全部:先ls *看一眼,确认了再删(第13章的三个习惯)。{a,b}里不能有空格:{A, B}会变成两个不完整的东西。逗号也要用英文逗号。*不匹配隐藏文件:以.开头的文件,*看不见,要单独写.*。
本章小结
| 写法 | 作用 | 例子 |
|---|---|---|
* |
任意多个字符 | ls *.txt |
? |
一个字符 | ls file?.txt |
[] |
括号内任选一个 | ls file[12].txt |
{a,b} |
展开成多个字符串 | mkdir {A,B,C} |
{1..10} |
数字序列 | touch {1..10}.txt |
动手练
- 列出
/tmp/prac下所有.txt文件。 - 一次建出
p1.txt到p5.txt五个空文件,一条命令。 - 为什么
ls *.jpg可能报No such file or directory?
参考答案:
ls /tmp/prac/*.txt。touch p{1..5}.txt。- 因为当前目录里没有
.jpg文件,shell 无法展开,把*.jpg原样交给ls,ls找不到这个"文件名"就报错。
第17章 重定向和管道 🔰
学完这一章,你能:把命令的输出存进文件、追加到文件末尾,还能用管道把几条命令串起来干活。
17.1 比喻:屏幕是出水口
命令干活的结果默认"流"到屏幕上。重定向就是给水管换个出口,接到文件里:> 像先倒掉旧水再装,文件原来的内容被清空;>> 像接着往桶里倒,原来的内容保留,新内容加在最后。管道 | 像流水线:上一步的产出直接变成下一步的原料,屏幕上什么都不显示。
17.2 > 覆盖 和 >> 追加
cd /tmp
echo "第一行" > 1.txt
cat 1.txt
# 你会看到:
第一行
echo "第二行" > 1.txt # 注意还是 >
cat 1.txt
# 你会看到:
第二行
第一行没了!这就是覆盖。想保留就换 >>:
echo "第三行" >> 1.txt
cat 1.txt
# 你会看到:
第二行
第三行
记法:箭头多一个,内容多一份。
17.3 < 和 <<:反过来喂数据
wc -l < /etc/passwd
# 你会看到:一个数字,比如 45
< 是"从文件读入",不经过屏幕,wc -l 就是数行数。<< 是"我下面敲的几行都算输入,直到遇到结束标记":
cat >> /tmp/1.txt << EOF
hello
linux
EOF
cat /tmp/1.txt
# 你会看到最后多了 hello 和 linux 两行
17.4 管道 |:串起几条命令
ls /etc | wc -l
# 你会看到:/etc 下有多少项
ip a | grep inet
# 你会看到:只留下带 inet 的行(grep 第52章细讲)
左边命令的输出,直接成为右边命令的输入,中间不落盘。想存下来就再接一个重定向:ls -l /etc > /tmp/etc_list.txt。
17.5 常见坑 ⚠️
- 该用
>>却写了>:文件被清空,只剩最后一条内容。 cat 文件 > 同一个文件:文件会先被清空,再读就是空的,内容全丢。要改内容先cp备份。>没有提示:覆盖是静默的,敲完回车前先确认文件名。
本章小结
| 符号 | 名字 | 作用 | 例子 |
|---|---|---|---|
> |
输出重定向 | 覆盖写入文件 | ls > list.txt |
>> |
追加重定向 | 追加到文件末尾 | echo hi >> a.txt |
< |
输入重定向 | 从文件读数据 | wc -l < a.txt |
<< |
键盘输入重定向 | 敲到 EOF 为止 | cat << EOF |
\| |
管道 | 前一个的输出给后一个 | ls \| wc -l |
动手练
- 把
free -h的结果保存到/tmp/mem.txt,命令怎么写? - 已经有一个
/tmp/mem.txt,想再追加一条日期信息,用>还是>>? - 用一条命令数出
/etc下有多少个文件和文件夹。
参考答案:
free -h > /tmp/mem.txt。>>,例如date >> /tmp/mem.txt。ls /etc | wc -l。
第18章 键盘上的省力技巧 🔰
学完这一章,你能:少敲一半的字、少打一半的错,还会用一行命令干几件事。
18.1 Tab 补全:最救命的一个键
打字最怕打错。Tab 让系统帮你把剩下的字补齐,不用自己敲全。像点外卖时输入"宫保",系统自动弹出"宫保鸡丁"。
# 敲命令名时:
cle # 按一下 Tab,变成
clear
# 敲路径时:
cd /etc/sysc # 按一下 Tab,变成
cd /etc/sysconfig/
- 按一次 Tab 没反应或"叮"一声:说明有多个候选,再按一次 Tab 会把候选全列出来。
- 按一次就补全了:说明前缀唯一,直接回车就行。
- 命令名、文件夹名、文件名都能补全,能补全就别手打。
18.2 翻历史:上下方向键和 Ctrl + R
# 按 上方向键:一条条翻出刚才敲过的命令;按 下方向键:往回翻
# Ctrl + R 后输入关键字,直接搜到用过的命令:
(reverse-i-search)`pass': cat /etc/passwd
Ctrl + R 找到后按回车直接执行;再按 Ctrl + R 继续往前搜同一个关键字。
18.3 Ctrl 组合键:记住这六个
| 快捷键 | 作用 | 备注 |
|---|---|---|
Ctrl + C |
终止当前正在跑的命令 | 不是复制! |
Ctrl + L |
清屏,等于 clear |
不删任何文件 |
Ctrl + D |
退出当前终端,等于 exit |
光标在空行时才有效 |
Ctrl + A |
光标跳到行首 | 改长命令时好用 |
Ctrl + E |
光标跳到行尾 | 配合 A 用 |
Ctrl + U |
删掉光标左边所有内容 | 整行敲错时一键重来 |
Ctrl + Z 是"把当前命令暂停扔到后台",不是撤销,新手先别按(恢复用 fg)。
18.4 一行敲几条命令:; && ||
cd /tmp ; ls # 先 cd 再 ls,不管前面成不成功
mkdir /tmp/t1 && cd /tmp/t1 # 前一个成功才执行后一个
ls /tmp/nofile || echo "目录不存在"
# 你会看到:
ls: 无法访问/tmp/nofile: 没有那个文件或目录
目录不存在
| 连接符 | 意思 |
|---|---|
; |
依次执行,前一个失败也继续 |
&& |
前一个成功才执行后一个 |
\|\| |
前一个失败才执行后一个 |
18.5 常见坑 ⚠️
- Ctrl + C 当成复制:终端里它是"终止"。复制用右键菜单或
Ctrl + Shift + C。 - Ctrl + Z 当成撤销:它只是把命令暂停了,按
fg能恢复;真撤销是 vim 里的u。 &&后面没执行:说明前面那条失败了,先看前面的报错。
本章小结
| 按键/符号 | 作用 |
|---|---|
Tab |
补全命令、路径、文件名 |
↑ ↓ |
翻历史命令 |
Ctrl + R |
搜索历史命令 |
Ctrl + C |
终止当前命令 |
Ctrl + L |
清屏 |
; && \|\| |
一行执行多条命令 |
动手练
- 输入
cd /etc/sysc后按 Tab,会发生什么? - 想清屏但不想丢失任何东西,按什么键?
cd /tmp && ls和cd /tmp ; ls有什么区别?
参考答案:
- 自动补全成
cd /etc/sysconfig/(若有两个以上候选,会列出候选让你继续输)。 Ctrl + L(等于clear),它只清屏幕。&&是前一条成功才执行ls;;不管成功失败都执行ls。
第四篇 文本编辑:vi / vim
服务器上没有记事本,改配置只能靠 vi。 这一篇只教你“够用”的那部分:能打开、能改、能保存、能退出,日常工作就够用了。
第19章 vi 是什么,为什么非学不可 🔰
学完这一章,你能:用 vi 打开一个文件、敲进内容、保存退出;并且知道为什么绕不开它。
19.1 vi 就是 Linux 自带的"记事本"
vi 是 Unix/Linux 上最老牌的文本编辑器,差不多等于 Windows 的记事本——只能打字,没有鼠标,没有按钮。vim 是 vi 的升级版,多了颜色高亮和插件,日常说的"vi"通常就是 vim。
它有个和记事本完全不同的地方:按键分"模式"。同样一个 i,在记事本里就是打出一个 i,在 vi 里可能是"准备开始输入"。第20章专门讲模式。
19.2 为什么非学不可
- 服务器没有图形界面,改配置只能编辑文本文件,
/etc下的配置全是纯文本。 - 几乎所有 Linux 都自带 vi,连最小安装、救援模式里都有它;别的编辑器可能没装。
- 配网络、装软件、起服务,最后一步常常都是"vi 改一下这个文件"。
- 用
echo往文件里写一两行还行,改几十行的配置就没法用了。
💡 小贴士:vi 就像家里的万能钥匙——不好用,但每次都能开锁。先学会它,别的编辑器再慢慢挑。
19.3 打开文件
vi /tmp/hello.txt
# 你会看到:屏幕被清空,底部出现
"/tmp/hello.txt" [New File]
- 文件不存在:vi 会新建,底部标
[New File]。 - 打开前先用
pwd看清你在哪,不然保存到哪个目录都不知道。
19.4 先只会三步,就能活下去
新手只要会 i、Esc、:wq 三个动作就能活:
vi /tmp/hello.txt
# 1. 按 i,左下角出现 -- INSERT --,说明可以打字了
# 2. 敲:hello vim
# 3. 按 Esc,回到命令模式
# 4. 输入 :wq 回车(w=write 保存,q=quit 退出)
cat /tmp/hello.txt
# 你会看到:
hello vim
- 不想保存:按
Esc,输入:q!回车,强行退出。 - 改了一半想重来:
Esc后:q!,改了的内容全丢。
19.5 装 vim 和练手
最小安装里可能只有精简版 vi,没有 vim 命令。装它需要 yum(第35章):
yum install -y vim
vimtutor
# 你会看到:vim 自带的互动教程,照着做完一遍,基本操作就记住了
19.6 常见坑 ⚠️
- 打开 vi 后按字母没反应:不是卡死,是你在命令模式,先按
i才能打字。 - 退不出去:按
Esc,再输入:q!回车,一定退得出来。 :q提示 E37:"已修改但尚未保存"。要么:wq保存,要么:q!放弃。- 别用 vi 打开压缩包和图片:满屏乱码,什么也改不了。
- 保存到哪了?:打开时用了什么路径就存到哪,不确定就用绝对路径打开。
本章小结
| 操作 | 按键/命令 | 说明 |
|---|---|---|
| 开始输入 | i |
左下角出现 -- INSERT -- |
| 回到命令模式 | Esc |
任何时候都能按 |
| 保存退出 | :wq |
w 保存,q 退出 |
| 不保存退出 | :q! |
改坏了用这个 |
| 教程 | vimtutor |
装完 vim 后跟着练 |
动手练
- 用 vi 新建
/tmp/me.txt,写一行I love Linux,保存退出,写出完整操作步骤。 - 在 vi 里改了内容但不想保存,怎么退出?
- 为什么说"服务器上绕不开 vi"?
参考答案:
vi /tmp/me.txt→ 按i→ 输入I love Linux→ 按Esc→ 输入:wq回车;再用cat /tmp/me.txt验证。- 按
Esc,输入:q!回车,强行退出不保存。 - 服务器通常没有图形界面,配置都是文本文件;vi 几乎每台 Linux 都自带,最小安装和救援模式里只有它。
第20章 vim 常用的三种模式与切换 🔰
学完这一章,你能:清楚知道自己现在在哪个"房间",不再出现"打字打不进去""退不出来"的慌乱。
20.1 三个房间
把 vim 想成一套三居室:
- 命令模式(进门的大厅):默认就在这。按字母不是打字,而是"下命令",比如删一行、复制一行。
- 编辑模式(书房):只有在这里,你敲的字才会进到文件里。
- 末行模式(门口的柜台):保存、退出、显示行号、查找替换,都在这办。
20.2 怎么在三个房间之间走
启动 vi ──► 命令模式(默认)
│ 按 i / a / o
▼
编辑模式 ──按 Esc──► 命令模式
命令模式 ──按 : ──► 末行模式 ──回车或 Esc──► 命令模式
| 模式 | 怎么进去 | 能干什么 | 怎么出来 |
|---|---|---|---|
| 命令模式 | 打开就进去 | 删行、复制、粘贴、撤销、跳转 | 按 i/a/o 或 : |
| 编辑模式 | 命令模式按 i/a/o |
打字、改字、删字 | 按 Esc |
| 末行模式 | 命令模式按 : |
保存、退出、行号、替换 | 回车执行或 Esc 取消 |
20.3 一次完整的走法
vi /tmp/mode.txt
# 1. 打开后先按 i → 左下角出现 -- INSERT --
# 2. 输入:hello vim
# 3. 按 Esc → -- INSERT -- 消失,回到命令模式
# 4. 输入 :wq 回车 → 保存并退出,回到 [root@localhost ~]#
cat /tmp/mode.txt
# 你会看到:
hello vim
20.4 怎么判断自己在哪
- 左下角有
-- INSERT --(或-- 插入 --):编辑模式,可以打字。 - 左下角什么都没有(不显示
-- INSERT --):命令模式。 - 光标跑到屏幕最底下一行,以
:开头:末行模式。
拿不准就按两下 Esc,一定会回到命令模式,不会删掉任何内容。
20.5 常见坑 ⚠️
- 在编辑模式里敲
:wq::会被打进正文,文件里多出一行:wq。先Esc再敲。 Esc按一下没回到命令模式:有的场景要按两下,多按一次不吃亏。:q退不出去:说明文件改过了,用:wq保存或:q!放弃。- 以为 vim 死机了:绝大多数是模式搞混了,按
Esc再试。
本章小结
| 你现在在 | 标志 | 按什么去别处 |
|---|---|---|
| 命令模式 | 左下角空白 | i 进编辑、: 进末行 |
| 编辑模式 | -- INSERT -- |
Esc 回命令模式 |
| 末行模式 | 底部一行以 : 开头 |
回车执行、Esc 取消 |
动手练
- 打开 vim 后直接敲字母没反应,你在哪个模式?怎么才能打字?
- 从编辑模式回到命令模式按什么键?从命令模式进末行模式按什么键?
- 屏幕最下面一行显示
:开头,你在哪个模式?这时按回车会发生什么?
参考答案:
- 命令模式;按
i(或a、o)进入编辑模式才能打字。 - 编辑→命令按
Esc;命令→末行按:。 - 末行模式;回车执行你输入的那条末行命令(比如
:wq就保存退出,命令敲错会报错但不会退出)。
第21章 十个够用的 vim 操作 🔰
学完这一章,你能:用十个按键完成日常九成的编辑工作,不再怕"改配置文件"。
21.1 十个操作,先记住这张表
| 序号 | 按键 | 在哪个模式 | 作用 |
|---|---|---|---|
| 1 | i / a / o |
命令模式 | 进入编辑:光标前 / 光标后 / 下一行新开 |
| 2 | Esc |
编辑模式 | 回到命令模式 |
| 3 | :w |
末行模式 | 保存(不退出) |
| 4 | :q |
末行模式 | 退出(没改动时才行) |
| 5 | :wq |
末行模式 | 保存并退出 |
| 6 | :q! |
末行模式 | 不保存,强行退出 |
| 7 | dd |
命令模式 | 删除当前行(5dd 删 5 行) |
| 8 | yy |
命令模式 | 复制当前行(5yy 复制 5 行) |
| 9 | p |
命令模式 | 粘贴到当前行下面 |
| 10 | u |
命令模式 | 撤销(Ctrl + r 反撤销) |
vim 的按键像开车:i 是踩油门(能输入了),Esc 是刹车(停下来),:wq 是熄火锁车(保存走人)。另外 10gg 跳到第 10 行,G 跳到文件最后一行,gg 回第一行——这三个配合 dd、yy 很好用。
21.2 走一遍完整的编辑
vi /tmp/prac.txt
# 按 i,输入三行:
line one
line two
line three
# 按 Esc,输入 :wq 回车
再打开它,把第二行删掉、保存:
vi /tmp/prac.txt
# 命令模式下把光标移到第二行,按 dd
# 输入 :wq 回车
cat /tmp/prac.txt
# 你会看到:
line one
line three
21.3 三个进阶操作:查找、替换、行号
/hello # 命令模式下输入:向下查找 hello,n 下一个,N 上一个
:%s/hello/HELLO/g # 末行模式:全文把 hello 换成 HELLO
:set nu # 末行模式:显示行号
:set nonu # 末行模式:取消行号
:%s/旧/新/g 里的 g 是"每行所有匹配都换",不加 g 只换每行第一个。替换前先 :w 或者先备份文件。
21.4 常见坑 ⚠️
dd以为删一个字符:它是删整行。删一个字符用x。yy之后没粘贴:复制完要按p才会粘出来。p粘到哪了:粘在当前行下面;想粘到上面用P。:q退不出:改过内容,用:wq或:q!。- 替换完才发现改错:
:%s影响全文,保存前可以用u撤销,或者先备份文件。
本章小结
| 想做什么 | 按键 | 口诀 |
|---|---|---|
| 开始输入 | i |
i = insert 插入 |
| 回命令模式 | Esc |
按不坏,多按几下 |
| 保存 | :w |
w = write |
| 退出 | :q |
q = quit |
| 保存并退出 | :wq |
最常用 |
| 不保存退出 | :q! |
加 ! 表示"强制" |
| 删行 | dd |
d = delete |
| 复制行 | yy |
y = yank |
| 粘贴 | p |
paste |
| 撤销 | u |
undo |
动手练
- 用 vim 打开
/tmp/prac.txt,把第一行改成Linux is easy,保存退出。 - 在 vim 里删掉第 3 行,撤销一次,再保存退出,写出按键顺序。
- 把文件里所有的
linux替换成Linux,写出末行命令。
参考答案:
vi /tmp/prac.txt→ 光标在第一行按dd删掉旧行 → 按i输入Linux is easy→Esc→:wq。- 光标移到第 3 行按
dd→ 按u撤销 →:wq。 :%s/linux/Linux/g,回车执行;确认无误后:wq保存。
第五篇 用户和权限
这一篇是 Linux 的"规矩"。 看起来琐碎,但它是运维工作的地基:90% 的"莫名其妙失败"最后都归到权限上。 学完这一篇,你会拥有一项别人很羡慕的能力:看到
Permission denied,知道该改哪里。
第22章 为什么要分用户 🔰
学完这一章,你能:说清 Linux 里为什么有"用户"这个东西,以及三类用户分别是谁。
22.1 一个假设:如果人人都能改一切
想象一台公司服务器,上面跑着工资表、网站代码、数据库。
如果所有人都能用同一个账号登录、都能随便删文件,会发生什么?
- 实习生手一抖,
rm -rf把网站目录删了,公司业务挂掉; - 谁都能看工资表;
- 出了事,查日志发现"所有人都叫同一个名字",根本查不出是谁干的。
所以必须分用户。分用户带来三个好处:
| 好处 | 说明 |
|---|---|
| 隔离 | 你只能动自己的文件,动不了别人的 |
| 追溯 | 谁操作的,日志里记得清清楚楚 |
| 授权 | 需要什么权限,就精确地给多少 |
比喻:一栋写字楼,如果只有一把万能钥匙,谁都能进任何房间。正常的做法是:每个人都有自己办公室的钥匙,需要进会议室另外申请。Linux 的"权限"就是这套钥匙系统。
22.2 每个用户都有一个编号:UID
系统真正认的不是你的名字,而是一个数字,叫 UID(User ID,用户编号)。
名字只是给人看的,数字才是系统内部用的。
# 看看你自己是谁、编号多少
id
# 你会看到类似:
uid=1000(tom) gid=1000(tom) groups=1000(tom)
逐段读一下,很简单:
uid=1000(tom)—— 你的用户编号是 1000,名字叫 tom;gid=1000(tom)—— 你的主组编号是 1000,组名叫 tom(组的概念第 24 章讲);groups=...—— 你还在哪些组里。
22.3 Linux 里的三类用户
| 类型 | UID 范围 | 是谁 | 用途 |
|---|---|---|---|
| 超级管理员 root | 0 |
系统的"总老板" | 什么权限都有,能改一切 |
| 系统用户 | 1 ~ 999 |
给软件用的账号 | 比如 mysql、nginx 运行时用的身份,默认不能登录 |
| 普通用户 | 1000 起 |
给人用的账号 | 日常登录、办公、干活 |
三个重点,请记住:
- root 的 UID 固定是 0。不是"名字叫 root 才是管理员",是"UID 是 0 才是管理员"。
- 系统用户是给程序用的。比如 MySQL 服务,它不希望用 root 身份跑(万一被攻破,损失太大),所以系统给它建一个
mysql用户,权限很小,即使被攻破也搞不坏整个系统。 - 普通用户权限有限。能管自己的文件,不能管别人的、不能改系统配置。
那普通用户想干管理员的事怎么办?两种方式:
su -切换到 root(第 23 章);- 在命令前加
sudo(第 33 章,更推荐)。
22.4 家目录:每个用户自己的房间
每个用户登录后,都会落在一个属于自己的文件夹里,这个文件夹叫家目录(也就是"主目录")。
| 用户 | 家目录 |
|---|---|
| root | /root |
| 普通用户 tom | /home/tom |
| 普通用户 alice | /home/alice |
在家目录里,你就是主人,想怎么改都行。所以养成把东西放在自己家目录里的习惯,别到处乱放。
# 回到自己的家目录
cd ~
# 看看当前在哪个目录(~ 就代表家目录)
pwd
# 你会看到(普通用户 tom):
/home/tom
22.5 用户信息存在哪
两个文件,知道位置就行,不用背:
| 文件 | 存什么 | 谁能看 |
|---|---|---|
/etc/passwd |
用户的基本信息(名字、UID、家目录、用哪个 shell) | 所有人都能看 |
/etc/shadow |
用户加密后的密码 | 只有 root 能看 |
# 看一眼 /etc/passwd 的最后一行(最新建的用户)
tail -1 /etc/passwd
# 你会看到类似(7 段,用冒号隔开):
tom:x:1000:1000::/home/tom:/bin/bash
七段的含义:用户名:密码占位:UID:GID:简介:家目录:登录shell
💡 小贴士:
/etc/passwd里密码那一段是个x,意思是"密码不在这儿,去/etc/shadow里找"。这就是为什么普通用户能看/etc/passwd却看不到别人密码的原因。
本章小结
| 概念 | 要点 |
|---|---|
| 为什么分用户 | 隔离、追溯、精确授权 |
| UID | 系统真正认的编号,名字只是给人看的 |
| root | UID = 0,权限最大 |
| 系统用户 | UID 1~999,给软件用,默认不能登录 |
| 普通用户 | UID 1000+,日常使用 |
| 家目录 | root 在 /root,普通用户在 /home/用户名 |
| 用户信息在哪 | /etc/passwd(可看)、/etc/shadow(加密密码,只有 root 可看) |
动手练
- 用
id看看你现在的 UID 是多少,属于哪一类用户。 - 为什么数据库软件要单独建一个
mysql用户来运行,而不是直接用 root? - 判断题:只要用户名不叫 root,就肯定不是超级管理员。
参考答案
- 执行
id,如果uid=0(root)就是超级管理员;uid是 1000 及以上一般是普通用户。 - 为了"降权"。如果数据库用 root 跑,一旦数据库被攻破,攻击者就拿到了整台机器的最高权限;用
mysql这个权限很小的账号跑,即使被攻破,能造成的破坏也有限。 - 错。判断是不是管理员看 UID 是否为 0。理论上你可以建一个叫
admin的账号并把它的 UID 设成 0,那它也是超级管理员。
第23章 用户管理:useradd、passwd、su、id 🔰
学完这一章,你能:新增一个用户、给他设密码、切换过去、用完删掉。
23.1 先学会"看"
动手前先学会看,不然你不知道自己做对没做对。
# 我是谁
whoami
# 你会看到:
root
# 我的详细身份(UID、GID、所属组)
id
# 你会看到:
uid=0(root) gid=0(root) groups=0(root)
# 当前有哪些人登录着
who
# 你会看到类似:
root pts/0 2026-10-30 09:12 (192.168.8.1)
who 输出里的 pts/0 是远程登录(通过网络连上来的),tty1 是在机器面前直接登录。
23.2 创建一个用户:useradd
# 创建一个叫 tom 的用户
useradd tom
# 看看建成了没有
id tom
# 你会看到:
uid=1000(tom) gid=1000(tom) groups=1000(tom)
useradd 干了三件事:
- 在
/etc/passwd里加一行; - 建一个和用户名同名的组;
- 建家目录
/home/tom(从/etc/skel模板复制过来的)。
常用选项(先记这几个就够):
| 选项 | 作用 | 例子 |
|---|---|---|
-u |
指定 UID | useradd -u 1500 tom |
-d |
指定家目录位置 | useradd -d /data/tom tom |
-M |
不创建家目录 | useradd -M sysuser |
-s |
指定登录用的 shell | useradd -s /sbin/nologin mysql |
-G |
指定附加组 | useradd -G wheel tom |
关于 -s(这个选项在实际工作里很常用):
/bin/bash—— 正常登录,能用命令行(默认值)。/sbin/nologin—— 禁止登录。登录时会直接把你踢出来。
给软件建账号时,标准写法就是这样:
# 建一个不能登录、没有家目录、UID 固定的 mysql 账号
useradd -M -u 306 -s /sbin/nologin mysql
23.3 设置密码:passwd
useradd 建出来的用户是没有密码的,没密码就登不进去,必须设一个。
# 给 tom 设置密码(root 可以改任何人的密码)
passwd tom
# 你会看到提示:
Changing password for user tom.
New password:
# 注意:这时候你敲的密码屏幕上什么都不显示,这是正常的,不是卡了
Retype new password:
passwd: all authentication tokens updated successfully.
passwd 的其他用法:
| 命令 | 作用 |
|---|---|
passwd |
改自己的密码(会先要你输旧密码) |
passwd tom |
root 改 tom 的密码 |
passwd -l tom |
锁定 tom,禁止他登录(lock) |
passwd -u tom |
解锁 tom(unlock) |
passwd -e tom |
让 tom 下次登录必须先改密码(expire) |
⚠️ 注意:密码输入时屏幕没有任何显示(连星号都没有),这是 Linux 的正常设计,不是键盘坏了。输完直接回车。
新手最常见的笑话,就是这个:"我密码输不进去,是不是终端卡了?"——没卡,就是不显示。
💡 小贴士:批量设密码可以用
echo "123.com" | passwd --stdin tom,但这是红帽系(CentOS)的用法,Ubuntu 不支持--stdin。
23.4 切换用户:su
# 从普通用户切到 root(要输 root 的密码)
su -
# 提示:Password:
# 输完密码后,提示符变成 # 开头,说明你已经是 root
[root@localhost ~]#
# 想退回原来的用户
exit
su 和 su - 的区别(必须搞清楚,面试也常问):
| 命令 | 切换身份 | 环境变量和工作目录 |
|---|---|---|
su tom |
变成 tom | 保持原来用户的环境和当前目录 |
su - tom |
变成 tom | 重新加载 tom 的完整环境,并 cd 到 tom 的家目录 |
💡 结论:推荐一律用
su -。因为su 用户名会带着上一个用户的环境变量过去,可能出现"命令找到了却运行不了""路径不对"等莫名其妙的问题。
还有一条规矩要记住:
- 普通用户切 root,要输 root 的密码;
- root 切普通用户,不用输密码(root 是老板,老板进谁办公室都不用敲门)。
23.5 删除用户:userdel
# 只删用户,保留家目录
userdel tom
# 删用户,同时把家目录和邮件也删掉(慎用!)
userdel -r tom
⚠️ 注意:
userdel -r会把/home/tom里的所有文件一起删掉,没有回收站。删之前确认这个人的数据你是不是真的不要了。
23.6 修改用户:usermod
# 把 tom 加到 wheel 组(wheel 组默认有 sudo 权限)
usermod -aG wheel tom
# 锁定 / 解锁账号
usermod -L tom
usermod -U tom
# 改 UID
usermod -u 1500 tom
⚠️ 注意:
-G有一个大坑——usermod -G是"重新设定"附加组列表,不是"追加"。如果你用了usermod -G wheel tom,tom 原来在的其他附加组会被清掉。所以想追加组,必须写成
-aG(a= append 追加)。这是运维事故高发点。
本章小结
| 命令 | 作用 | 最常用写法 |
|---|---|---|
whoami / id |
看当前用户身份 | id |
who |
看谁登录着 | who |
useradd |
建用户 | useradd tom |
passwd |
设/改密码 | passwd tom |
su |
切换用户 | su - |
userdel |
删用户 | userdel -r tom |
usermod |
改用户 | usermod -aG wheel tom |
动手练
- 建一个用户
zhangsan,设密码,然后切换到它,确认pwd的结果是什么。 su zhangsan和su - zhangsan执行完,pwd的结果一样吗?为什么?- 把
zhangsan加到wheel组,用id zhangsan验证。
参考答案
useradd zhangsan→passwd zhangsan→su - zhangsan;pwd会显示/home/zhangsan。- 不一样。
su zhangsan保持原来的当前目录(比如原来是/root,切换后还在/root);su - zhangsan会切到/home/zhangsan。 usermod -aG wheel zhangsan,然后id zhangsan,输出里groups=后面会多出10(wheel)。
第24章 组是什么 🔰
学完这一章,你能:说清"组"是干什么用的,并给别人分配组。
24.1 为什么要有组
如果公司有 20 个开发要访问同一个项目目录,你打算怎么办?
- 办法一:给这 20 个人一个一个设权限。——新人来了要加一次,走人要删一次,改权限要改 20 遍。
- 办法二:建一个"开发组",把 20 个人都放进去,然后只给这个组设一次权限。
显然是办法二。组(group)就是为了"批量授权"而存在的。
比喻:权限就像门禁卡。你不会给每个人单独配一把锁(太麻烦),你会给"部门"配一张卡,人来了进部门就有卡,走了退部门就失效。
24.2 主组和附加组(重点,别混)
每个用户必然有一个主组,还可以有零到多个附加组。
| 类型 | 数量 | 什么时候创建 | 作用 |
|---|---|---|---|
| 主组 | 有且只有 1 个 | 建用户时自动创建,和用户同名 | 你新建的文件,属组默认就是你的主组 |
| 附加组 | 可以 0 个或多个 | 手动加 | 额外获得这个组的权限 |
比喻:
- 主组像你的"班级"——你只有一个班级,你交的作业默认写的是你班级的名字。
- 附加组像你的"社团"——你可以同时参加多个社团,每个社团的活动你都能参加。
一条必须记住的话:
主组决定你"新创建的文件属于哪个组";附加组只决定你"能访问哪些组的资源"。
24.3 看看组在哪里
# 看系统里有哪些组(文件很长,看最后几行)
tail -5 /etc/group
# 你会看到类似:
tom:x:1000:
wheel:x:10:tom
docker:x:994:
# 看某个用户到底在哪些组里
id tom
# 你会看到:
uid=1000(tom) gid=1000(tom) groups=1000(tom),10(wheel),994(docker)
/etc/group 每行四段:组名:密码占位:GID:组里的成员列表
24.4 组的增删改
# 创建组
groupadd dev
# 改组名
groupmod -n developer dev
# 删组
groupdel developer
# 把用户加进组(两种写法,效果一样)
usermod -aG dev tom
gpasswd -a tom dev
# 把用户从组里移除
gpasswd -d tom dev
⚠️ 注意:
usermod -G不加-a会覆盖原有的附加组列表,见第 23 章的坑。💡 小贴士:用户被加进新组后,当前已经登录的会话不会立刻生效。要么退出重新登录,要么执行
newgrp 组名临时切换。这是"明明加了组却不生效"的常见原因。
24.5 有几个组名你要认识
| 组 | 作用 |
|---|---|
root |
超级管理员组 |
wheel |
红帽系里"可以 sudo"的组,成员能用 sudo 提权 |
sudo |
Debian/Ubuntu 里"可以 sudo"的组,作用同 wheel |
users |
普通用户组(不同发行版行为不同,了解即可) |
本章小结
| 概念 | 要点 |
|---|---|
| 组的作用 | 批量授权,避免一个个设权限 |
| 主组 | 只有 1 个,和用户同名,决定新建文件的属组 |
| 附加组 | 可以有多个,用来获得额外权限 |
| 建组 | groupadd dev |
| 加人进组 | usermod -aG dev tom |
| 从组里删人 | gpasswd -d tom dev |
| 生效条件 | 重新登录(或 newgrp) |
动手练
- 建一个组
dev,建一个用户lisi,把lisi加进dev组,用id lisi验证。 lisi新建一个文件,这个文件的属组是什么?- 判断题:给
dev组设了读权限,lisi就一定能读,因为他已经在dev组里了。
参考答案
groupadd dev;useradd lisi;usermod -aG dev lisi;id lisi输出里应出现dev。- 是
lisi的主组,也就是lisi(因为主组和用户同名)。注意:不是dev,除非你把lisi的主组改成了dev。 - 不一定。要看他当前登录的会话有没有加载新组——刚用
usermod加的组,需要重新登录(或newgrp dev)才生效。
第25章 权限的三个字母 rwx 🔰
学完这一章,你能:说清 r、w、x 分别是什么,以及它们对"文件"和"目录"的意义为什么完全不同。
25.1 权限是给"三种人"分的
Linux 把所有人分成三类身份,权限针对这三类分别设置:
| 身份 | 英文 | 是谁 |
|---|---|---|
| 属主 | User | 文件的主人(创建者,或被 chown 改成的人) |
| 属组 | Group | 文件所属组里的其他人 |
| 其他 | Other | 既不是属主、也不在属组里的所有人 |
这三类合起来叫 UGO。每个文件,系统都会分别记录"这三种人各有什么权限"。
25.2 权限只有三种:rwx
| 字母 | 含义 | 数值 |
|---|---|---|
r |
read,读 | 4 |
w |
write,写 | 2 |
x |
execute,执行 | 1 |
- |
没有这个权限 | 0 |
那个数字(4、2、1)很有用,第 27 章讲 chmod 数字法时会用到,先记着。
25.3 关键:rwx 对文件和对目录,意思不一样!
这是初学者最大的坎,请务必看清楚。 同一个 r,对文件和目录是完全不同的两件事。
| 权限 | 对文件 | 对目录 |
|---|---|---|
r |
能看内容(cat、head) |
能列出目录里有哪些文件(ls) |
w |
能修改内容(编辑、追加) | 能在目录里新建、删除、改名文件 |
x |
能运行(必须是程序;.txt 加了 x 也运行不了) |
能进入这个目录(cd) |
用"房间"来理解目录权限:
比喻:把目录想成一个房间。
r= 你能站在门口看到里面有什么(但不能进去);x= 你能推门进去;w= 你能往房间里搬东西、扔东西。
于是会有一个反直觉但非常重要的结论:
⚠️ 注意:只有
r没有x,你是进不去目录的。 也就是说ls 目录能列出文件名,但cd 目录会失败,也打不开里面的文件。反过来,只有
x没有r:你能cd进去,也能访问你已经知道名字的文件,但ls看不到里面有什么。
25.4 对目录的 w 有个"隐藏技能"
这里有个超纲但很实用的知识点,理解了你会少踩很多坑:
删除一个文件,看的是"它所在目录"的
w权限,而不是文件本身的w权限。
也就是说:一个文件哪怕设成 444(谁都不能改),只要你对它所在的目录有 w,你依然能 rm 把它删掉。
原因很简单:文件的"名字"是记录在目录里的,删文件本质上是"从目录里删掉这个名字"。
⚠️ 注意:这也解释了第 13 章的"
rm没有回收站"为什么这么危险——只要有目录写权限,删掉就真没了。顺带一提,
/tmp目录用了 Sticky Bit(第 30 章),就是为了解决"大家都能往 /tmp 写,但只能删自己的文件"这个矛盾。
本章小结
| 概念 | 要点 |
|---|---|
| 三种身份 | 属主 U、属组 G、其他 O |
| 三种权限 | r=4 读、w=2 写、x=1 执行 |
| 对文件 | r 看内容、w 改内容、x 能运行 |
| 对目录 | r 能 ls、w 能建删改名、x 能 cd 进入 |
| 无 x 的目录 | 进不去,也打不开里面的文件 |
| 删文件看谁 | 看文件所在目录的 w 权限 |
动手练
- 一个目录权限是
r--(只有 r),你能ls它吗?能cd进去吗? - 一个文件权限是
444,但它在权限为777的目录里。你能删掉这个文件吗? - 为什么"能 ls 看到文件名"不等于"能打开这个文件"?
参考答案
- 能
ls(看得到文件名列表),但不能cd(没有 x),也打不开里面的文件。 - 能。删除看的是目录的 w 权限,与文件自身权限无关。
- 因为
ls只需要目录的r;而打开文件需要对目录有x(能进入),还需要对文件本身有r。
第26章 看懂 ls -l 的输出 🔰
学完这一章,你能:看懂
ls -l每一列在说什么,一眼判断"这是文件还是目录、谁能动它"。
26.1 先跑一下
ls -l
# 你会看到类似这样的输出:
总用量 4
-rw-r--r--. 1 root root 2058 5月 11 16:21 a.txt
drwxr-xr-x. 2 root root 6 5月 13 09:41 dir01
lrwxrwxrwx. 1 root root 7 5月 13 10:02 link.txt -> a.txt
一行里挤了 9 段信息,我们把它们拆开看。
26.2 逐段拆解
以这行为例:
-rw-r--r--. 1 root root 2058 5月 11 16:21 a.txt
└────┬───┘ │ │ │ │ │ │
①权限 ② ③属主 ④属组 ⑤大小 ⑥修改时间 ⑦文件名
| 编号 | 内容 | 说明 |
|---|---|---|
| ① | -rw-r--r-- |
权限位,共 10 个字符,第 1 个是文件类型,后面 9 个是权限 |
| ② | 1 |
硬链接数(目录的这个数一般是子目录数 + 2) |
| ③ | root |
属主(文件的主人) |
| ④ | root |
属组 |
| ⑤ | 2058 |
大小,单位是字节(不是 KB!) |
| ⑥ | 5月 11 16:21 |
最后修改时间 |
| ⑦ | a.txt |
文件名(如果是软链接,会显示 -> 指向哪里) |
26.3 第①段细看:10 个字符怎么读
-rw-r--r-- 这 10 个字符这样切:
- rw- r-- r--
└┘ └┬┘ └┬┘ └┬┘
类型 属主 属组 其他
- 第 1 个字符:文件类型
| 字符 | 类型 | 你会在哪见到 |
|---|---|---|
- |
普通文件 | 文本、程序、图片、压缩包…… |
d |
目录(directory) | 就是文件夹 |
l |
软链接(link) | 类似 Windows 的快捷方式 |
b |
块设备(block) | 硬盘、U 盘、光盘,都在 /dev |
c |
字符设备(character) | 键盘、鼠标、打印机 |
s |
套接字(socket) | 程序之间通信用的文件 |
p |
管道(pipe) | 进程之间传数据 |
日常你 99% 只会碰到前三种:-、d、l。
- 后面 9 个字符:三组权限,每组 3 位,顺序永远是
rwx:
rw-r--r--
rw- | r-- | r--
属主 r+w 属组 只读 其他 只读
所以 -rw-r--r-- 读作:"这是一个普通文件;主人能读能写;同组的人只能读;其他人只能读。"
再看 drwxr-xr-x:这是一个目录;主人能读能写能进;同组能读能进;其他人能读能进。
26.4 后面那个点 . 和加号 +
-rw-r--r--. 1 root root 2058 5月 11 16:21 a.txt
↑
-rw-rw----+ 1 root root 0 5月 14 16:14 1.txt
↑
| 符号 | 含义 |
|---|---|
. |
该文件有 SELinux 安全上下文(安全模块标记),通常不用管 |
+ |
该文件设置了 ACL(第 32 章),说明除了 UGO 还有额外授权 |
| 没有 | 一切正常,只有普通权限 |
💡 小贴士:看到
+号就说明"这个文件的权限没你想的那么简单",想搞清楚要用getfacl 文件名看。
26.5 两种等价的查看方式
ls -l a.txt # 只看一个文件
ls -l /etc/ # 看某个目录里所有文件的详情
ls -ld /etc/ # 只看 /etc 这个目录本身的权限,不列出里面的内容
⚠️ 注意:
ls -l /etc/列出的是/etc里面的文件;想知道/etc这个目录自己的权限,必须加-d。新手经常在这里搞错,看到一堆文件却找不到"目录的权限在哪"。
本章小结
| 位置 | 内容 |
|---|---|
| 第 1 位 | 类型:- 文件、d 目录、l 软链接 |
| 2~4 位 | 属主权限 |
| 5~7 位 | 属组权限 |
| 8~10 位 | 其他用户权限 |
| 后面 | 硬链接数、属主、属组、大小(字节)、时间、文件名 |
尾部的 . |
SELinux 标记,通常忽略 |
尾部的 + |
有 ACL 权限 |
动手练
-rwxr-x---分别表示三种身份有什么权限?- 用一条命令只看
/etc这个目录本身的权限。 - 输出里大小显示
4096的d类型条目,这个 4096 是什么?
参考答案
- 属主
rwx(可读可写可执行),属组r-x(可读可执行),其他---(什么权限都没有)。 ls -ld /etc。- 目录的大小不是"里面文件的总大小",而是记录这个目录里文件名清单所占用的磁盘空间,通常固定占一个块(4096 字节 = 4KB)。要看目录里文件的总大小,用
du -sh 目录。
第27章 修改权限 chmod 🔰
学完这一章,你能:用两种方法精确地设置权限,并知道常用的几个权限数字代表什么。
27.1 只有两种人会改权限
- 文件的属主(自己的文件自己能改);
- root(什么都能改)。
改权限的命令叫 chmod(change mode,改变模式)。
它有两种写法:符号法(像说话一样,好理解)和数字法(快,但要想一下)。两种都要会。
27.2 符号法:u / g / o / a + / - / = 和 rwx
格式:chmod 谁 加还是减 什么权限 文件
- 谁:
u(属主)、g(属组)、o(其他)、a(所有人 = ugo) - 怎么改:
+增加、-减少、=直接设定成这个值 - 什么权限:
r、w、x
# 给属主增加写权限
chmod u+w a.txt
# 去掉属组的执行权限
chmod g-x a.txt
# 给其他人增加读权限
chmod o+r a.txt
# 给所有人加上执行权限(最常用的一条)
chmod +x run.sh
# 一次设定三个身份:属主 rwx、属组 r-x、其他无
chmod u=rwx,g=r-x,o=--- a.txt
# 一次给属主和属组都加读权限(逗号分隔)
chmod u+r,g+r a.txt
符号法的优点:改的时候不用管原来是什么权限,只说我"要加/减/设"什么。适合微调。
27.3 数字法:把三个权限加起来
这是工作中最常用的写法,也是面试必考。原理很简单:
| 权限 | 数值 |
|---|---|
| r | 4 |
| w | 2 |
| x | 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 |
然后三个身份三个数字,拼成一个三位数:
chmod 7 5 5 文件
│ │ └── 其他:5 = r-x
│ └──── 属组:5 = r-x
└────── 属主:7 = rwx
练习一下口算(自己先算,再看答案):644 是什么?
- 6 = 4+2 =
rw- - 4 =
r-- - 4 =
r-- - 所以
644=-rw-r--r--,也就是"主人能读能写,其他人只能读"。
# 一次性把文件设成 rw-r--r--
chmod 644 a.txt
# 给所有用户全部权限(危险!)
chmod 777 a.txt
27.4 五个你必须记住的常用权限
| 数字 | 权限 | 用在哪 | 说明 |
|---|---|---|---|
644 |
rw-r--r-- |
普通文件、网页、配置 | 主人能改,别人只能看。最常用 |
755 |
rwxr-xr-x |
目录、可执行程序 | 主人全权,别人能进能看 |
600 |
rw------- |
私密文件(密钥、密码本) | 只有主人能读写,别人完全看不到 |
700 |
rwx------ |
私密目录(家目录、.ssh) | 只有主人能进,别人连门都进不去 |
777 |
rwxrwxrwx |
几乎不该用 | 所有人都能改,等于没上锁 |
⚠️ 注意:
chmod 777是新手最爱干、运维最讨厌见到的操作。遇到"权限不够"就
chmod 777,确实能"解决",但同时打开了所有人的权限:
- 网站目录 777,别人可以上传恶意脚本;
- 私钥文件 777,等于把密码贴墙上;
- 更可怕的是
chmod -R 777 /(对根目录递归),系统直接报废,救不回来。
正确的思路永远是:想清楚"谁需要什么权限",只给到够用为止。
27.5 递归改权限:-R
# 把目录和里面所有文件的权限都改成 755(递归)
chmod -R 755 /data/app
⚠️ 注意:
-R会连子目录、子文件全部改掉,而且文件和目录用同一个数字会出问题——目录需要755(有 x 才能进),普通文件通常只需要644。全都设成 755 虽然能用但不符合最小权限原则;全都设成 644 则目录进不去。专业做法是分开设:
```bash
目录设 755,普通文件设 644
find /data/app -type d -exec chmod 755 {} \; find /data/app -type f -exec chmod 644 {} \; ```
27.6 特殊:给文件加执行权限
# 写了一个脚本,想让它能直接运行
chmod +x backup.sh
# 然后就能这样跑
./backup.sh
💡 小贴士:为什么用
./backup.sh而不是backup.sh?因为当前目录.默认不在系统的 PATH 搜索路径里。敲./的意思是"就在当前目录找这个文件"。这是很常见的疑惑,记住就好。
本章小结
| 写法 | 例子 | 说明 |
|---|---|---|
| 符号法加 | chmod u+w a.txt |
给属主加写权限 |
| 符号法设 | chmod u=rwx,g=rx,o= a.txt |
直接设定 |
| 数字法 | chmod 644 a.txt |
三位数,分别对应 ugo |
| 递归 | chmod -R 755 目录 |
小心用 |
| 记住 | 4=读、2=写、1=执行 | 相加得每位的数字 |
| 常用 | 含义 | 场景 |
|---|---|---|
| 644 | 主人读写,别人只读 | 普通文件 |
| 755 | 主人全权,别人可读可进 | 目录、程序 |
| 600 | 只有主人读写 | 私密文件 |
| 700 | 只有主人能进 | 私密目录 |
动手练
chmod 640 a.txt之后,ls -l显示的是什么?- 把
a.txt设成"属主可读写执行,属组可读,其他人无权限",用数字法怎么写? - 一个目录权限是
644,别人能cd进去吗?为什么?
参考答案
-rw-r-----(6=rw-,4=r--,0=---)。- 属主 7(rwx)、属组 4(r--)、其他 0(---),所以是
chmod 740 a.txt。 - 不能。进入目录需要
x权限,而644拆开是rw-/r--/r--,三段里一个x都没有,所以连属主自己也进不去,别人更进不去。
第28章 修改属主和属组:chown、chgrp 🔰
学完这一章,你能:把文件"过户"给别人,或者挂到某个组下面。
28.1 什么时候需要改属主
场景:你用 root 解压了一个网站程序到 /var/www/html,结果文件属主全是 root。网站是以 apache 用户运行的,它改不了这些文件,网站就报错。
这时候要做的是改属主,而不是 chmod 777。这是"权限问题"最常见的正确处理方式。
28.2 chown:改属主
chown = change owner(改变主人)。
# 只改属主
chown apache a.txt
# 改属主的同时改属组,用冒号连起来
chown apache:apache a.txt
# 递归改整个目录
chown -R apache:apache /var/www/html
语法:chown 属主[:属组] 文件
chown tom file—— 只把属主改成 tom,属组不动chown tom:dev file—— 属主改成 tom,属组改成 devchown :dev file—— 只改属组(冒号前面空着)chown tom: file—— 注意:这样写会把属组改成 tom 的主组
💡 小贴士:
chown tom:dev这种"用户:组"的写法最常用,一次搞定两件事,比用两条命令省事。
28.3 chgrp:只改属组
chgrp = change group。功能单一,就是改属组。
# 把文件的属组改成 dev
chgrp dev a.txt
# 递归改目录
chgrp -R dev /data/project
它和 chown :dev a.txt 效果一样,你挑一个顺手的记就行。
28.4 谁有权改属主
| 操作 | 谁能做 |
|---|---|
| 改自己的文件的属组(改到自己所在的某个组) | 属主本人 |
| 改属主 | 只有 root |
| 把文件给别人 | 只有 root |
道理很简单:如果能随便把文件"过户"给别人(尤其是 root),就可以用来栽赃或提权,所以这个权限被锁死了。
⚠️ 注意:普通用户执行
chown会报Operation not permitted(不允许的操作),这是正常的,加sudo就行。
28.5 一个完整案例(很典型,建议跟着敲)
# 1. 建一个测试目录
mkdir -p /data/web
echo "hello" > /data/web/index.html
# 2. 看看现在是谁的
ls -l /data/web/
# 你会看到:属主属组都是 root(因为你用 root 建的)
-rw-r--r--. 1 root root 6 10月 30 10:00 index.html
# 3. 把整个目录交给 tom
chown -R tom:tom /data/web
ls -l /data/web/
# 你会看到:属主属组都变成了 tom
-rw-r--r--. 1 tom tom 6 10月 30 10:00 index.html
# 4. 切换到 tom 试试能不能改
su - tom -c 'echo "hi" >> /data/web/index.html'
# 没有报错就成功了(因为 tom 现在有写权限)
本章小结
| 命令 | 作用 | 常用写法 |
|---|---|---|
chown |
改属主 | chown tom file |
chown |
同时改属主和属组 | chown tom:dev file |
chown |
只改属组 | chown :dev file |
chgrp |
只改属组 | chgrp dev file |
| 递归 | 目录下全部 | 加 -R |
| 权限 | 改属主只能 root | 普通用户要 sudo |
动手练
- 把
/data/web目录(含里面所有文件)的属主和属组都改成tom。 chown tom file和chown tom: file有什么区别?- 网站报 "Permission denied",文件属主是 root、目录属主是 root,网站进程是 apache 用户。正确的做法是什么?
参考答案
chown -R tom:tom /data/web。chown tom file只改属主,属组保持不变;chown tom: file会把属主改成 tom,同时把属组改成 tom 的主组。- 把文件交给 apache:
chown -R apache:apache /var/www/html,再配合chmod 755(目录)/644(文件)。不要用chmod 777。
第29章 umask:新文件的默认权限 🔧
学完这一章,你能:解释"为什么我新建的文件权限是 644 而不是 777",并会自己改默认值。
29.1 一个自然的问题
你新建一个文件,没设过任何权限,那它的权限是谁定的?
答案:系统按一个"默认规则"自动给的,这个规则叫 umask(权限掩码)。
# 看看当前的 umask
umask
# 你会看到:
0022
29.2 umask 是"减掉的权限"
先记住两个基准值(系统定的,背下来):
| 新建 | 最高权限 |
|---|---|
| 目录 | 777 |
| 普通文件 | 666 |
💡 为什么文件不是 777? 因为 Linux 觉得"新建一个文本文件就带执行权限"太危险了(万一被塞了恶意脚本,一敲就执行)。所以文件的基础权限里天生不带 x。
然后 umask 的作用是"从基准值里减掉这些权限":
目录:777 - 022 = 755 → drwxr-xr-x
文件:666 - 022 = 644 → -rw-r--r--
022 的意思是"从属组和其他人那里,各减掉写权限(2)"。所以:
- 目录默认
755:主人能读写进,别人只能读和进; - 文件默认
644:主人能读写,别人只能读。
29.3 验证一下
# 新建一个目录和一个文件
mkdir testdir
touch testfile
ls -ld testdir testfile
# 你会看到:
drwxr-xr-x. 2 root root 6 10月 30 10:05 testdir
-rw-r--r--. 1 root root 0 10月 30 10:05 testfile
和推算的 755 / 644 完全一致。
29.4 改 umask
# 临时改(只对当前这个终端有效,关掉就没了)
umask 077
mkdir private_dir
ls -ld private_dir
# 你会看到:目录变成了 700(只有自己能进)
drwx------. 2 root root 6 10月 30 10:06 private_dir
077 = "把属组和其他的所有权限都减掉",所以目录变成 700、文件变成 600。这在做安全加固时很常用。
永久修改要写到配置文件里(比如 ~/.bashrc 末尾加一行 umask 077),然后重新登录。
29.5 常见的 umask 值
| umask | 目录默认 | 文件默认 | 含义 |
|---|---|---|---|
022 |
755 | 644 | 最常见,同组和其他人可读 |
002 |
775 | 664 | 团队共享,同组可写 |
077 |
700 | 600 | 私密,别人什么都看不到 |
⚠️ 注意:umask 是"减"不是"加",这是最容易记反的地方。而且这种减法其实是按位减(去掉对应权限位),只是对常见的
022来说,直接当算术减法算出来的结果恰好一样,方便你理解。看到027这类值时别硬算,理解成"去掉对应权限位"就好。
本章小结
| 概念 | 要点 |
|---|---|
| umask | 新建文件/目录时"减掉"的权限 |
| 基准值 | 目录 777、文件 666(文件天生无 x) |
| 默认值 | 022 → 目录 755、文件 644 |
| 查看 | umask |
| 临时改 | umask 077(只影响当前终端) |
| 永久改 | 写进 ~/.bashrc 或 /etc/profile |
动手练
- umask 是
022时,新建目录和新建文件的权限各是多少? - 想让新建文件默认是
600(只有自己能读写),umask 要设成多少? - 判断题:把 umask 设成
000,新建文件就是 777。
参考答案
- 目录
777-022=755;文件666-022=644。 077。它的含义是"把属组和其他的所有权限都去掉",所以文件变成600、目录变成700。- 错。文件的基础权限是
666,天生没有 x,所以 umask 设成000时新建文件是666(rw-rw-rw-),不是777。只有目录才会是777。
第30章 三个特殊权限 🔧
学完这一章,你能:看懂
ls -l里出现的s和t,并知道它们各自解决什么问题。
30.1 它们解决什么"普通权限解决不了"的问题
普通的 rwx 有三个场景搞不定:
- 普通用户要改自己的密码,但密码存在只有 root 能改的文件里 —— 怎么做到的?
- 一个团队共享目录,大家新建的文件都要自动属于同一个组 —— 怎么做到的?
/tmp所有人可写,怎么防止我删掉别人的文件? —— 怎么做到的?
答案就是三个特殊权限:SUID、SGID、Sticky Bit。
30.2 SUID(4):临时借用"主人"的身份
作用:一个程序带了 SUID,任何人运行它,都会以"程序的主人"的身份运行,而不是以自己的身份。
最经典的例子就是 passwd:
ls -l /usr/bin/passwd
# 你会看到(属主那一段是 rws,注意这个 s):
-rwsr-xr-x. 1 root root 27856 4月 1 2020 /usr/bin/passwd
分析一下:
- 这个文件的属主是 root;
- 它的属主权限是
rws(s就是 SUID); - 所以普通用户执行
passwd时,实际上是"以 root 身份"在运行; - 而
/etc/shadow(存密码的文件)只有 root 能改,所以普通用户才能改自己的密码。
没有 SUID 会怎样? 普通用户就改不了自己的密码了——因为他没有权限写 /etc/shadow。
设置方法:
chmod u+s 程序名 # 符号法
chmod 4755 程序名 # 数字法:在前面加个 4
⚠️ 注意:SUID 只有对可执行程序才有意义。而且如果文件本身没有
x权限,s会显示成大写S,表示"设置了但没生效"。另外,SUID 是提权手段,也是黑客最爱利用的东西。运维定期检查系统里"谁是 SUID 文件",就是为了排查后门。
30.3 SGID(2):目录里的文件自动继承组
SGID 有两个作用,对目录的那个作用最实用:
| 用在 | 作用 |
|---|---|
| 文件 | 运行时以"文件的属组"身份运行 |
| 目录 | 在这个目录里新建的文件,属组自动变成这个目录的属组 |
场景:
/data/project是dev组共享的开发目录,组里有 tom、jerry、alice。问题:tom 新建一个文件,属组是
tom(他的主组)。jerry 就改不了这个文件,因为 jerry 只属于dev组。解决:给目录加 SGID,之后任何人在这个目录里新建文件,属组都自动是
dev。
# 给目录加 SGID
chmod g+s /data/project
# 或者数字法(2755)
chmod 2755 /data/project
ls -ld /data/project
# 你会看到属组权限位变成了 rws:
drwxrwsr-x. 2 root dev 6 10月 30 10:10 /data/project
30.4 Sticky Bit(1):只能删自己的文件
作用:加了 Sticky Bit 的目录,里面的文件只有"文件的主人"或 root 才能删,别人就算有目录写权限也删不了。
经典例子就是 /tmp:
ls -ld /tmp
# 你会看到最后一位是 t:
drwxrwxrwt. 12 root root 4096 10月 30 10:11 /tmp
/tmp 的权限是 777(所有人可写),但因为它带了 t,所以:
- 你可以在
/tmp里新建自己的文件(有w); - 你删不掉别人的文件(被
t挡住了)。
没有 t 会怎样? 任何人在 /tmp 里都能删你正在用的临时文件,程序就崩了。
# 设置方法
chmod o+t 目录名
chmod 1777 目录名 # 数字法前面加 1
30.5 三个放在一起记
| 权限 | 数值 | 给谁加 | 效果 | 记住这个例子 |
|---|---|---|---|---|
| SUID | 4 | 可执行程序 | 运行时借用属主身份 | /usr/bin/passwd |
| SGID | 2 | 目录 | 新建文件的属组自动继承 | 团队共享目录 |
| Sticky | 1 | 目录 | 只能删自己的文件 | /tmp |
数字法的口诀:这三位是"第四位",写在原来的三位权限前面。
chmod 4755 程序 → SUID + rwxr-xr-x
chmod 2755 目录 → SGID + rwxr-xr-x
chmod 1777 目录 → Sticky + rwxrwxrwx
⚠️ 注意:SGID 和 Sticky 都是给目录用的,而且目录本身必须有
x权限才会生效——否则你连目录都进不去,特殊权限也就没了意义。
本章小结
| 特殊权限 | 数字 | 作用对象 | 一句话作用 |
|---|---|---|---|
| SUID | 4 | 程序 | 借主人身份运行(passwd) |
| SGID | 2 | 目录 | 新文件自动继承目录的属组 |
| Sticky Bit | 1 | 目录 | 只能删自己的文件(/tmp) |
| 显示 | s / t |
出现在权限位里;大写 S/T 表示未生效 |
动手练
- 为什么
/usr/bin/passwd需要 SUID?如果没有会怎样? /tmp是777,为什么你删不掉别人在里面建的文件?- 给目录
/data/share加 SGID,用数字法怎么写?
参考答案
- 因为普通用户改密码时要写
/etc/shadow,而这个文件只有 root 能写。有了 SUID,普通用户运行passwd时相当于以 root 身份执行,才能完成写密码文件的操作。没有 SUID,普通用户就改不了自己的密码。 - 因为
/tmp带了 Sticky Bit(t),规则变成"只有文件主人和 root 能删",目录的w权限被这条规则限制住了。 chmod 2755 /data/share(或chmod g+s /data/share)。
第31章 隐藏权限:chattr 和 lsattr 🔧
学完这一章,你能:给重要文件上一把"连 root 都打不开"的锁。
31.1 普通权限管不住 root
前面讲的 UGO、ACL,对 root 都无效——root 是老板,什么门都拦不住他。
但有些场景,恰恰需要"连 root 也不能乱动":
- 系统关键日志文件,怕被误删或篡改;
- 服务器被入侵后,攻击者常会改配置文件留后门;
- 重要配置文件,怕手抖删掉。
这就是隐藏权限(也叫文件属性)的用武之地。它对包括 root 在内的所有用户都生效。
31.2 查看隐藏权限:lsattr
lsattr anaconda-ks.cfg
# 你会看到:
---------------- anaconda-ks.cfg
那一串 - 表示"什么都没设置"。如果某个位置出现字母,就表示设置了对应的属性。
31.3 最常用的两个属性:+i 和 +a
| 属性 | 名称 | 效果 | 适合用在哪 |
|---|---|---|---|
+i |
immutable(不可变) | 不能删除、不能修改、不能改名、不能追加,只能查看和复制 | 系统核心配置、重要文件 |
+a |
append only(只追加) | 只能往后追加内容,不能删除原内容、不能覆盖 | 日志文件(防止日志被篡改) |
# 给文件加"不可变"锁
chattr +i important.conf
# 验证一下
lsattr important.conf
# 你会看到(i 出现了):
----i----------- important.conf
# 现在试试删它(root 也不行!)
rm -f important.conf
# 你会看到:
rm: cannot remove 'important.conf': Operation not permitted
# 想改?先解锁
chattr -i important.conf
# 日志文件只能追加,不能删改
chattr +a /var/log/messages
# 现在不能覆盖,但能追加
echo "test" >> /var/log/messages # 成功
> /var/log/messages # 失败!不允许清空
⚠️ 注意:忘了自己加过
+i,会是一个非常抓狂的经历。表现是:明明你是 root,明明权限是
777,就是删不掉、改不了,报错还特别含糊。这时候第一反应应该是:
bash lsattr 文件名看到
i就chattr -i解锁。这个坑很多人踩过,记住能省你半天时间。
本章小结
| 命令 | 作用 |
|---|---|
lsattr 文件 |
查看隐藏权限 |
chattr +i 文件 |
加不可变锁(不能删改) |
chattr -i 文件 |
解锁 |
chattr +a 文件 |
只能追加(保护日志) |
chattr -a 文件 |
取消追加限制 |
| 特点 | 对 root 也生效 |
动手练
- 给文件加
+i后,用 root 执行rm会怎样? - 日志文件该用
+i还是+a?为什么? - 你发现一个文件权限是 777、属主是 root、你也是 root,但就是删不掉。先查什么?
参考答案
- 会失败,报
Operation not permitted。因为不可变属性对 root 也生效。 - 用
+a。因为日志需要持续追加新内容,+i会连追加都禁止,日志就写不进去了;+a允许追加但禁止删除和覆盖,正好防篡改。 - 先执行
lsattr 文件名,看是不是被加了i(或者a)属性。
第32章 ACL:给某个用户单独开小灶 🔧
学完这一章,你能:在"属主/属组/其他"之外,单独给某一个人或某个组开权限。
32.1 UGO 不够用的时候
假设有个文件:
- 属主是 tom;
- 属组是 dev(里面有 jerry、alice);
- 权限是
640(rw-r-----)。
现在有个既不是 tom、也不在 dev 组的人叫 bob,他临时需要读这个文件。
怎么办?
- 把 bob 加进 dev 组?——那他就获得了 dev 组所有的权限,给多了。
- 把文件改成
644?——那"其他所有人"都能读了,给多了。
UGO 只有三个格子,塞不下"只给 bob 一个人读"这种需求。
这就是 ACL(Access Control List,访问控制列表)要解决的问题:在三个格子之外,再单独点名授权。
比喻:UGO 是"公司通行证分三种:本人、本部门、外人"。ACL 就是"临时访客单"——我可以专门给张三开一张,只允许他进 3 楼会议室。
32.2 看一个文件有没有 ACL
ls -l 权限位后面出现 + 号,就说明有 ACL:
ls -l a.txt
# 注意权限位末尾的那个 +
-rw-rw----+ 1 root root 0 10月 30 10:14 a.txt
32.3 给某个用户单独授权:setfacl
# 给用户 bob 单独加读、写权限
setfacl -m u:bob:rw a.txt
# 查看结果
getfacl a.txt
# 你会看到:
# file: a.txt
# owner: root
# group: root
user::rw-
user:bob:rw- ← 这一行就是专门给 bob 的
group::---
mask::rw-
other::---
语法:setfacl -m 类型:名字:权限 文件
| 类型 | 含义 | 例子 |
|---|---|---|
u |
user,给某个用户 | setfacl -m u:bob:rw a.txt |
g |
group,给某个组 | setfacl -m g:dev:rwx a.txt |
o |
other,给其他人 | setfacl -m o::r a.txt |
32.4 撤销和清空
# 撤销 bob 的 ACL
setfacl -x u:bob a.txt
# 清空这个文件的所有 ACL
setfacl -b a.txt
32.5 给目录设 ACL,让新文件自动继承
这是 ACL 最实用的功能。加个 d:(default,默认)前缀:
# 让 /data/share 目录里"以后新建的文件"都自动带上 bob 的 rw 权限
setfacl -m d:u:bob:rw /data/share
# 查看
getfacl /data/share
# 你会看到多了一组 default 开头的:
default:user::rwx
default:user:bob:rw-
default:group::---
default:mask::rwx
default:other::---
⚠️ 注意:
d:只对"设置之后新建的"文件生效,对目录里已有的文件不起作用。 想要已有的文件也生效,得用setfacl -R -m ...递归设置。
32.6 mask 是什么(简单了解一下)
getfacl 输出里的 mask 是"ACL 权限的上限天花板":
- 你给 bob 设了
rwx,但mask只有rw-,那 bob 实际只有rw-; - 这就是
getfacl里有时会显示#effective:rw-的原因——生效的权限被 mask 削掉了。
如果发现"我明明设了权限怎么不生效",先看 mask。
本章小结
| 命令 | 作用 |
|---|---|
getfacl 文件 |
查看 ACL |
setfacl -m u:用户:权限 文件 |
给某用户单独授权 |
setfacl -m g:组:权限 文件 |
给某组单独授权 |
setfacl -x u:用户 文件 |
撤销某用户的 ACL |
setfacl -b 文件 |
清空所有 ACL |
setfacl -m d:u:用户:权限 目录 |
让目录里新建的文件继承该 ACL |
ls -l 有 + |
说明该文件有 ACL |
mask |
ACL 权限的天花板,实际权限取两者较小值 |
动手练
- 给文件
a.txt单独授予用户bob读写权限,并验证。 - 撤销 bob 的权限。
- 怎么让
/data/share目录以后新建的文件,都自动给bob读权限?
参考答案
setfacl -m u:bob:rw a.txt,然后用getfacl a.txt看到user:bob:rw-就成功了(ls -l会多出+)。setfacl -x u:bob a.txt。setfacl -m d:u:bob:r /data/share(d:是 default,只对之后新建的文件生效)。
第33章 sudo:临时借用 root 的权力 🔰
学完这一章,你能:用
sudo安全地执行管理操作,并给其他用户授权。
33.1 为什么不干脆一直用 root
新手最常见的做法是:直接 su - 变成 root,然后就再也不退出来了。这是运维大忌。
原因:
| 风险 | 说明 |
|---|---|
| 没有保护 | root 干什么都不问,rm -rf 敲错一个空格,系统就没了 |
| 无法追溯 | 大家都用 root,日志里全是 root,出了事查不到是谁 |
| 一个密码泄露 | root 密码一旦泄露,整台机器就完了 |
| 会被入侵者利用 | 攻击者拿到 root 就等于拿到一切 |
正确姿势:平时用普通用户干活,只在需要的时候,用 sudo 临时提一下权。
比喻:
sudo就像"临时借用经理的门禁卡"。你不是经理,但你需要进资料室的时候,可以刷一下卡进去办这件事,办完出来还是你自己。而不是"我干脆把自己变成本经理"。
33.2 怎么用 sudo
用法极其简单:在命令前面加 sudo。
# 想改系统配置,普通用户直接干会被拒绝
vim /etc/hosts
# 提示:"/etc/hosts" E212: Can't open file for writing(写不进去)
# 加 sudo 就行
sudo vim /etc/hosts
# 提示:你会被要求输入密码
[sudo] password for tom:
# 输你自己的密码(注意:是"你自己的",不是 root 的!),然后就能正常改了
几个关键点,一定要记牢:
- sudo 要输的是"你自己的密码",不是 root 的密码。这点和
su -完全不同,新手经常在这里懵。 - 密码输入时屏幕没有显示,输完直接回车。
- 输入一次密码后,默认 5 分钟内不用重复输。
- 只有被授权的用户才能用 sudo,没授权的人会看到
tom is not in the sudoers file。
33.3 谁能用 sudo?看组
不同发行版的"可以 sudo 的组"不一样:
| 系统 | 有 sudo 权限的组 |
|---|---|
| CentOS / RHEL | wheel |
| Ubuntu / Debian | sudo |
所以授权最简单的办法就是把人加进这个组:
# CentOS:把 tom 加进 wheel 组
usermod -aG wheel tom
# Ubuntu:把 tom 加进 sudo 组
usermod -aG sudo tom
💡 小贴士:加完组后,tom 要重新登录才生效(第 24 章提过)。不生效别怀疑命令写错了,先退出重登。
33.4 更精细的授权:/etc/sudoers
上面的办法是"要么全给,要么不给"。如果你想只给某几条命令的权限,就要改 /etc/sudoers 文件。
# 1. 必须用 visudo 命令编辑(重要!)
visudo
# 2. 在文件末尾加一行,例如允许 tom 用 sudo 执行任意命令、且不用输密码
tom ALL=(ALL) NOPASSWD:ALL
# 3. 保存退出(vim 操作:Esc 然后 :wq 回车)
这行的意思是:
| 部分 | 含义 |
|---|---|
tom |
用户名(前面加 % 表示组,如 %wheel) |
ALL= |
允许从任何主机登录时使用 |
(ALL) |
允许以任何人(包括 root)的身份执行 |
NOPASSWD:ALL |
执行所有命令,且不用输密码(NOPASSWD: 可省略,省略就要输密码) |
更安全的写法(只授权特定命令):
# 只允许 tom 用 sudo 管理系统服务和查看日志,其他一概不行
Cmnd_Alias SVC = /usr/bin/systemctl, /usr/bin/journalctl
tom ALL=(ALL) SVC
禁止某些命令(用 ! 排除):
# 给全部权限,但禁止改密码、禁止重启
tom ALL=(ALL) ALL,!/usr/bin/passwd,!/usr/sbin/reboot
⚠️ 注意:
/etc/sudoers必须用visudo命令改,不要直接用vim打开改。为什么?因为
visudo会在你保存时自动检查语法,写错会提示你,不让你保存。而如果你用
vim直接改,语法写错了,所有用户(包括 root)都用不了 sudo 了,那时候连修都修不了(因为修它本身需要 sudo)。这是一个能让你重装系统的坑。
33.5 sudo 常用参数
| 参数 | 作用 |
|---|---|
sudo 命令 |
提权执行一条命令 |
sudo -i |
切换到 root 的交互式 shell(相当于 su -,但要输自己的密码) |
sudo -l |
查看自己有哪些 sudo 权限(排查问题很有用) |
sudo -u 用户 命令 |
以指定用户的身份执行,而不是 root |
sudo -k |
让当前的免密状态立刻失效 |
# 看看我被授权做什么
sudo -l
# 你会看到类似:
User tom may run the following commands on localhost:
(ALL) NOPASSWD: ALL
33.6 出错排查:三行报错对照表
| 报错 | 原因 | 怎么办 |
|---|---|---|
tom is not in the sudoers file |
没授权 | 用 root 把他加进 wheel(CentOS)或 sudo(Ubuntu)组 |
Sorry, user tom may not run sudo on localhost |
有授权但这条命令不允许 | 用 sudo -l 看允许什么 |
sudo: command not found |
系统没装 sudo | root 执行 yum install -y sudo 或 apt install -y sudo |
本章小结
| 知识点 | 要点 |
|---|---|
| sudo 是什么 | 临时借用 root 权限执行一条命令 |
| 要输谁的密码 | 自己的(su - 才要 root 的) |
| CentOS 授权组 | wheel |
| Ubuntu 授权组 | sudo |
| 加进组 | usermod -aG wheel tom,之后需重新登录 |
| 编辑 sudoers | 必须用 visudo,不能用 vim 直接改 |
| NOPASSWD | 免输密码,方便但降低安全性 |
| 查自己权限 | sudo -l |
动手练
- 用普通用户执行
sudo whoami,输出是什么?为什么? su -和sudo -i都要输密码,区别是什么?- 为什么改
/etc/sudoers一定要用visudo?
参考答案
- 输出是
root。因为sudo让这条命令以 root 身份执行了。 su -要输 root 的密码(需要知道 root 密码,所有权限一把抓);sudo -i要输 自己的密码(只需自己账号密码,且受 sudoers 授权范围限制)。sudo -i更安全,因为它不暴露 root 密码。- 因为
visudo会在保存前自动校验语法,写错会提示并不允许保存;直接用 vim 改,语法错误会让所有人都无法使用 sudo,包括 root 自己,可能连修复的机会都没有。
第六篇 装软件
Linux 装软件不是“下载 exe、双击下一步”,而是一条命令从“仓库”里取。 这一篇讲清四种装法,重点是 yum——它是你以后用得最多的一条命令。
第34章 Linux 装软件的四种方式 🔰
学完这一章,你能:说出 Linux 装软件的四种方式,知道每种方式什么时候用。
34.1 一句话:装软件就是往系统里"加东西"
在 Windows 里装软件,一般就是下载一个 .exe,双击,下一步下一步。
在 Linux 里,大部分软件不用点鼠标,而是敲一条命令。装法常分成四种,各有各的用处。
比喻:这就像给家里添家具,四种方式就是四种买法。
| 方式 | 生活里像什么 | 一句话说明 |
|---|---|---|
| yum 安装 | 网购,送货上门还包组装 | 最简单,自动把缺的零件一起送来 |
| rpm 安装 | 买一箱拆好的家具,说明书没写缺哪个螺丝 | 装单个安装包,缺零件就装不上 |
| 源码编译 | 买面粉和菜谱,自己在厨房做 | 最麻烦,但能按口味改 |
| 二进制包 | 精装修,拎包入住 | 解压改个配置就能跑 |
34.2 先看看系统里现在有什么
# 列出已经装好的软件包,只看前 3 行
yum list installed | head -3
# 你会看到类似这样的结果:
Loaded plugins: fastestmirror
Installed Packages
acl.x86_64 2.2.51-15.el7 @anaconda
系统里的软件包通常有几百行,所以接 head 只看前几行。
34.3 什么时候用哪一种
- 有网、想省事 → yum
- 手上只有一个
.rpm安装包(或一张软件光盘),或必须装某个指定版本 → rpm - 要最新版、要改代码、要关掉某个功能 → 源码编译
- MySQL、JDK 这类大软件,官方直接给打好包的 → 二进制包
💡 小贴士:还有一种更新的方式叫"容器"(Docker),把软件连环境一起打包,换台机器也能跑。这是进阶内容,现在知道有这回事就行。
34.4 常见坑 ⚠️
- 以为 Linux 也能双击
.rpm安装。桌面版可能能双击,服务器上一律用命令。 - yum 装不上就急着找源码。先看报错,多半是网络或者 yum 源的问题(下一章讲)。
- rpm 和 yum 混着用。用 rpm 装的包,yum 有时不知道它要什么,越装越容易乱。
本章小结
| 命令/概念 | 作用 | 例子 |
|---|---|---|
| yum | 从软件仓库自动装,解决依赖 | yum install -y vim |
| rpm | 手动装单个 .rpm 包 | rpm -ivh 包名.rpm |
| 源码编译 | 自己编译源码 | ./configure && make |
| 二进制包 | 解压即用 | tar -xzvf 包.tar.gz |
| 依赖 | A 要用到 B,B 就是 A 的依赖 | vim 依赖某些库 |
动手练
- 一台服务器不能上网,但手里有一张安装光盘,能用 yum 装软件吗?
- 哪种方式可以修改软件的源代码?
- 判断:在 Linux 里,软件一般靠双击安装包来安装。(对/错)
参考答案:
- 能。把光盘配成本地 yum 源就行,第 36 章会教你 6 步配好。
- 源码编译安装。拿到源码后可以改,再自己编译。
- 错。Linux 服务器上一般用命令安装。
第35章 yum:最常用的装软件方式 🔰
学完这一章,你能:用 yum 装、卸、查软件,看懂
-y是干什么的。
35.1 它是什么
yum 是"软件管家"。你说要什么,它去 yum 源里找,把软件和它需要的东西一起装好。
比喻:yum 就是外卖 App。你点一份套餐(软件),店家把配套的餐具(依赖)一起送来,不用你一份一份凑。
依赖:A 软件要用到 B 软件,B 就是 A 的依赖。少一个 B,A 就装不好。这是 rpm 最头疼的地方,yum 专门解决它。
35.2 最小可用:装一个软件
# 装 vim,-y 表示一路同意,不再问你
yum install -y vim
# 你会看到类似这样的结果:
Loaded plugins: fastestmirror
---> Package vim-enhanced.x86_64 2:7.4.629-8.el7_9 will be installed
...
Complete!
看到最后一行 Complete! 就装好了。中途刷很多行是正常的。
35.3 五个命令够用了
| 命令 | 作用 | 例子 |
|---|---|---|
yum install -y 软件名 |
安装(可一次装多个) | yum install -y wget tree zip |
yum remove 软件名 |
卸载 | yum remove wget |
yum update 软件名 |
升级到新版本 | yum update vim |
yum search 关键字 |
不知道包名时先搜 | yum search nginx |
yum info 软件名 |
看软件信息 | yum info nginx |
35.4 -y 到底是什么意思
不加 -y 时,yum 装之前会问你一句:
yum install vim
# 你会看到:
Is this ok [y/d/N]: ← 停在这里等你输入
输入 y 回车才继续。-y 就是把这一步自动回答成 y。
💡 练手时加
-y省事;想看清要装什么,就先不加。
35.5 常见坑 ⚠️:报错了先查这两件事
# 1. 网络通不通
ping -c 3 www.baidu.com
# 你会看到:3 packets transmitted, 3 received, 0% packet loss
# 100% packet loss 就是网络问题
# 2. yum 源对不对
yum repolist
# 你会看到:
repo id repo name status
base/7/x86_64 CentOS-7 - Base 10019
status 是 0,或报 Cannot find a valid baseurl,就是源没配好(第 36 章)。
还有一点:yum remove 会把依赖它的软件一起删掉,卸载前看清楚要删哪些。
本章小结
| 命令/概念 | 作用 | 例子 |
|---|---|---|
yum install -y |
安装软件 | yum install -y vim |
yum remove |
卸载软件 | yum remove wget |
yum search |
按名字搜 | yum search nginx |
-y |
自动回答 yes | 不加会停在 Is this ok |
| 依赖 | 软件运行需要的其他软件 | yum 自动解决 |
动手练
- 用一条命令装
wget、tree、zip,中间不要停下来问。 - 想装一个软件但不知道包名,怎么办?
- yum 报
Cannot find a valid baseurl,最可能是哪两个原因?
参考答案:
yum install -y wget tree zip- 先搜:
yum search 关键字,从结果里找包名。 - 网络不通,或者 yum 源配错了(baseurl 写错、光盘没挂载)。
第36章 配置 yum 源 🔰
学完这一章,你能:配好本地光盘源,没网也能装软件;也知道网络源失效了怎么查。
36.1 yum 源是什么
比喻:yum 是外卖 App,yum 源就是它背后那家超市的地址。地址写错,App 再好也点不了单。
yum 源就是软件仓库(仓库 = 一堆 rpm 包放在一起的地方),分两种:网络源(在互联网上,如阿里云、华为云镜像站)和本地源(在你自己的机器上,如安装光盘、局域网服务器)。
配置都放在 /etc/yum.repos.d/,一个 .repo 文件就是一个仓库。
36.2 配本地光盘源:6 步走
⚠️ 前提:CentOS 7 安装光盘 ISO 已挂到虚拟机(虚拟机设置里"连接 CD/DVD")。
第 1~3 步:确认光盘、建挂载点、挂上去
lsblk
# 你会看到(TYPE 是 rom 的那个就是光盘):
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 4.4G 0 rom
mkdir -p /media/cdrom
mount -r /dev/sr0 /media/cdrom # -r 只读,光盘本来也写不进去
ls /media/cdrom
# 你会看到 Packages 和 repodata 都在,说明包齐全:
CentOS_BuildTag EFI GPL Packages repodata ...
第 4 步:备份原来的源(用 mv 别用 rm,以后有网要改回来)
cd /etc/yum.repos.d/
mkdir bak && mv *.repo bak/
第 5 步:写新的源文件(vi local.repo,按 i 编辑,粘进下面内容;Esc 后输 :wq 保存)
[c7-media]
name=CentOS-7 - Media
baseurl=file:///media/cdrom/
gpgcheck=0
enabled=1
第 6 步:让 yum 认识这个源,然后就能装软件了
yum makecache
# 你会看到:
c7-media | 3.6 kB 00:00
Metadata Cache Created
36.3 有网时用网络源
CentOS 7 已经在 2024 年 6 月停止维护,官方源已下线。老机器要配源,一般换成镜像站(阿里云、华为云、清华等)的地址:做法和第 5 步一样,只换 baseurl。
baseurl=https://镜像站给的地址/centos-vault/7.9.2009/os/x86_64/
💡 地址请去镜像站网页复制,不要手敲,错一个字母就下不了。新机器建议直接用 Rocky Linux、AlmaLinux 或 Ubuntu,不用再折腾 CentOS 7。
36.4 常见坑 ⚠️
baseurl写成file://media/cdrom/(少一个斜杠)→ 本地路径必须是三条斜杠file:///- 光盘没挂载就
yum makecache→ 报Cannot find a valid baseurl - 写了
gpgcheck=1却没配gpgkey→ GPG 校验失败,新手先写gpgcheck=0 - 直接
rm掉默认源,以后想恢复很麻烦
本章小结
| 命令/概念 | 作用 | 例子 |
|---|---|---|
/etc/yum.repos.d/ |
存 yum 源配置的文件夹 | — |
mount -r /dev/sr0 /media/cdrom |
挂载光盘(只读) | 配本地源第 3 步 |
yum makecache |
生成缓存,验证源能不能用 | yum makecache |
yum repolist |
看配了哪些源 | yum repolist |
file:/// |
本地路径写法,三条斜杠 | file:///media/cdrom/ |
动手练
local.repo里写的是baseurl=file://media/cdrom/,yum makecache一直报错,问题在哪?yum repolist里某个源的 status 是 0,说明什么?- 配本地源时,为什么建议
mv *.repo bak/而不是rm *.repo?
参考答案:
- 少了一个斜杠,本地路径必须是
file:///。 - 这个仓库里一个可用的软件包都没有,源配错了或者光盘没挂载好。
mv只是挪走,随时能挪回来;rm删了就没了。
第37章 rpm:直接安装单个安装包 🔧
学完这一章,你能:装一个本地的 .rpm 包,查看它装在哪、属于谁,也知道它为什么会报"依赖错误"。
37.1 它是什么
rpm 是 RedHat 系的老牌安装工具。.rpm 文件就是"打包好的软件",里面有程序、配置文件、帮助文档。
比喻:rpm 包是一箱已经拆好的家具,箱里有一张零件清单。它能告诉系统"东西放哪",但不会替你去买缺的螺丝(依赖)。缺一颗就装不上。
| 安装包后缀 | 属于哪个系 | 常见系统 |
|---|---|---|
.rpm |
RedHat 系 | CentOS、麒麟 |
.deb |
Debian 系 | Ubuntu、UOS |
37.2 最小可用:安装
# 安装当前文件夹下的一个 rpm 包
rpm -ivh 软件包名.rpm
# 你会看到类似这样的结果:
Preparing... ################################# [100%]
1:软件包名-1.0-1.el7 ################################# [100%]
三个字母:-i 安装,-v 显示过程,-h 显示进度条。
37.3 五个查询命令(比安装更常用)
| 命令 | 作用 |
|---|---|
rpm -qa |
列出所有已安装的包 |
rpm -q 包名 |
查某个包是否已安装 |
rpm -qi 包名 |
看这个包的详细信息 |
rpm -ql 包名 |
看它装了哪些文件 |
rpm -qf 文件路径 |
看这个文件属于哪个包 |
rpm -q vim-enhanced
# 你会看到:
vim-enhanced-7.4.629-8.el7_9.x86_64
rpm -qf /usr/bin/vim
# 你会看到:
vim-enhanced-7.4.629-8.el7_9.x86_64
rpm -qf 很好用:看到一个命令不知道是哪个包提供的,一查就知道。
37.4 卸载
rpm -evh 软件包名
# 例如:
rpm -evh wget
⚠️
-e后面写的是包名(wget),不是文件名(wget-1.14-18.el7.x86_64.rpm)。
37.5 常见坑 ⚠️
- 依赖报错(最常见):
error: Failed dependencies:,就是缺东西。 解决:改用 yum 装这个本地包,它会自动补依赖:
bash
yum localinstall -y /路径/软件包名.rpm
-
拿文件名当包名:
rpm -q wget-1.14.rpm查不到,要写rpm -q wget。 -
以为 rpm 装完就完事:rpm 只管"放文件",不会帮你启动服务、改配置。
本章小结
| 命令 | 作用 | 例子 |
|---|---|---|
rpm -ivh |
安装 | rpm -ivh a.rpm |
rpm -evh |
卸载(写包名) | rpm -evh wget |
rpm -qa |
列出所有包 | rpm -qa \| wc -l |
rpm -ql |
看包里的文件 | rpm -ql wget |
rpm -qf |
文件属于哪个包 | rpm -qf /usr/bin/vim |
动手练
- 装了一个包,想知道它到底往系统里放了哪些文件,用哪个命令?
- 看到
/usr/sbin/sshd这个程序,想知道它属于哪个软件包? rpm -ivh报Failed dependencies,最简单的解决办法是什么?
参考答案:
rpm -ql 包名rpm -qf /usr/sbin/sshd(结果是 openssh-server)- 用
yum localinstall -y 包路径装,让 yum 把缺的依赖补上。
第38章 源码编译安装 🔧
学完这一章,你能:照着步骤把 nginx 从源码装进系统,知道每一步在干什么。
38.1 它是什么
源码就是程序员写的原始代码,不能直接运行,要先用编译器"翻译"成程序。
比喻:源码是面粉和菜谱。rpm/yum 是超市买的半成品菜,热一下就能吃;自己做饭麻烦,但想少放盐、多放辣椒都行——要最新版、要改代码时就该用它。
38.2 三步口诀
| 步骤 | 命令 | 生活里像什么 |
|---|---|---|
| 配置 | ./configure |
量厨房尺寸,定做橱柜 |
| 编译 | make |
照着尺寸把柜子做出来 |
| 安装 | make install |
把柜子搬进厨房装好 |
38.3 跟着做:装 nginx
需要联网。版本号以官网为准,这里用 1.24.0 举例。
第 1 步:装编译工具(第一次装一定要先装,不然 configure 会报错)
yum install -y gcc make pcre-devel zlib-devel openssl-devel wget
# 你会看到最后:
Complete!
第 2~3 步:下载源码包,解压后进去
cd /usr/local/src
wget https://nginx.org/download/nginx-1.24.0.tar.gz
# 你会看到:
... 'nginx-1.24.0.tar.gz' saved
tar -xzvf nginx-1.24.0.tar.gz
cd nginx-1.24.0
第 4 步:配置(--prefix 指定装到哪个文件夹)
./configure --prefix=/usr/local/nginx
# 你会看到最后一段:
Configuration summary
+ using system PCRE library
...
第 5 步:编译(要等一两分钟,屏幕一直刷是正常的)
make
# 你会看到最后:
make[1]: Leaving directory `/usr/local/src/nginx-1.24.0'
第 6 步:安装,然后验证
make install
# 一般没有大段输出,回到命令行提示符就是成功了
/usr/local/nginx/sbin/nginx -v
# 你会看到:
nginx version: nginx/1.24.0
38.4 常见坑 ⚠️
configure报C compiler cc is not found→ 没装gcc- 报
the HTTP rewrite module requires the PCRE library→ 没装pcre-devel make卡着不动不是死机,是在编译,等它- 源码装的软件没有
yum remove,卸载要自己删目录,装之前先想清楚装哪;编译失败想重来,把整个源码文件夹删掉重新解压最干净
本章小结
| 步骤/命令 | 作用 |
|---|---|
yum install gcc make ... |
准备编译工具 |
./configure --prefix=路径 |
检查环境、定安装位置 |
make |
编译成程序 |
make install |
复制到安装目录 |
nginx -v |
验证版本 |
动手练
- 把步骤排好序:
make、./configure、make install、解压源码。 ./configure报 PCRE 相关的错误,应该装哪个包?- 为什么源码装的软件不能
yum remove卸掉?
参考答案:
- 解压源码 →
./configure→make→make install pcre-devel- 它不在 yum 的已安装清单里,yum 根本不知道它的存在。要卸载只能去
--prefix指定的目录手动删。
第39章 压缩和解压 🔰
学完这一章,你能:看到后缀就知道该怎么解开,也会自己打包压缩。
39.1 为什么要压缩
比喻:给棉被抽真空。一床被子能压成薄薄一片,好搬好放。文件也一样:压小了,占地方少,传得快。
压缩会改变文件,所以和压缩包打交道,永远记住一句话:压之前想清楚,解之前看仔细。
39.2 看到后缀就知道怎么解
| 后缀 | 是什么 | 解开用什么 |
|---|---|---|
.zip |
Windows/Linux 都认,最通用 | unzip 包名.zip |
.gz |
单个文件压缩 | gzip -d 文件.gz |
.tar |
只打包,没压缩 | tar -xvf 包名.tar |
.tar.gz |
打包 + gzip 压缩 | tar -xzvf 包名.tar.gz |
.tar.bz2 |
打包 + bzip2 压缩 | tar -xjvf 包名.tar.bz2 |
.tar.xz |
打包 + xz 压缩(压得最小) | tar -xJvf 包名.tar.xz |
39.3 zip 和 unzip(和 Windows 通用)
# 压缩一个文件夹,-r 表示连同里面的东西一起压
zip -r 备份.zip 要压缩的文件夹
# 你会看到:
adding: 要压缩的文件夹/a.txt (deflated 40%)
# 解压到当前目录
unzip 备份.zip
# 你会看到:
creating: 要压缩的文件夹/
inflating: 要压缩的文件夹/a.txt
⚠️ 压文件夹必须加
-r,否则只会压一个空文件夹进去,里面什么都没有。
39.4 tar 的记忆口诀
tar 的参数多,但记住这句口诀就够用:
打包 c,解开 x;gzip z,bzip2 j,xz 是大写 J;文件 f,过程 v,解压到别处用 C。
所以:-czvf 打包压缩,-xzvf 解压,看到这两个就认识 tar.gz 了。
39.5 tar 三个最常用的写法
# 1. 打包并压缩一个文件夹
tar -czvf etc.tar.gz /etc
# 你会看到(会刷很多行):
tar: Removing leading `/' from member names
etc/
etc/passwd
...
# 2. 解压到当前目录
tar -xzvf etc.tar.gz
# 3. 解压到指定文件夹
tar -xzvf etc.tar.gz -C /tmp
💡 解压前想先看看包里有什么?把
x换成t:tar -tzvf etc.tar.gz,只列清单,不动文件。
39.6 常见坑 ⚠️
gzip会把原文件删掉,只留.gz。想保留原文件就用tar -czvf(tar 不删原文件)。tar的-f必须最后写、紧跟包名。- 用
tar -xzvf解.tar.bz2会报错,算法要对应上(bz2 用j)。 - 在根目录打包会提示
Removing leading '/',这是正常提示,不是报错。
本章小结
| 命令 | 作用 | 例子 |
|---|---|---|
zip -r |
压缩文件夹 | zip -r a.zip 文件夹 |
unzip |
解 zip | unzip a.zip |
tar -czvf |
打包 + gzip 压缩 | tar -czvf a.tar.gz 文件夹 |
tar -xzvf |
解 tar.gz | tar -xzvf a.tar.gz -C /tmp |
gzip -d |
解单个 .gz | gzip -d a.txt.gz |
动手练
nginx-1.24.0.tar.gz应该用什么命令解压?- 你想把
/data文件夹打包成data.tar.gz,命令怎么写? gzip a.txt之后,a.txt还在吗?
参考答案:
tar -xzvf nginx-1.24.0.tar.gztar -czvf data.tar.gz /data- 不在了。gzip 只保留
a.txt.gz,原文件被删掉。要保留请用 tar。
第七篇 磁盘管理
这一篇是全书最硬的一块骨头:分区、格式化、挂载。 但只要抓住一个比喻——毛坯楼 → 隔房间 → 铺地板 → 装门牌,四个词一次就能讲通。
第40章 磁盘、分区、格式化、挂载:四个词一次讲清 🔰
学完这一章,你能:用一个比喻说清这四个词,并亲手把一块新硬盘存上文件。
40.1 一条比喻:你买了一栋毛坯楼
把新硬盘想成一栋刚交房的毛坯楼,四个词就是四个动作:
| 词 | 生活里 | 命令 | 做完之后 |
|---|---|---|---|
| 磁盘 | 整栋毛坯楼 | lsblk 查看 |
出现 /dev/sdb |
| 分区 | 把楼隔成几个房间 | fdisk /dev/sdb |
出现 /dev/sdb1 |
| 格式化 | 给房间铺地板(装文件系统) | mkfs.ext4 /dev/sdb1 |
房间能放东西了 |
| 挂载 | 给房间装门牌,开门让系统进去 | mount /dev/sdb1 /data |
能往 /data 存文件 |
所以四个词的关系是:一栋楼 → 隔成房间 → 铺地板 → 装门牌开门。
磁盘名:
/dev/sda是第一块硬盘,/dev/sdb是第二块;/dev/sdb1是第二块盘的第 1 个分区。
40.2 为什么新硬盘不能直接存文件
因为系统面对一整块新硬盘时,只看到"一栋楼",不知道:
- 从哪间房进去(没有分区)
- 东西放进去按什么规矩摆(没有文件系统)
- 从哪个文件夹能走到它(没有挂载点)
所以顺序不能反:分区 → 格式化 → 挂载,少一步都用不了。
40.3 三步实操(跟着敲)
⚠️ 先用
lsblk确认/dev/sdb是一块空盘。千万不要拿/dev/sda练手,那是系统盘!
第 1 步:分区(在楼里隔出一间 10G 的房间)
fdisk /dev/sdb
# 你会看到(← 后面是你要输入的内容):
Command (m for help): n ← 输入 n,新建分区
Select (default p): ← 回车,默认选主分区
Partition number (1-4, default 1): ← 回车,默认 1 号
First sector (...): ← 回车,用默认起点
Last sector (...): +10G ← 输入 +10G,给这间房 10G
Command (m for help): w ← 输入 w,保存
第 2 步:格式化(给房间铺上 ext4 地板)
mkfs.ext4 /dev/sdb1
# 你会看到:
Creating filesystem with 2621440 4k blocks and 655360 inodes
...
第 3 步:挂载(装上门牌,从 /data 这扇门进去)
mkdir -p /data
mount /dev/sdb1 /data
df -h | grep sdb1
# 你会看到:
/dev/sdb1 9.8G 37M 9.3G 1% /data
再试一下真的能存东西:
echo hello > /data/test.txt
cat /data/test.txt
# 你会看到:
hello
40.4 常见坑 ⚠️
- 只分区没格式化就挂载 → 报
you must specify the filesystem type,回去做第 2 步 - 格式化会清空这块分区上的所有数据,敲
mkfs前先lsblk确认设备名 - 只
mount不写/etc/fstab,重启后挂载就没了(第 43 章) - 挂载点如果是已有文件的文件夹,原来的文件会被"盖住",卸载后才看得见
本章小结
| 命令/概念 | 作用 | 例子 |
|---|---|---|
| 磁盘 | 一整块硬盘 | /dev/sdb |
| 分区 | 把硬盘隔成几块 | fdisk /dev/sdb |
| 格式化 | 装文件系统,让分区能存文件 | mkfs.ext4 /dev/sdb1 |
| 挂载 | 把分区接到某个文件夹 | mount /dev/sdb1 /data |
| 查看 | 看磁盘和挂载情况 | lsblk、df -h |
动手练
- 填空:磁盘像 _,分区像 ,格式化像 _,挂载像 。
- 把三个命令排成正确顺序:
mount、mkfs.ext4、fdisk。 - 一块新硬盘,敲完
fdisk分了区,能马上echo hi > /dev/sdb1存文件吗?为什么?
参考答案:
- 一栋毛坯楼;把楼隔成房间;给房间铺地板;给房间装门牌并开门。
fdisk(分区)→mkfs.ext4(格式化)→mount(挂载)。- 不能。分区只是"隔好了房间",还没有文件系统(没铺地板),也没挂载(没门牌)。要先格式化再挂载,然后往挂载点里存文件。
第41章 分区:fdisk 与 gdisk 🔧
学完这一章,你能:在一块新硬盘上切出一两个分区,也知道 MBR 和 GPT 该选哪个。
41.1 它是什么
比喻:分区就是在硬盘上"砌墙隔房间",每面墙的位置和大小记在分区表里,它就像一张户型图。MBR 是 1980 年代的老户型图:最多 4 间房,总面积不能超过 2TB;GPT 是新户型图:128 间房,面积可以非常大。
41.2 MBR 和 GPT 怎么选
| MBR | GPT | |
|---|---|---|
| 分区工具 | fdisk |
gdisk |
| 最多几个分区 | 4 个主分区 | 128 个 |
| 最大支持磁盘 | 2TB | 非常大(PB 级) |
| 适合 | 小盘、老系统 | 大盘、新系统 |
一句话:硬盘超过 2TB 就必须用 GPT,否则 2TB 以后的空间用不上。
41.3 先看清有几块盘
lsblk
# 你会看到:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part /
sdb 8:16 0 10G 0 disk
有 MOUNTPOINT 的盘正在用(sda 是系统盘,别动);sdb 什么都没挂,可以练手。
41.4 fdisk 完整流程
第 1、2 步:进去,按 m 看菜单(不用背,随时能按)
fdisk /dev/sdb
# 你会看到:
Command (m for help): m
d delete a partition
n add a new partition
p print the partition table
q quit without saving changes
w write table to disk and exit
第 3 步:按 n 新建,一路回车,最后问大小时输 +10G
第 4、5 步:按 p 看结果,按 w 保存退出
Command (m for help): p
# 你会看到:
Device Boot Start End Blocks Id System
/dev/sdb1 2048 20973567 10485760 83 Linux
Command (m for help): w
# 写入完成后就回到命令行
⚠️
w是保存,q是不保存退出。手抖按了q,前面全白干。
第 6 步:让系统重新读分区表
partprobe /dev/sdb
# 没有输出就是成功
lsblk
# 你会看到多了一个 sdb1
41.5 gdisk:大盘用这个
yum install -y gdisk
gdisk /dev/sdc # 进去以后和 fdisk 一样:n 新建、w 保存、q 不保存
41.6 常见坑 ⚠️
- 设备名写错 → 分区表被改写,数据可能全丢。动手前
lsblk看三遍 - 忘了按
w,分区只在内存里,退出就没了 - 分完
lsblk看不到,先partprobe /dev/sdb
本章小结
| 命令/概念 | 作用 | 例子 |
|---|---|---|
fdisk -l |
看所有磁盘和分区 | fdisk -l /dev/sdb |
fdisk /dev/sdb |
进入分区界面 | — |
n / d / p |
新建 / 删除 / 查看 | 在 fdisk 菜单里按 |
w / q |
保存退出 / 不保存退出 | 千万别搞混 |
gdisk |
GPT 分区工具 | gdisk /dev/sdc |
动手练
- 一块 4TB 的新硬盘,用
fdisk分区最多只能用到多少?为什么? fdisk里按了n分了区,最后按q退出,分区还在吗?- 分完区
lsblk没看到新分区,先做什么?
参考答案:
- 只能用到 2TB。
fdisk用的是 MBR 分区表,MBR 最大只支持 2TB,4TB 的盘要用gdisk。 - 不在。
q是不保存退出,等于什么都没做。 - 执行
partprobe /dev/sdb,让系统重新读分区表。
第42章 格式化:mkfs 🔧
学完这一章,你能:给分区装上 ext4 或 xfs 文件系统,也知道格式化到底做了什么。
42.1 它是什么
格式化就是给房间铺地板、划格子,让系统知道东西该放哪。铺的这层地板叫文件系统。
比喻:分区只是把墙砌好了,地面还是水泥,家具(文件)放不进去。格式化就是把地面铺平、画好格子。
两个必须知道的名词:
- block(数据块,默认 4K):地板上的一个格子,文件内容放在格子里
- inode(文件的"身份证"):记录文件的属主、大小、时间、放在哪些格子
42.2 常见文件系统
| 名字 | 用在哪 | 特点 |
|---|---|---|
| ext4 | CentOS 6 及以前的默认 | 最通用、稳定,能缩容(麻烦) |
| xfs | CentOS 7 开始的默认 | 大文件快,不能缩容,只能扩 |
| swap | 交换分区专用 | 不放文件,是给内存当备用(第 44 章) |
Windows 常用 NTFS、FAT32,和 Linux 的 ext4、xfs 不通用。
42.3 最小可用:格式化为 ext4
mkfs.ext4 /dev/sdb1
# 你会看到:
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
...
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
42.4 格式化为 xfs
mkfs.xfs /dev/sdb2
# 你会看到:
meta-data=/dev/sdb2 isize=512 agcount=4, agsize=655360 blks
data = bsize=4096 blocks=2621440, imaxpct=25
...
💡 两个小选项:
mkfs.ext4 -L 卷标 设备给分区起个名字;mkfs -t ext4 设备是通用写法。
42.5 常见坑 ⚠️
- ⚠️ 格式化 = 清空。这块分区上的数据全没了,找不回来。敲之前先
lsblk确认设备名。 - 格式化了整块盘(
/dev/sdb而不是/dev/sdb1)→ 相当于把文件直接堆在没隔间的毛坯房里,以后再想分房间,数据就没了 - xfs 不能缩小,选类型前想清楚
- 分区和格式化不是一回事:分区只隔墙,格式化才铺地板
本章小结
| 命令/概念 | 作用 | 例子 |
|---|---|---|
mkfs.ext4 |
格式化为 ext4 | mkfs.ext4 /dev/sdb1 |
mkfs.xfs |
格式化为 xfs | mkfs.xfs /dev/sdb2 |
| block | 磁盘最小存储单位,默认 4K | 文件内容放这里 |
| inode | 文件的"身份证" | 记录属主、大小、时间 |
| 文件系统 | 管理和查找文件的一套规则 | ext4、xfs |
动手练
- 分区做完了,
mount报you must specify the filesystem type,少了哪一步? - 一块硬盘主要存 30G 以上的大文件,ext4 和 xfs 选哪个更合适?
- 判断:格式化只是换个"格式",数据还在。(对/错)
参考答案:
- 少了格式化,先
mkfs.ext4 /dev/sdb1(或mkfs.xfs)。 - xfs。它处理大文件更快,也是 CentOS 7 的默认文件系统。
- 错。格式化会重建文件系统,原有数据基本找不回来。
第43章 挂载:mount、umount 与 /etc/fstab 🔧
学完这一章,你能:把分区挂到文件夹上用起来,也能写成开机自动挂载。
43.1 它是什么
挂载就是给房间装门、挂门牌,让系统能走进这个分区放东西。
比喻:分区和格式化都做完了,房间也铺好地板了,但系统还不知道"从哪扇门进去"。mount 就是装门并挂门牌,门牌上的地址叫挂载点。
挂载点必须是一个文件夹,而且最好是个空文件夹。
43.2 临时挂载:三步走
# 第 1 步:建挂载点(给房间装门框)
mkdir -p /data/A
# 第 2 步:挂载(把门装上,指定从 /data/A 进去)
mount /dev/sdb1 /data/A
# 第 3 步:验证(看看门后是不是这块分区)
df -h
# 你会看到:
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 19G 3.1G 16G 17% /
/dev/sdb1 9.8G 37M 9.3G 1% /data/A
这样挂是临时的,重启就没了。不要了就卸载,两种写法都对(按设备、按挂载点):
umount /dev/sdb1
umount /data/A
💡 卸载时报
target is busy,是因为你正站在这个文件夹里,或者有程序在用。先cd /离开再卸。
43.3 永久挂载:/etc/fstab
比喻:/etc/fstab 是物业的门牌登记表。开机时系统照这张表,把每个房间的门都开好。
先查 UUID(每个文件系统的"身份证号",比 /dev/sdb1 稳定):
lsblk -f
# 你会看到:
NAME FSTYPE UUID MOUNTPOINT
sdb1 ext4 170b7ad5-d3f9-4183-9bec-644d792a0883
每一行六列,用空格隔开:
| 列 | 写什么 | 例子 |
|---|---|---|
| 1 | 设备(推荐 UUID) | UUID=170b7ad5-... |
| 2 | 挂载点 | /data/A |
| 3 | 文件系统类型 | ext4 |
| 4 | 挂载选项 | defaults |
| 5 | 是否备份 | 0 |
| 6 | 开机是否检查 | 0 |
UUID=170b7ad5-d3f9-4183-9bec-644d792a0883 /data/A ext4 defaults 0 0
⚠️ 警告:
/etc/fstab写错,系统可能开不了机(开机卡在紧急模式,进不去系统)。必须按这三步做:
- 改之前先备份:
cp /etc/fstab /etc/fstab.bak- 改完立刻验证:
mount -a(把 fstab 里所有条目试挂一遍,没报错才算对)- 真出错了,用备份盖回去:
cp /etc/fstab.bak /etc/fstab
43.4 常见坑 ⚠️
- 挂载点选了一个已经有文件的文件夹 → 原来的文件被"盖住",看不见但没丢,卸载后又出现
- fstab 里写
/dev/sdb1不牢靠:加硬盘后设备名可能变,推荐用UUID= - 改完 fstab 不跑
mount -a就重启,等于拿系统赌博 - 只挂载不写 fstab,重启后白干
本章小结
| 命令/概念 | 作用 | 例子 |
|---|---|---|
mount |
挂载(临时) | mount /dev/sdb1 /data/A |
umount |
卸载 | umount /data/A |
/etc/fstab |
开机自动挂载的配置 | 六列,用 UUID 更稳 |
mount -a |
按 fstab 全部挂一遍(验证) | 改完 fstab 必做 |
lsblk -f |
查 UUID 和文件系统 | 写 fstab 前先查 |
动手练
mount /dev/sdb1只写了设备没写挂载点,能挂成功吗?- 卸载时提示
target is busy,怎么解决? - 改完
/etc/fstab,为什么一定要跑一遍mount -a?
参考答案:
- 不能。必须指定挂载点,写成
mount /dev/sdb1 /data/A。 - 先
cd /离开那个文件夹,确认没有程序在用它,再umount。 mount -a会把 fstab 里每一条都试着挂一遍,有错马上报出来。不验证就重启,写错会导致开不了机。
第44章 swap 交换分区 🔧
学完这一章,你能:给系统加一块 swap 交换分区,也知道它到底有什么用。
44.1 它是什么
比喻:swap 是内存的备用抽屉。内存像书桌,桌面放不下了,就把暂时不用的东西先塞进抽屉(硬盘上),腾出桌面。
注意:抽屉比桌面慢得多。swap 只是救急,让系统不崩,不能拿它当内存用。
44.2 先看现在有没有 swap
free -h
# 你会看到:
total used free shared buff/cache available
Mem: 1.8G 456M 120M 9.6M 1.2G 1.1G
Swap: 2.0G 0B 2.0G
最后一行就是 swap。swapon -s 也能看,输出更短。
44.3 跟着做:加一块 2G 的 swap 分区
第 1 步:分出一个 2G 分区,把类型改成 82(swap)
fdisk /dev/sdb
# n 新建一个 +2G 的分区 → 得到 /dev/sdb3
# t 改分区类型 → 输入 82(Linux swap)
# w 保存退出
第 2 步:格式化成 swap
mkswap /dev/sdb3
# 你会看到:
Setting up swapspace version 1, size = 2097148 KiB
no label, UUID=6b7e0c4a-...
第 3 步:打开它
swapon /dev/sdb3
free -h
# 你会看到 Swap 那一行的 total 变大了:
total used free
Swap: 4.0G 0B 4.0G
第 4 步:关掉它
swapoff /dev/sdb3
44.4 让它开机自动生效
和挂载一样,写进 /etc/fstab:
UUID=6b7e0c4a-... swap swap defaults 0 0
检查有没有写对:swapon -a(它会试着启用 fstab 里所有 swap 条目,没报错就是对的)。
44.5 常见坑 ⚠️
- swap 不是越大越好:一般内存的 1~2 倍;服务器 8G 内存配 4~8G 很常见
- ⚠️
mkswap会清掉这块分区上的数据 - 只
mkswap没swapon,等于没启用(free -h里看不到变化) - 自动挂载写错 fstab 同样会开不了机,改之前先备份
本章小结
| 命令/概念 | 作用 | 例子 |
|---|---|---|
| swap | 内存的备用空间(在硬盘上) | 内存不够时救急 |
mkswap |
把分区格式化成 swap | mkswap /dev/sdb3 |
swapon / swapoff |
启用 / 关闭 | swapon /dev/sdb3 |
free -h |
看内存和 swap 用了多少 | free -h |
swapon -s |
看当前启用的 swap | swapon -s |
动手练
- 内存只有 2G 的服务器,加 swap 有什么用?
mkswap之后free -h里 Swap 还是 0B,少了哪一步?- 判断:swap 越快越好,能代替内存。(对/错)
参考答案:
- 内存不够时把暂时不用的数据挪到硬盘上,防止系统因为没内存而崩溃。
- 少了
swapon /dev/sdb3,只是格式化了还没启用。 - 错。swap 在硬盘上,比内存慢很多,只能救急,不能当内存用。
第45章 LVM:能变大变小的硬盘 🔧
学完这一章,你能:看懂 LVM 里的 PV、VG、LV 是什么,也能看懂别人给硬盘扩容时敲的命令。
45.1 为什么需要它
普通分区切了 10G 就是 10G,用满了只能重装或者加新盘。
LVM 让硬盘"像橡皮泥":先攒一堆空间,用多少切多少,不够了随时加。
45.2 比喻:积木 → 积木箱 → 抽屉
- PV(物理卷):一块积木。用命令把整块硬盘变成一块积木
- VG(卷组):积木箱。把所有积木倒进一个大箱子,箱子里的空间随便抓
- LV(逻辑卷):抽屉。从箱子里抓一堆积木拼成的抽屉;抽屉不够用,就从箱子里再抓几块加上去
45.3 三个词一张表
| 简称 | 全名 | 生活里 | 常用命令 |
|---|---|---|---|
| PV | 物理卷 | 一块积木 | pvcreate、pvs、pvdisplay |
| VG | 卷组 | 积木箱 | vgcreate、vgs、vgdisplay |
| LV | 逻辑卷 | 抽屉 | lvcreate、lvs、lvdisplay |
45.4 从零做一遍(看得懂就行)
流程:硬盘 → pvcreate → vgcreate → lvcreate → mkfs → mount
pvcreate /dev/sdb /dev/sdc
# 你会看到:
Physical volume "/dev/sdb" successfully created.
Physical volume "/dev/sdc" successfully created.
vgcreate vg1 /dev/sdb /dev/sdc
# 你会看到:
Volume group "vg1" successfully created
lvcreate -n lv1 -L 10G vg1
# 你会看到:
Logical volume "lv1" created.
mkfs.ext4 /dev/vg1/lv1 # 和普通分区一样格式化
mkdir -p /data
mount /dev/vg1/lv1 /data
df -h | grep lv1
# 你会看到:
/dev/mapper/vg1-lv1 10G 33M 10G 1% /data
发现没有:LV 上格式化、挂载的写法,和第 42、43 章完全一样。
45.5 最常用的一步:扩容
lvextend -L +10G /dev/vg1/lv1
# 你会看到:
Size of logical volume vg1/lv1 changed from 10.00 GiB to 20.00 GiB.
resize2fs /dev/vg1/lv1 # ext4 用这条,让文件系统认新地盘
# 你会看到:
The filesystem on /dev/vg1/lv1 is now 5242880 (4k) blocks long.
💡 xfs 文件系统用
xfs_growfs /data(接挂载点)。VG 里没空间了,就加盘:pvcreate /dev/sdd再vgextend vg1 /dev/sdd。
45.6 常见坑 ⚠️
- 扩容易,缩容难:xfs 不能缩;ext4 缩容要卸载、要按顺序,新手别碰
lvextend之后必须resize2fs,不然df -h看到的还是老大小(最常见问题)- ⚠️ 对根分区
/乱缩容,可能直接把系统弄坏 - 扩容完用
df -h确认,别只看lvextend成功的提示
本章小结
| 命令/概念 | 作用 | 例子 |
|---|---|---|
| PV | 物理卷(积木) | pvcreate /dev/sdb |
| VG | 卷组(积木箱) | vgcreate vg1 /dev/sdb |
| LV | 逻辑卷(抽屉) | lvcreate -n lv1 -L 10G vg1 |
lvextend |
扩大 LV | lvextend -L +10G /dev/vg1/lv1 |
resize2fs |
让 ext4 认新容量 | resize2fs /dev/vg1/lv1 |
动手练
- 填空:PV 像 _,VG 像 _,LV 像 ____。
lvextend -L +10G之后df -h还是原来大小,少做了什么?- 一块 20T 的硬盘要做 LVM,用
fdisk分区有什么问题?
参考答案:
- 一块积木;积木箱;从箱子里拼出来的抽屉。
- 少了
resize2fs /dev/vg1/lv1(xfs 用xfs_growfs 挂载点)。 fdisk用 MBR,最大只支持 2TB,要用gdisk走 GPT。
第46章 RAID:多块硬盘合作 🔧
学完这一章,你能:看懂 RAID 0/1/5/6/10 各是什么,也知道别人为什么这么选。
46.1 它是什么
RAID 就是把几块硬盘"捆在一起"干活,目的只有两个:更快、更安全(有时两个都要)。
比喻:几个人分工合作。
- RAID 0:两个人一起搬箱子,一人搬一半。快,但箱子摔了谁都拼不全 → 没有备份
- RAID 1:两个人各抄一份一样的内容。安全,但一份内容花两份钱 → 只有一半容量能用
- RAID 5:大家轮流记"别人的账"(校验码)。倒下一个,剩下的能把它那份算回来
- RAID 6:两个记账员。倒下两个也能算回来
- RAID 10:先两两一组互相抄(RAID 1),再两组一起搬(RAID 0)。又快又安全,就是贵
46.2 对比表(建议背下来)
| 级别 | 最少几块盘 | 读写速度 | 坏几块还能用 | 可用容量 | 适合 |
|---|---|---|---|---|---|
| RAID 0 | 2 | 最快 | 0 块(全丢) | 100% | 临时数据、缓存、视频剪辑 |
| RAID 1 | 2 | 读快写一般 | 1 块 | 50% | 系统盘、重要资料 |
| RAID 5 | 3 | 读快写中等 | 1 块 | (n-1)/n | 文件服务器、中小数据库 |
| RAID 6 | 4 | 读快写较慢 | 2 块 | (n-2)/n | 大容量存储、关键数据 |
| RAID 10 | 4 | 很快 | 每组 1 块 | 50% | 数据库、交易系统 |
n 是硬盘块数。比如 4 块盘做 RAID 5,能用的是 (4-1)/4,也就是 3/4 的容量。
46.3 常见坑 ⚠️
- RAID ≠ 备份! RAID 防的是"硬盘坏了",防不了"手一抖
rm -rf",备份要另外做。 - RAID 0 一块盘坏,全部数据没了,上面别放要紧的东西
- RAID 5 重建时如果另一块盘再坏,数据就没了,所以重要数据用 RAID 6 或 10
- 软 RAID(
mdadm)要占用 CPU,生产环境常用硬件 RAID 卡
46.4 软 RAID 长什么样(看得懂就行)
yum install -y mdadm
mdadm -Cv /dev/md0 -l 5 -n 3 /dev/sdb /dev/sdc /dev/sdd
# 你会看到:
mdadm: array /dev/md0 started.
cat /proc/mdstat
# 你会看到:
md0 : active raid5 sdd[2] sdc[1] sdb[0]
41908224 blocks super 1.2 level 5, 512k chunk
意思是:用 3 块盘(-n 3)做了一个 5 级 RAID(-l 5),设备叫 /dev/md0。做好之后照样 mkfs.ext4 /dev/md0、mount。
本章小结
| 命令/概念 | 作用 | 例子 |
|---|---|---|
| RAID 0 | 拼速度,没有备份 | 2 块盘,容量 100% |
| RAID 1 | 做镜像,最安全 | 2 块盘,容量 50% |
| RAID 5 | 速度、容量、安全折中 | 最少 3 块盘 |
| RAID 10 | 又快又安全,最贵 | 最少 4 块盘 |
mdadm |
做软 RAID 的命令 | mdadm -Cv /dev/md0 ... |
动手练
- 4 块 1TB 的盘做 RAID 5,实际能用多少容量?
- 公司账本这种绝对不能丢的数据,不考虑成本,选哪个 RAID?
- 判断:做了 RAID 1 就不用做备份了。(对/错)
参考答案:
(4-1)/4 × 4TB = 3TB。- RAID 10(或 RAID 6)。RAID 10 又快又安全,就是贵。
- 错。RAID 只能防硬盘坏,防不了误删、病毒、整机故障,备份必须另外做。
第八篇 日常运维命令
这一篇是“值班手册”:机器快不快、盘满不满、网通不通、文件在哪。 命令按“我要排查什么”来组织,而不是按字母表,方便你遇到问题时直接翻。
第47章 查看系统状态 🔰
学完这一章,你能:用几条命令说清这台机器是什么系统、几个核、多少内存、磁盘还剩多少。
47.1 先看仪表盘
接手一台 Linux 像接手一辆没开过的车,先看仪表盘:油量(内存)、水温(CPU)、车型(系统版本)。这一章的命令都"只看不改",敲错也安全。
47.2 它是什么系统
uname -a
# 你会看到类似这样:
Linux localhost.localdomain 3.10.0-1160.el7.x86_64 #1 SMP ... x86_64 GNU/Linux
3.10.0-1160.el7 是内核版本,x86_64 是 64 位架构。
cat /etc/os-release
# 你会看到类似这样:
NAME="CentOS Linux"
PRETTY_NAME="CentOS Linux 7 (Core)"
💡 小贴士:找人帮忙时,把
PRETTY_NAME那一行发过去,别人立刻知道你在什么系统上。
47.3 几个核、多少内存
lscpu
# 你会看到类似这样(前两行就够):
Architecture: x86_64
CPU(s): 2
free -h
# 你会看到类似这样:
total used free available
Mem: 1.8G 211M 1.3G 1.4G
available 才是"新程序真正还能用多少"。free 很小不用慌,Linux 会拿空闲内存去做缓存。
47.4 磁盘还剩多少
df -h
# 你会看到类似这样:
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda2 55G 2.2G 53G 4% /
/dev/sda1 1014M 145M 870M 15% /boot
-h 是把字节换成人看得懂的 G、M。重点看"已用%"和 / 那一行。
⚠️ 常见坑:
df -h只列已经挂载的文件系统。新加的硬盘没格式化、没挂载,它不会出现,别以为硬盘坏了。tmpfs那几行是内存里的临时文件系统,不是真硬盘。
47.5 这台机器叫什么名字
hostname
# 你会看到类似这样:
localhost.localdomain
hostnamectl set-hostname web01 # 永久改主机名,需要 root
# 重新登录,或敲一次 bash 让提示符刷新:
bash
# 提示符变成:
[root@web01 ~]#
⚠️ 常见坑:
hostname 新名字只是临时改,重启就没了;永久生效必须用hostnamectl set-hostname。
本章小结
| 命令 | 作用 | 例子 |
|---|---|---|
uname -a |
看内核版本和架构 | uname -a |
cat /etc/os-release |
看发行版名称 | cat /etc/os-release |
lscpu |
看 CPU 核数和型号 | lscpu |
free -h |
看内存使用情况 | free -h |
df -h |
看各分区用了多少 | df -h |
hostnamectl |
永久改主机名 | hostnamectl set-hostname web01 |
动手练
- 查出这台机器的内核版本和发行版名称。
- 内存总共多少?真正还能用多少?
- 把主机名临时改成
test01,再改回原名。
参考答案:
uname -a看内核,cat /etc/os-release看发行版。free -h,看available那一列。hostname test01;改回hostname 原主机名(永久改才用hostnamectl)。
第48章 进程管理 🔰
学完这一章,你能:看懂现在有哪些程序在跑,找出吃 CPU、吃内存的那个,并安全地关掉它。
48.1 进程就是"正在运行的程序"
菜谱放在桌上不动,那叫程序;厨师照着菜谱开始做菜,这个"正在做的过程"就是进程。同一份菜谱能让三个厨师同时开做,所以一个程序也能同时有多个进程。
48.2 ps -aux:给进程拍张合影
ps -aux
# 你会看到类似这样(只截了几行):
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 128164 6976 ? Ss 09:01 0:02 /usr/lib/systemd/systemd
root 1023 0.0 0.1 112796 5760 ? Ss 09:01 0:00 sshd: /usr/sbin/sshd
列很多,先认这 4 列:
| 列 | 含义 |
|---|---|
USER |
谁启动的(root 还是普通用户) |
PID |
进程编号,关进程靠它,每次启动都可能变 |
%CPU / %MEM |
占了多少 CPU、多少内存(百分比) |
COMMAND |
是哪个命令启动的 |
💡 小贴士:
STAT里R是正在跑,S是在等,Z是僵尸进程(子进程结束了,父进程没收拾)。
48.3 top:实时监控大屏
ps 是照片,top 是直播,默认每 3 秒刷新一次。
top
# 你会看到类似这样(开头几行):
top - 09:30:01 up 20 min, 1 user, load average: 0.00, 0.01, 0.05
MiB Mem : 1837.0 total, 1345.2 free, 211.4 used
PID USER PR NI VIRT RES %CPU %MEM TIME+ COMMAND
1023 root 20 0 112796 5760 0.0 0.1 0:00.10 sshd
load average 三个数是最近 1、5、15 分钟的平均负载,接近 CPU 核数就说明忙了。
记住这 5 个按键就够:
| 按键 | 作用 |
|---|---|
q |
退出 top |
P |
按 CPU 占用从高到低排序 |
M |
按内存占用从高到低排序 |
1 |
显示每个 CPU 核的占用(再按收起) |
k |
输入 PID 杀进程(会先问你确认) |
48.4 kill:让进程停下来
# 先用 ps 找到 PID,再发"请你退出"(默认 15 号信号,比较温和)
kill 2231
# 没有输出就是成功
kill -9 2231
# 如果进程已经没了,你会看到:
-bash: kill: (2231) - No such process
⚠️ 常见坑(很重要):
kill -9等于直接拔电源,进程来不及保存数据、来不及清理临时文件,数据库和正在写的文档可能丢数据甚至损坏。先kill PID,等几秒,不行再kill -9。而且 PID 会被系统重复使用,杀之前先用ps确认这个 PID 现在是谁。
本章小结
| 命令/按键 | 作用 | 例子 |
|---|---|---|
ps -aux |
看当前所有进程 | ps -aux |
top |
实时看 CPU/内存排行 | top |
q P M 1 k |
top 里的 5 个常用键 | 在 top 界面里按 |
kill PID |
温和地结束进程 | kill 2231 |
kill -9 PID |
强制杀掉(有风险) | kill -9 2231 |
动手练
- 用
ps -aux看有没有sshd进程,PID 是多少? - 打开
top,按M看谁最吃内存,再按q退出。 - 用
sleep 1000 &造一个后台进程,找到它并杀掉。
参考答案:
ps -aux | grep sshd(grep第52章细讲,这里先照抄)。- 按
M看%MEM最高那行,q退出。 sleep 1000 &,ps -aux | grep sleep找到 PID,再kill PID。
第49章 网络排查 🔰
学完这一章,你能:按"网卡→连通→端口→服务"的顺序,一步步查出网站为什么打不开。
49.1 排查顺序:像查水管一样原地不动
网络不通别乱试。按固定顺序走,每一步都能砍掉一半可能性:
① ip a 网卡有没有 IP? 没 IP:网卡没启用 / DHCP 没拿到
② ping 网关、外网通不通? 不通:网线 / 网关 / 虚拟机网络模式
③ ss -lnutp 服务端口开没开? 没开:服务没启动,或只听 127.0.0.1
④ systemctl status / journalctl 服务本身报错了,看日志
49.2 第一步:ip a 看网卡有没有 IP
ip a
# 你会看到类似这样(只看关键几行):
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> ...
inet 192.168.8.28/24 brd 192.168.8.255 scope global ens33
看两件事:网卡名(这里是 ens33)和 inet 后面的 IP。没有 inet 那行就是没拿到 IP,先解决它,别急着 ping。127.0.0.1 是 lo(本机回环),它永远在,不代表网卡正常。
49.3 第二步:ping 由近到远
# 1. ping 网关:局域网内部通不通
ping -c 4 192.168.8.2
# 你会看到:
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
# 2. ping 外网 IP:出得去吗(223.5.5.5 是阿里公共 DNS)
ping -c 4 223.5.5.5
# 3. ping 域名:DNS 正常吗
ping -c 4 www.baidu.com
判断口诀:网关都不通,是网线、IP、虚拟机网络模式的问题;网关通但外网 IP 不通,是网关或路由的问题;外网 IP 通但域名不通,是 DNS 问题。-c 4 是只发 4 个包就停,不加会一直 ping,用 Ctrl+C 停。
49.4 第三步:ss -lnutp 看端口开没开
服务要通过端口(port,相当于门牌号)对外提供服务。端口没开,外面怎么访问都白搭。
ss -lnutp
# 你会看到类似这样:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1023,fd=3))
tcp LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("httpd",pid=2231,fd=4))
参数拆开记:-l 只看正在监听(listening)的,-n 端口用数字不翻译,-u UDP,-t TCP,-p 显示进程。重点看冒号后面的端口:0.0.0.0:80 是所有网卡都接受,127.0.0.1:3306 只有本机能连。
⚠️ 常见坑:不是 root 时看不到
Process那一列,前面加sudo再试。netstat是老命令,新系统可能没装,先试ss。
49.5 第四步:服务活没活
systemctl status httpd
# 你会看到类似这样(关键看 Active 那行):
Active: active (running) since 2026-10-30 09:20:00 CST; 10min ago
# 起失败了就看日志,最后几行通常就是报错原因:
journalctl -u httpd -n 20
active (running) 是活着,inactive (dead) 是没启动,failed 是起失败了。
49.6 另外三个顺手的工具
# curl:模拟浏览器访问,判断"服务到底活没活"最直接
curl -I http://192.168.8.28
# 你会看到:
HTTP/1.1 200 OK
# traceroute:看数据包经过哪些路由器
traceroute www.baidu.com
# 你会看到类似这样:
1 192.168.8.2 1.2 ms
2 221.12.1.77 12.5 ms
# dig:查域名解析,看 ANSWER SECTION 里解析出的地址
dig www.baidu.com
traceroute 和 dig 可能要另外装:yum install -y traceroute bind-utils。整行 * * * 不一定是断了,有的路由器不搭理这种探测包。
⚠️ 常见坑:本机
curl通、别人访问不通,大概率是防火墙没放行(第58章);ping不通也不等于服务挂了,有的机器禁 ping,用curl再看一眼。
本章小结
| 步骤 | 命令 | 看什么 |
|---|---|---|
| ① 网卡 | ip a |
有没有 inet 那行 IP |
| ② 连通 | ping -c 4 网关/IP/域名 |
丢包率 0% 就是通 |
| ③ 端口 | ss -lnutp |
端口有没有在 LISTEN |
| ④ 服务 | systemctl status / journalctl -u |
active (running) 或报错 |
| 补充 | curl / traceroute / dig |
服务应答 / 路由 / DNS |
动手练
- 用
ip -br a看这台机器有几块网卡、IP 是多少。 - 先 ping 网关,再 ping
www.baidu.com,看通不通。 - 用
ss -lnutp看 22 端口是谁在监听。 - 用
curl -I http://127.0.0.1看本机 80 端口的服务答不答话。
参考答案:
ip -br a,UP 且有192.168.x.x/24的是你的网卡。ping -c 4 网关IP、ping -c 4 www.baidu.com,0% packet loss 就是通。sudo ss -lntp | grep :22,会看到users:(("sshd",...))。- 返回
HTTP/1.1 200 OK说明 80 有服务在跑。
第50章 find:按条件找文件 🔰
学完这一章,你能:忘了文件放哪也能找出来,还能对找到的一批文件批量操作。
50.1 find 是什么
整栋楼有一千个房间,你要找"名字带 log 的房间"。你不会一个个开门,而是叫来管理员,说清条件,他挨个房间看一遍,把符合的全列出来。find 就是这个管理员。
格式:find 查找路径 选项 条件。路径写 ./ 是当前位置,写 / 是整台机器(很慢,新手别一上来就找 /)。
50.2 按名字找:-name 和 -iname
find ./ -name "*.conf"
# 你会看到类似这样:
./sshd_config.conf
# 不区分大小写(-iname 的 i 就是 ignore case)
find /etc -iname "*.CONF"
# 你会看到 /etc 下一堆大写的 .CONF 文件也被找出来
⚠️ 常见坑:
-name后面的通配符一定要加引号。不加引号,shell 会先把它在当前目录展开,find 收到的就不是你想要的条件了。
50.3 按类型和大小找
# 只找目录(d = directory)
find /etc -type d -name "*.d"
# 你会看到类似这样:
/etc/yum.repos.d
# 找大于 10M 的文件:+ 是大于,- 是小于,不带符号是"正好等于"
find /var -type f -size +10M
# 你会看到类似这样:
/var/log/messages-20261030
类型记 3 个就够:f 普通文件、d 目录、l 软链接。大小单位记 k、M、G。
50.4 按时间找:-mtime
-mtime 的单位是天,看的是文件最后一次被修改的时间。
# 找 7 天以前修改过的文件(+7 = 超过 7 天)
find /var/log -type f -name "*.log" -mtime +7
# 你会看到类似这样:
/var/log/messages-20261001
+7 是 7 天以外,-7 是 7 天以内,正好 7 天不带符号。这里最容易把正负号记反。
50.5 找到之后顺手处理:-exec
语法看着怪,拆开就不难:
find 路径 条件 -exec 命令 {} \;
| 部分 | 含义 |
|---|---|
-exec |
对每一个找到的文件,执行后面的命令 |
{} |
占位符,代表"当前找到的这个文件" |
\; |
结束标记,告诉 find"命令到此结束" |
为什么写成 \;?因为分号 ; 在 shell 里有特殊含义(表示一条命令结束),前面加反斜杠是告诉 shell:"这个分号是给 find 的,你别管"。
mkdir -p /root/logs
find /var -name "*.log" -type f -exec cp {} /root/logs \;
# 没有输出就是成功,去 /root/logs 里能看到复制过来的日志
⚠️ 常见坑:
-exec rm {} \;也是合法写法,但它真的会删掉找到的每一个文件,没有回收站。先用find只看清单,确认没错,再换成cp或rm。
本章小结
| 选项 | 作用 | 例子 |
|---|---|---|
-name |
按名字(区分大小写) | find /etc -name "*.conf" |
-iname |
按名字(不区分大小写) | find /etc -iname "*.CONF" |
-type |
按类型 f/d/l | find /etc -type d |
-size |
按大小,+大于 -小于 | find /var -size +10M |
-mtime |
按修改天数 | find /var/log -mtime +7 |
-exec ... {} \; |
对结果逐个处理 | find /var -exec cp {} /root/logs \; |
动手练
- 找出
/etc下所有以.conf结尾的普通文件。 - 找出
/var/log下 7 天以前的.log文件。 - 把
/etc下所有.conf文件备份到/root/confbak。
参考答案:
find /etc -type f -name "*.conf"。find /var/log -type f -name "*.log" -mtime +7。mkdir -p /root/confbak,再find /etc -type f -name "*.conf" -exec cp {} /root/confbak \;(先不加-exec看一遍清单更稳)。
第51章 history 和 alias 🔰
学完这一章,你能:把敲过的长命令翻出来重跑,还能给常用命令起个短外号。
51.1 history:翻出敲过的命令
它就像浏览器的"历史记录"。早上敲的那条命令忘了怎么写,翻一下就有,不用重新想。
history
# 你会看到类似这样(左边是行号):
101 ip a
102 df -h
103 find /etc -name "*.conf"
只想看最近 10 条,敲 history 10。
51.2 三种快速调命令的招
| 写法 | 作用 | 说明 |
|---|---|---|
!! |
再执行上一条命令 | 最常见:sudo !! 就是用管理员身份重跑上一条 |
!103 |
执行第 103 号命令 | 行号从 history 里看 |
!find |
执行最近一条以 find 开头的命令 | 只记得开头也行 |
还有一个最好用的键盘操作:Ctrl + R。按下去出现 (reverse-i-search),输入几个字母,它就从历史里往前搜,回车直接执行。
51.3 alias:给命令起外号
alias(别名)就是"外号":给常用联系人设个快捷拨号,以后按一下就能打通。
alias ll='ls -l'
ll
# 你会看到长格式的文件列表
alias
# 查看现在有哪些别名,你会看到类似这样:
alias ll='ls -l'
unalias ll
# 取消一个别名;unalias -a 是取消全部
⚠️ 常见坑(超高频):
alias ll = 'ls -l'这样写会报错,等号两边绝对不能有空格。另外别名只在当前终端有效,关掉窗口就没了,也不会传给别的用户。
51.4 让别名永久生效
把它写进自己的配置文件 ~/.bashrc:
vi ~/.bashrc
# 在文件最后加一行:
alias ll='ls -l'
# 存盘退出后,让它立刻生效:
source ~/.bashrc
# 没有输出就是成功,之后敲 ll 就有了
💡 小贴士:
~是家目录,~/.bashrc是每次开终端都会自动读的配置文件,写在这里才能永久生效。
本章小结
| 命令/按键 | 作用 | 例子 |
|---|---|---|
history |
看历史命令 | history 10 |
!! |
重跑上一条 | sudo !! |
!行号 |
跑指定的历史命令 | !103 |
Ctrl+R |
搜索历史命令 | 按键 |
alias |
起别名 / 查看别名 | alias ll='ls -l' |
unalias |
取消别名 | unalias ll |
source |
让配置文件立即生效 | source ~/.bashrc |
动手练
- 看最近 5 条历史命令,并重新执行其中一条。
- 给
df -h起个别名dfh,并验证能用。 - 让这个别名在下次登录后依然存在。
参考答案:
history 5,记住行号后!行号。alias dfh='df -h',敲dfh验证。echo "alias dfh='df -h'" >> ~/.bashrc,再source ~/.bashrc(>>是追加,用>会覆盖整个文件)。
第九篇 文本三剑客
grep 负责找、sed 负责改、awk 负责按列取数。三个小工具,能解决九成的日志处理。 这一篇一定要动手敲——看懂和会敲,是两件事。
第52章 grep:从一堆文字里挑出你要的 🔰
学完这一章,你能:从几百行的文字里,一眼挑出你要的那几行。
52.1 它是什么:一把"滤网"
grep 只干一件事:按行过滤。把它想成厨房里的筛子:文件往里一倒,含关键字的行留下,其余的行漏掉。它挑的是行,不是字,所以搜 tom,出来的是 tom 的一整行,不是只有 tom 三个字母。
52.2 从真实需求开始
一台上百个用户的服务器,你想知道:tom 这个用户到底有没有?/etc/passwd 是用户清单文件(名字叫 passwd,里面存的不是密码),一行一个用户。
# 命令:在用户清单里找 tom
grep 'tom' /etc/passwd
# 你会看到类似这一行(行号因系统而异):
tom:x:1001:1001::/home/tom:/bin/bash
这一行说明 tom 存在,家目录是 /home/tom。
52.3 五个选项,一个一个加
grep -i 'TOm' /etc/passwd # -i:忽略大小写,照样找到
grep -n 'tom' /etc/passwd # -n:显示行号
# 你会看到:23:tom:x:1001:1001::/home/tom:/bin/bash
grep -v 'nologin' /etc/passwd # -v:取反,只要不含 nologin 的行
# 你会看到:能登录的账号,比如
root:x:0:0:root:/root:/bin/bash
grep -r 'IPADDR' /etc/sysconfig/network-scripts/ # -r:整个文件夹一起搜
# 你会看到类似(前面是文件名):
/etc/sysconfig/network-scripts/ifcfg-ens33:IPADDR=192.168.1.10
grep -c 'bash' /etc/passwd # -c:只数行数(数行,不数出现次数)
# 你会看到类似:2
-i 忽略大小写,-n 给行号,-v 取反,-r 递归搜文件夹,-c 数行数。先记这五个就够了。
52.4 常见坑 ⚠️
⚠️ 注意:
grep 'tom'也会匹配tomcat、tommy。grep 只要求"包含",不要求"相等"。要整行完全相等,加-x(进阶再看)。
- 忘了
-i,搜Root就找不到root。 grep -r搜整个/会非常慢,还满屏Permission denied。先指定具体文件夹。ps -aux | grep ssh会多出一行grep自己,加一段| grep -v grep去掉。
52.5 三剑客组合
ps -aux | grep ssh | awk '{print $2}'
# 你会看到:ssh 进程的 PID,一行一个,比如
812
|(管道)把前一个命令的输出,直接当成后一个命令的输入,像接水管。这里:ps -aux 列出所有进程 → grep ssh 只留 ssh 的行 → awk 取第 2 列(PID)。
本章小结
| 命令/概念 | 作用 | 例子 |
|---|---|---|
grep '词' 文件 |
按行过滤,匹配的行整行显示 | grep 'root' /etc/passwd |
-i |
忽略大小写 | grep -i 'ROOT' /etc/passwd |
-n |
显示行号 | grep -n 'root' /etc/passwd |
-v |
取反,显示不匹配的行 | grep -v 'nologin' /etc/passwd |
-r |
在文件夹里递归搜索 | grep -rn 'IPADDR' /etc/ |
-c |
只统计匹配的行数 | grep -c 'bash' /etc/passwd |
\| |
把前一个命令的输出交给后一个 | ps -aux \| grep ssh |
动手练
- 找出
/etc/passwd里所有不能登录的账号。 - 数一数
/etc/passwd里有多少个账号用了 bash。 - 在
/etc里搜IPADDR,要看到文件名和行号。
参考答案:
grep 'nologin' /etc/passwd
grep -c 'bash' /etc/passwd
grep -rn 'IPADDR' /etc/
第53章 sed:批量改文字 🔰
学完这一章,你能:不打开文件,就把文件里的文字批量换掉,并且知道怎么改才不会改坏。
53.1 它是什么:流水线上的改字工人
sed 是"文本流编辑器"(stream editor)。把它想成流水线上的工人:文件一行一行从他面前过,他拿着你的指令,看到该改的就改,改完的流走,全程不用打开文件。所以 sed 最擅长干这种事:把一批文件里的同一个错误,一次改掉。动手前,先在家目录复制一份练手文件,别拿系统文件试。
53.2 最小可用:替换 s、-i 和 -i.bak
cd ~ && cp /etc/passwd ./passwd # 复制一份,随便改
sed 's@/sbin/nologin@/bin/bash@g' ./passwd # 先试一次,只看不改
# 你会看到:屏幕上一大批 /sbin/nologin 变成了 /bin/bash,比如
bin:x:1:1:bin:/bin:/bin/bash
注意:屏幕变了,文件一个字没变。这叫预览(sed 默认就是"改给你看")。想让结果真的写回文件,必须加 -i(in-place,原地修改):
sed -i 's@/sbin/nologin@/bin/bash@g' ./passwd # 改法一:直接改,没备份
sed -i.bak 's@/sbin/nologin@/bin/bash@g' ./passwd # 改法二:先备份再改(推荐)
ls passwd* # 你会看到:passwd passwd.bak(bak 就是改之前的原件)
三句话记牢:① 不加 -i 只预览,文件不动;② 加 -i 直接改,没有后悔药;③ 加 -i.bak 先备份再改,建议永远用这个。上面两条命令是同一件事的两种改法,二选一就行。
s 是替换(substitute),写法是 s/原内容/新内容/。结尾加 g 表示一行里全部替换;不加 g,每行只换第一个。要改的内容里本来就有 /,写起来满屏反斜杠,所以分隔符可以换。分隔符用 / @ # 都行,三个保持一致就好;以后改路径,优先用 @ 或 #。
sed 's/\/sbin\/nologin/\/bin\/bash/g' ./passwd # 能跑,但难看
sed 's@/sbin/nologin@/bin/bash@g' ./passwd # 换成 @,清爽
sed 's#/sbin/nologin#/bin/bash#g' ./passwd # 换成 #,也行
53.3 删除 d、打印 p、插入 i 和 a
| 模式 | 作用 | 例子 |
|---|---|---|
d |
删除整行 | sed '2,5d' 文件 |
p |
打印(要配 -n) |
sed -n '/tom/p' 文件 |
i / a |
在指定行上面 / 下面插入 | sed '1i 新内容' 文件 |
sed -n '2,3p' ./passwd # 你会看到:只有第 2–3 行,共两行
sed '/nologin/d' ./passwd # 你会看到:含 nologin 的行都没了
sed '1i # 文件开头加一行' ./passwd # 第一行上面多出一行
sed '/tom/a # tom 下面加一行' ./passwd # tom 那行下面多出一行(文件不变)
53.4 常见坑 ⚠️
⚠️ 注意:
sed -i直接改文件,没有回收站,改错只能靠.bak,动手前先cp一份。另外p不配-n会出现"每行打印两遍",看到重复先想-n。
- 引号要用英文半角的
'。从网页复制常带中文引号‘’“”,会报unknown command。 -i和.bak之间不能加空格:写-i.bak,别写-i .bak。
53.5 三剑客组合
grep 'bash' /etc/passwd | sed 's#/bin/bash#/bin/sh#g'
# 你会看到:能登录的账号,shell 路径换成了 /bin/sh
| 把 grep 挑出来的几行,直接交给 sed 当输入:grep 负责挑行,sed 负责改字。
本章小结
| 命令/概念 | 作用 | 例子 |
|---|---|---|
sed 's/旧/新/g' 文件 |
预览替换结果,不改文件 | sed 's@x@y@g' 文件 |
sed -i '...' 文件 |
直接改文件 | sed -i 's@x@y@g' 文件 |
sed -i.bak '...' |
先备份再改 | sed -i.bak 's@x@y@g' 文件 |
d / p |
删行 / 只打印匹配行(配 -n) |
sed '/x/d' 文件 |
i / a |
在行上面 / 下面插入 | sed '1i 内容' 文件 |
动手练
- 复制
/etc/passwd到家目录,把所有/bin/bash换成/bin/sh,改前先备份。 - 只看
/etc/passwd的前 3 行,再预览"删掉所有含nologin的行"。
参考答案:
cd ~ && cp /etc/passwd ./passwd
sed -i.bak 's@/bin/bash@/bin/sh@g' ./passwd
sed -n '1,3p' ./passwd
sed '/nologin/d' ./passwd
第54章 awk:按列取数据 🔰
学完这一章,你能:把一行行"挤在一起"的文字当成表格,按列取出你要的数据,顺便做点计算。
54.1 它是什么:会按列取数的 Excel
/etc/passwd 每一行长这样:tom:x:1001:1001::/home/tom:/bin/bash。冒号把它切成 7 段,就像 Excel 的一行有 7 列。awk 就是"按列取数"的小工具:你告诉它分隔符是冒号,它就把每行切成 $1、$2、$3……你想看第几列,就打印第几列。
54.2 最小可用:-F 指定分隔符,$1 取第一列
# 命令:只看用户名(第 1 列),分隔符是冒号
awk -F: '{print $1}' /etc/passwd
# 你会看到:一行一个用户名
root
bin
daemon
...
tom
-F:指定分隔符。-F:、-F ':'、-F ":"三种写法都行。{print $1}是"动作":打印第 1 列。分隔符选错,列就全错。
再看另外三个常用"格子":
awk -F: '{print $NF}' /etc/passwd # 最后一列:/bin/bash、/sbin/nologin……
awk -F: '{print $0}' /etc/passwd # 整行,原样输出
awk -F: '{print NR, $1}' /etc/passwd # 行号 + 第 1 列
# 你会看到:
1 root
2 bin
3 daemon
54.3 会算数:用 printf 做小数计算
awk 不止取列,还能算。最常用的场景:算内存占用率。
# free 的第 2 列是总数,第 3 列是已用
free | grep Mem | awk '{printf "%.2f%%\n", $3/$2*100}'
# 你会看到类似:
31.35%
拆开看:free 输出内存信息 → grep Mem 只留 Mem: 那一行 → awk 用第 3 列除第 2 列。printf "%.2f" 表示保留 2 位小数;%% 表示"打印一个百分号",因为 printf 里 % 有特殊含义,要写两个。
54.4 常见坑 ⚠️
⚠️ 注意:
{print $1}一定要用单引号包起来。用双引号的话,shell 会先把$1解释掉,变成空,你什么也看不到。
$NF是"最后一列",不是第 N 列。要第 3 列就写$3。- 空格分隔不用加
-F,awk 默认就按空白切;/etc/passwd才需要-F:。 - 输出百分号写
%%,只写一个%结果不可靠。
54.5 三剑客组合
df -h | grep '^/dev' | awk '{print $1, $5}'
# 你会看到:每块盘用了多少,比如
/dev/sda1 18%
/dev/mapper/centos-root 12%
| 把三条命令串成流水线:df -h 列出磁盘 → grep '^/dev' 只留真正的分区行 → awk 打印"哪块盘"和"用了百分之几"。
本章小结
| 命令/概念 | 作用 | 例子 |
|---|---|---|
awk -F: '{print $1}' |
按冒号切,取第 1 列 | awk -F: '{print $1}' /etc/passwd |
$0 |
整行 | awk '{print $0}' 文件 |
$NF |
最后一列 | awk -F: '{print $NF}' /etc/passwd |
NR |
行号 | awk '{print NR, $1}' 文件 |
printf |
格式化输出,能做小数计算 | awk '{printf "%.2f\n", $3/$2}' 文件 |
动手练
- 打印
/etc/passwd里每个用户的用户名和 shell。 - 打印
/etc/passwd的前 3 行,并带行号。
参考答案:
awk -F: '{print $1, $NF}' /etc/passwd
head -3 /etc/passwd | awk -F: '{print NR, $0}'
第55章 正则表达式入门 🔧
学完这一章,你能:看懂一串"奇怪的符号"在说什么,并用
grep -E写出取 IP、去注释两个实战。
55.1 它是什么:一套"文字模具"
普通搜索是"找一模一样的东西":搜 tom 就只找 tom。正则能描述一类文字。它像一套模具:你定好形状,符合这个形状的文字都能被找出来。grep 默认用基础正则,很多符号要加反斜杠才生效;加 -E 打开扩展正则,+ ? | () {} 就能直接写。本章一律配 -E。
| 写法 | 含义 | 例子 |
|---|---|---|
. |
任意一个字符 | a.c 匹配 abc、a1c |
[0-9] / [a-zA-Z] |
一个数字 / 一个字母([^0-9] 是"不是数字") |
[0-9][0-9] 匹配 42 |
* / + / ? |
前面字符 0 次以上 / 1 次以上 / 0 或 1 次 | ab*、ab+、colou?r |
{n,m} |
前面字符 n 到 m 次 | [0-9]{2,3} 匹配 42、123 |
^ / $ |
行首 / 行尾 | ^root、bash$ |
竖线 \| |
或者 | cat\|dog 匹配含 cat 或 dog 的行 |
() |
分组,把几个字符当一个整体 | (ab)+ 匹配 ab、abab |
\. |
转义:匹配真正的点 | 1\.2 匹配 1.2,不匹配 1x2 |
55.2 实战一:从 ip a 里揪出 IP 地址
ip a | grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}'
# 你会看到类似:
inet 127.0.0.1/8 scope host lo
inet 192.168.1.10/24 brd 192.168.1.255 scope global ens33
[0-9]{1,3}:1 到 3 个数字,这是 IP 的一段。\.:一个真正的点。不写反斜杠,.会匹配任意字符,1x2也算一段。([0-9]{1,3}\.){3}:把"数字 + 点"打包成一组,重复 3 次。- 最后再来一个
[0-9]{1,3},第四段数字。连起来读"(数字 点)三遍,再加一段数字",就是x.x.x.x。它只保证"长得像 IP",不检查每段小于 255,够用就行。
55.3 实战二:去掉注释行和空行
sudo grep -Ev '^$|^#' /etc/sudoers
# 你会看到:只剩真正有效的配置行,比如
Defaults !visiblepw
root ALL=(ALL) ALL
-E:用扩展正则,|才能直接写;|表示"或者"。-v:取反,匹配的行扔掉,剩下的才输出。^$:行首紧接着行尾,中间什么都没有,就是空行。^#:行首就是#,就是注释行。
所以 ^$|^# 读作"空行,或者注释行";再加 -v,就是"把这些行去掉,留下有效内容"。
⚠️
/etc/sudoers只有超级管理员 root 能读,所以要加sudo。另外这写法只去掉"顶格"的注释,前面带空格的# 注释去不掉;要去干净,用sudo grep -Ev '^[[:space:]]*(#|$)' /etc/sudoers。
55.4 常见坑 ⚠️
⚠️ 注意:
\d这类写法 grep 的扩展正则不支持(\d会被当成字母 d),要加-P才行,而-P不是每个系统都有。\w、\s在 GNU 版 grep 里确实能用,但它们是"方言",换台机器可能不认,含义也容易记错(\w是"字母、数字、下划线",不是"任意字符")。所以统一改用[0-9]、[a-zA-Z],走到哪都不会错。
?只有"0 次或 1 次",不是"非贪婪";grep -E 不支持非贪婪。*从 0 次算起,所以ab*也能匹配单独的a,要"至少一次"用+。[^]里的^是"非";^写在最前面才表示行首,别混。
55.5 三剑客组合
ip a | grep -E 'inet ' | awk '{print $2}'
# 你会看到:
127.0.0.1/8
192.168.1.10/24
| 让三个工具接力:ip a 打印网卡信息 → grep -E 'inet ' 用正则留下带 inet 的行(后面有空格,所以不会匹配 inet6)→ awk 取第 2 列。
本章小结
| 写法 | 作用 | 例子 |
|---|---|---|
. / [0-9] / [a-zA-Z] |
任意字符 / 数字 / 字母 | a.c、[0-9]{3} |
* + ? |
0 次以上 / 1 次以上 / 0 或 1 次 | ab+ |
^ $ |
行首 / 行尾 | ^# |
() / \| |
分组 / 或者 | (ab)+、cat\|dog |
grep -E |
打开扩展正则 | grep -E '...' |
动手练
- 从
ip a的输出里只挑出所有 IPv4 地址。 - 去掉
/etc/sudoers的注释行和空行,把结果存到~/sudoers.clean。
参考答案:
ip a | grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}'
sudo grep -Ev '^$|^#' /etc/sudoers > ~/sudoers.clean
第十篇 服务、网络与防火墙
前面的知识在这一篇合起来了:把服务开起来、把网络配通、把门守好。 学完这一篇,你就能独立在一台服务器上跑起一个网站。
第56章 systemctl:管理服务的开关 🔰
学完这一章,你能:启动、停止、重启一个服务,让它开机自动启动,并在起不来时看懂日志。
56.1 服务是什么,systemctl 管什么
一台服务器像一家公司。sshd 是门卫,httpd 是前台,firewalld 是保安队长。这些在后台一直待命、等着别人来访问的程序就是服务。systemctl 是总控面板,负责让各部门上班、下班、全年在岗。服务名后面的 .service 可以省略。
56.2 四个最常用的动作
systemctl status sshd
# 你会看到类似这样:
● sshd.service - OpenSSH server daemon
Active: active (running) since 2026-10-30 09:20:01 CST; 10min ago
Active: 后面三种结果要认得:
| 显示 | 含义 |
|---|---|
active (running) |
正在运行,正常 |
inactive (dead) |
没启动 |
failed |
启动失败,要查日志 |
启动是 systemctl start sshd,停止是 systemctl stop sshd,重启是 systemctl restart sshd。这三个命令都没有输出,没输出就是成功,用 status 验证。
56.3 enable:开机自动启动
systemctl enable sshd
# 你会看到类似这样:
Created symlink from /etc/systemd/system/multi-user.target.wants/sshd.service to ...
# 一条命令 = 设置开机自启 + 现在就启动
systemctl enable --now httpd
systemctl is-enabled httpd
# 你会看到:
enabled
⚠️ 最常见坑:
enable只是"下次开机自动启动",现在要它跑起来必须再start。新手常犯:只 enable 了服务,然后发现端口没开——服务压根没启动。反过来,stop也不会取消开机自启,要取消得用disable。
56.4 reload、restart 和看日志
restart:整个关掉再打开,正在访问的用户会断一下;reload:只让它重新读一遍配置文件,用户不断线,但不是所有服务都支持。
改了配置先试 systemctl reload nginx,不行再 restart。起不来就查日志:
journalctl -u httpd -n 20
# 你会看到最后 20 行日志,报错原因一般在最后几行
常见原因:端口被占(提示 Address already in use)、配置文件写错(会报行号)、权限不够。
56.5 一个完整例子:把网站跑起来
yum install -y httpd # 1. 装软件
systemctl enable --now httpd # 2. 开机自启 + 立即启动
ss -lntp | grep :80 # 3. 确认 80 端口在监听
# 你会看到:
LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("httpd",pid=2231,fd=4))
firewall-cmd --permanent --add-service=http # 4. 防火墙放行(第58章)
firewall-cmd --reload
# 5. 用浏览器访问 http://服务器IP
💡 小贴士:本机
curl -I http://127.0.0.1能通、别的电脑打不开,基本就是第 4 步防火墙没放行。
本章小结
| 命令 | 作用 | 例子 |
|---|---|---|
systemctl start |
启动 | systemctl start httpd |
systemctl stop |
停止 | systemctl stop httpd |
systemctl restart |
重启(会断线) | systemctl restart httpd |
systemctl reload |
只重读配置 | systemctl reload nginx |
systemctl status |
看状态 | systemctl status httpd |
systemctl enable/disable |
开机自启 / 不自启 | systemctl enable --now httpd |
journalctl -u |
看某个服务的日志 | journalctl -u httpd -n 20 |
动手练
- 查看
sshd的当前状态,它是开机自启吗? - 用一条命令启动
httpd并设置开机自启。 - 确认 80 端口已经在监听。
参考答案:
systemctl status sshd看Active:是不是running;systemctl is-enabled sshd返回enabled就是开机自启。systemctl enable --now httpd(没装先yum install -y httpd)。ss -lntp | grep :80。
第57章 配置网络 🔰
学完这一章,你能:在 CentOS 7 和 Ubuntu 22.04 上手动配好 IP、网关和 DNS,并确认网络真的通了。
57.1 先认四个词
配 IP 就像给新家写地址,四个词缺一不可:
| 词 | 人话 | 例子 |
|---|---|---|
| IP 地址 | 门牌号 | 192.168.8.28 |
| 子网掩码 / 前缀 | 这个小区有多大范围 | 255.255.255.0 等于 /24 |
| 网关 | 出小区要走的大门 | 192.168.8.2 |
| DNS | 查号台,把域名翻译成 IP | 223.5.5.5 |
网关和 IP 必须在同一个网段(前三段一样),否则出不去。
57.2 CentOS 7:改 ifcfg-ens33
网卡名可能是 ens33、eth0,先用 ip a 确认(第49章)。
vi /etc/sysconfig/network-scripts/ifcfg-ens33
# 改成类似这样(有就改,没有就加):
TYPE=Ethernet
BOOTPROTO=none
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.8.28
PREFIX=24
GATEWAY=192.168.8.2
DNS1=223.5.5.5
最关键的 3 行:BOOTPROTO=none 是手动配(写 dhcp 是自动获取);ONBOOT=yes 是开机启用这块网卡;IPADDR/PREFIX/GATEWAY/DNS1 就是上面那四个词。
systemctl restart network
# 没有输出就是成功,再 ip a 看 ens33 的 inet 变成 192.168.8.28/24
57.3 Ubuntu 22.04 及以上:改 netplan
Ubuntu 不用 ifcfg 文件,用 /etc/netplan/ 下的 yaml 文件(文件名可能不同,先 ls /etc/netplan/ 看一眼)。
vi /etc/netplan/01-netcfg.yaml
# 改成类似这样(缩进用空格,每级 2 个空格):
network:
version: 2
ethernets:
ens33:
dhcp4: no
addresses: [192.168.8.8/24]
routes:
- to: default
via: 192.168.8.2
nameservers:
addresses: [114.114.114.114, 8.8.8.8]
netplan apply
# 没有输出就是成功
ip -br a
# 你会看到类似这样:
ens33 UP 192.168.8.8/24
⚠️ 常见坑:yaml 只能用空格缩进,绝对不能用 Tab;冒号后面必须有一个空格。错一格,
netplan apply就报错。老教程里的gateway4:在 22.04 还能用(会提示 deprecated),新版本请用上面routes的写法。
57.4 nmtui、nmcli,改完必须验证
nmtui # 文字版菜单:选网卡 → 填 IP/网关/DNS → OK
systemctl restart network # 改完重启网络
nmcli device status # 看每块网卡状态,ens33 那行应是 connected
nmcli connection up ens33 # 让改过的配置生效(换成你的连接名)
ping -c 4 192.168.8.2 # 验证:先 ping 网关
ping -c 4 www.baidu.com # 再 ping 域名,能通说明 DNS 也对
ip -br a # 一行一块网卡,有没有 IP 一眼看见
nmtui 用方向键选、回车确认,最适合新手(CentOS 最小化安装可能要 yum install -y NetworkManager-tui);nmcli 是它的命令行版。CentOS 7 改完用 systemctl restart network,Ubuntu 上则是 netplan apply(或 systemctl restart NetworkManager)。两条 ping 都通就收工,哪条不通,回第49章按顺序查。
⚠️ 危险提醒:如果你是通过 SSH 远程连着这台机器改 IP,新 IP 一敲下去连接立刻就断。要么在虚拟机控制台或机房现场改,要么先想好用新 IP 连回来的办法。
本章小结
| 系统 / 场景 | 配置文件 | 生效命令 |
|---|---|---|
| CentOS 7 | /etc/sysconfig/network-scripts/ifcfg-ens33 |
systemctl restart network |
| Ubuntu 22.04+ | /etc/netplan/*.yaml |
netplan apply |
| 界面 / 命令行 | nmtui / nmcli |
systemctl restart network / nmcli connection up 连接名 |
| 看结果 | 无 | ip a / ip -br a |
动手练
- 用
ip -br a看当前网卡名和 IP。 - 在 CentOS 7 上把 IP 改成
192.168.8.50/24,网关192.168.8.2,DNS223.5.5.5。 - 改完怎么验证?说出两条命令。
参考答案:
ip -br a,UP且有 IP 的那块就是你的网卡。- 编辑 ifcfg-ens33,改
IPADDR=192.168.8.50、PREFIX=24、GATEWAY=192.168.8.2、DNS1=223.5.5.5,再systemctl restart network。 ping -c 4 192.168.8.2(网关)和ping -c 4 www.baidu.com(DNS)。
第58章 防火墙 🔰
学完这一章,你能:用 firewalld 放行一个端口,看懂 iptables 的四表五链,并安全地写出"只放行 80/443"的规则。
58.1 防火墙就是小区的门卫
小区有门卫,所有进出的人和包裹都得过一道。门卫手里有一张登记表:表上写了放行的就进,没写的拦下。防火墙干的就是这件事:检查进出这台机器的每一个数据包,按规则决定放行还是拦住。
Linux 上常见两套工具:firewalld 是门卫队长,你说"放行 80 号",他替你去写表,简单,日常首选;iptables 是你自己写登记表,灵活但语法难。两者底层都是内核里的 Netfilter,所以绝对不能同时启用。
58.2 firewalld 常用操作
firewall-cmd --state # 看防火墙开没开,显示 running 就是开着
firewall-cmd --add-port=8080/tcp # 临时放行,重启防火墙失效
firewall-cmd --permanent --add-port=8080/tcp # 永久放行,写进配置文件
firewall-cmd --reload # 让 permanent 的配置真正生效
firewall-cmd --list-all # 看当前放行了什么(最常用的命令)
# 你会看到类似这样:
public (active)
services: ssh dhcpv6-client
ports: 80/tcp
记忆要点:--permanent 只是写进配置文件,必须再 --reload 才生效;不加 --permanent 的改动重启就丢。撤销用 --remove-port=8080/tcp。
58.3 完整例子:只放行网页和 SSH
# 1. 永久放行 SSH——必须先放行,否则重载后远程就连不上了
firewall-cmd --permanent --add-service=ssh
# 2. 永久放行网页:http 对应 80,https 对应 443
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
# 3. 重新加载,让配置生效
firewall-cmd --reload
# 你会看到 success;再执行 firewall-cmd --list-all,services 那行能看到 ssh http https
⚠️ 常见坑:
--reload会重新加载规则。如果你远程 SSH 时,配置里把 22 关掉了,重载那一刻连接就断,人就进不去了。改防火墙前,先确认 22 是放行的。
58.4 iptables:门卫 + 四张登记表 + 五道关卡
四张表(四本不同的登记本,先只记前两张):
| 表 | 管什么 | 什么时候用 |
|---|---|---|
filter |
放行还是拦住(默认表) | 日常 90% 的规则都写在这里 |
nat |
改 IP 地址 | 共享上网(SNAT)、端口映射(DNAT) |
mangle |
改数据包头部 | 流量整形,进阶再看 |
raw |
连接跟踪之前处理 | 高并发优化,进阶再看 |
五道关卡(数据包像快递,路线不同,经过的关卡不同):PREROUTING(刚进小区,还没分拣)→ INPUT(送到本机的包裹)→ FORWARD(只是路过、要转给别人的包裹)→ OUTPUT(本机发出的包裹)→ POSTROUTING(出小区大门前最后一道)。日常配置 99% 是在 filter 表的 INPUT 链上做文章。
58.5 规则怎么写
格式:iptables [-t 表名] 操作选项 链名 匹配条件 -j 动作
操作选项(5 个够用):-A 追加到链的最后|-I 插到最前面(默认第 1 条)|-D 删除(如 -D INPUT 5)|-L 列出规则|-P 设置默认策略(所有规则都不匹配时怎么办)。
匹配条件:
| 选项 | 匹配什么 | 例子 |
|---|---|---|
-p |
协议 tcp/udp/icmp | -p tcp |
-s |
源 IP | -s 192.168.8.0/24 |
-d |
目标 IP | -d 192.168.8.28 |
--dport |
目标端口(必须配 -p tcp 或 -p udp) |
-p tcp --dport 80 |
动作(-j 后面跟):ACCEPT 放行;DROP 悄悄丢掉,对方一直等到超时;REJECT 明确拒绝,对方立刻收到"拒绝"消息。
58.6 完整例子:开放 80/443,其余拒绝
# 第一步:本机访问本机、SSH 必须先放行
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 第二步:放行网页
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 第三步:最后才设置默认拒绝——顺序绝不能反
iptables -P INPUT DROP
# 第四步:用 iptables -L -n -v --line-numbers 检查,你会看到类似这样(只保留关键列):
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
3 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
⚠️ 两大坑,必须记住:
-P INPUT DROP之前一定要先放行 22 端口。默认拒绝一设,SSH 当场断开,远程服务器你就再也进不去了(云服务器只能提工单进救援模式)。- firewalld 和 iptables 不要同时启用。它们操作同一个 Netfilter,规则互相打架,表现就是"明明放行了却不生效"。用 iptables 前先
systemctl stop firewalld,再systemctl disable firewalld。💡 小贴士:实际还要放行"回包",否则你发出去的请求,回复会被拦下:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT。iptables 规则默认重启就没了,要保存得装iptables-services再service iptables save。
本章小结
| 工具 / 概念 | 作用 | 例子 |
|---|---|---|
firewall-cmd |
日常最省事的防火墙管理 | firewall-cmd --list-all |
--permanent + --reload |
永久放行一个端口 | firewall-cmd --permanent --add-port=80/tcp |
| iptables 四表 / 五链 | filter 等四表、INPUT 等五个关卡 | 日常只用 filter 表和 INPUT 链 |
-A/-I/-D/-L/-P |
增、插、删、看、默认策略 | iptables -A INPUT -p tcp --dport 22 -j ACCEPT |
ACCEPT/DROP/REJECT |
放行 / 静默丢弃 / 明确拒绝 | -j ACCEPT |
动手练
- 查看 firewalld 是否运行,并列出当前放行的端口。
- 永久放行 8080 端口,并让它立即生效。
- 用 iptables 开放 22 和 80、默认拒绝其他入站连接。先想一想:哪一步的顺序不能错?
参考答案:
firewall-cmd --state;firewall-cmd --list-all(看 ports 那一行)。firewall-cmd --permanent --add-port=8080/tcp,再firewall-cmd --reload。- 先
iptables -A INPUT -p tcp --dport 22 -j ACCEPT,再放行 80,最后才iptables -P INPUT DROP。
第59章 常见基础服务一览 🔧
学完这一章,你能:听到一个服务名,就知道它是干什么的、走哪个端口、装哪个包。
59.1 服务就是"一直开着的店"
服务像商场里常年在营业的店铺:各家卖的东西不同,门口挂着门牌号(端口)。客人按门牌号找上门,店里的老板(服务进程)就负责接待。这一章不要求你会配,先"认识人",以后用到再回来查表。
59.2 八个最常见的基础服务
| 服务 | 一句人话 | 干什么用 | 默认端口 | 安装包(CentOS) |
|---|---|---|---|---|
| SSH | 远程登录 | 在别的电脑上敲这台机器的命令 | 22 | openssh-server |
| FTP | 传文件的老协议 | 上传、下载文件(明文传输,不安全) | 21(控制)、20(数据) | vsftpd |
| NFS | Linux 之间的共享文件夹 | 把 A 机器的目录挂到 B 机器上用 | 2049 | nfs-utils |
| Samba | 和 Windows 共享文件夹 | 让 Windows 直接访问 Linux 的目录 | 445(旧版 137–139) | samba |
| NTP | 对时服务 | 让所有机器时间保持一致 | 123(UDP) | chrony |
| DNS | 域名翻译成 IP | 把 www.baidu.com 变成 IP 地址 |
53(TCP/UDP) | bind |
| DHCP | 自动发 IP | 新机器联网自动拿到 IP | 67(服务器)、68(客户端) | dhcp |
| HTTP/HTTPS | 网页服务 | 对外提供网站 | 80 / 443 | httpd(或 nginx) |
💡 小贴士:Ubuntu 上包名不一样:NFS 服务端叫
nfs-kernel-server,DNS 叫bind9,DHCP 叫isc-dhcp-server,网页服务常用apache2或nginx。
59.3 怎么确认服务在不在、开没开
ss -lnutp
# 你会看到所有正在监听的端口,最后一列 Process 写着是谁占的
systemctl status sshd
# Active: active (running) 就是服务活着
rpm -q httpd # CentOS 查包装了没
# 装了会显示:
httpd-2.4.6-97.el7.centos.x86_64
# 没装会显示:
package httpd is not installed
⚠️ 常见坑:知道端口还不够。服务"装了 ≠ 启动了 ≠ 防火墙放行了",三步任何一步没做,外面都访问不到。比如 httpd 装好也启动了,但 firewalld 没放行 80,浏览器照样打不开。
59.4 端口冲突:最常见的事故
一个端口同一时间只能被一个程序占用。装了 httpd 和 nginx 都想用 80,后启动的必定失败,日志里写着 Address already in use。
ss -lntp | grep :80
# 你会看到谁占着 80,再决定停掉哪个
💡 小贴士:默认端口不是不能改,但改端口意味着用户要记新端口,一般不如停掉不需要的那个服务。真要改,记得防火墙同步放行新端口。
本章小结
| 想做什么 | 用什么命令 |
|---|---|
| 看谁占着端口 | ss -lnutp |
| 查包装没装 | rpm -q 包名(Ubuntu 用 dpkg -l 包名) |
| 查服务状态 | systemctl status 服务名 |
| 查本机 IP | ip a / ip -br a |
动手练
- 说出 SSH、HTTP、HTTPS、DNS 的默认端口。
- 查出这台机器上 22 端口是哪个程序在监听。
- 判断:
httpd已经是active (running),但同事的电脑打不开网页,最可能是什么原因?
参考答案:
- SSH 22;HTTP 80;HTTPS 443;DNS 53。
ss -lntp | grep :22,能看到users:(("sshd",...))。- 防火墙(firewalld)没放行 80 端口,见第58章。
附录
附录A 命令速查表
用法:按"我想做什么"来找,不用按字母背。 表格里"例子"一列可以直接抄着敲(把文件名换成你自己的)。
A.1 认清自己在哪
| 我想…… | 命令 | 例子 |
|---|---|---|
| 看当前在哪个目录 | pwd |
pwd |
| 看目录里有什么 | ls |
ls -l、ls -a、ls -lh |
| 看目录本身的权限 | ls -ld |
ls -ld /etc |
| 切换目录 | cd |
cd /etc、cd ..、cd ~、cd - |
| 我是谁 | whoami |
whoami |
| 我的详细身份 | id |
id |
| 谁登录着 | who |
who |
| 清屏 | clear |
或按 Ctrl + L |
| 看历史命令 | history |
history 20 |
| 查命令帮助 | --help / man |
ls --help、man ls |
A.2 文件和目录
| 我想…… | 命令 | 例子 |
|---|---|---|
| 建空文件 | touch |
touch a.txt |
| 建目录 | mkdir |
mkdir data |
| 建多层目录 | mkdir -p |
mkdir -p /data/app/logs |
| 复制文件 | cp |
cp a.txt /tmp/ |
| 复制目录 | cp -r |
cp -r src/ /backup/ |
| 移动 / 重命名 | mv |
mv a.txt b.txt、mv a.txt /tmp/ |
| 删文件 | rm |
rm a.txt |
| 删目录 | rm -r |
rm -r data/ |
| 强制删(危险) | rm -rf |
rm -rf data/ |
| 删空目录 | rmdir |
rmdir empty/ |
| 看文件类型 | file |
file a.txt |
| 看文件详情 | stat |
stat a.txt |
| 看目录占用大小 | du -sh |
du -sh /var/log |
| 软链接 | ln -s |
ln -s /data/app/config.yml ./c.yml |
| 硬链接 | ln |
ln a.txt b.txt |
A.3 看文件内容
| 我想…… | 命令 | 例子 |
|---|---|---|
| 看全部(小文件) | cat |
cat /etc/os-release |
| 看并显示行号 | cat -n |
cat -n /etc/passwd |
| 分页看(可上下翻) | less |
less /var/log/messages(q 退出) |
| 看前 10 行 | head |
head /etc/passwd |
| 看前 20 行 | head -20 |
head -20 a.txt |
| 看最后 10 行 | tail |
tail /var/log/messages |
| 实时跟踪日志 | tail -f |
tail -f /var/log/messages |
| 按关键字找行 | grep |
grep root /etc/passwd |
| 统计行数 | wc -l |
wc -l a.txt |
A.4 用户和组
| 我想…… | 命令 | 例子 |
|---|---|---|
| 建用户 | useradd |
useradd tom |
| 不建家目录 | useradd -M |
useradd -M -s /sbin/nologin mysql |
| 设密码 | passwd |
passwd tom |
| 锁 / 解锁 | passwd -l/-u |
passwd -l tom |
| 切用户 | su - |
su - tom |
| 退出 | exit |
exit |
| 删用户 | userdel -r |
userdel -r tom |
| 改用户信息 | usermod |
usermod -aG wheel tom |
| 建组 | groupadd |
groupadd dev |
| 删组 | groupdel |
groupdel dev |
| 用户加入组 | gpasswd -a |
gpasswd -a tom dev |
| 用户移出组 | gpasswd -d |
gpasswd -d tom dev |
| 用 sudo | sudo |
sudo systemctl restart nginx |
| 查我的 sudo 权限 | sudo -l |
sudo -l |
A.5 权限
| 我想…… | 命令 | 例子 |
|---|---|---|
| 加权限(符号法) | chmod u+w |
chmod u+w a.txt |
| 设权限(数字法) | chmod 644 |
chmod 644 a.txt |
| 递归改 | chmod -R |
chmod -R 755 /data/app |
| 给脚本加执行 | chmod +x |
chmod +x run.sh |
| 改属主 | chown |
chown tom a.txt |
| 改属主+属组 | chown 用户:组 |
chown -R apache:apache /var/www |
| 只改属组 | chgrp |
chgrp dev a.txt |
| 看默认权限 | umask |
umask |
| 看 ACL | getfacl |
getfacl a.txt |
| 设 ACL | setfacl -m |
setfacl -m u:bob:rw a.txt |
| 删 ACL | setfacl -x |
setfacl -x u:bob a.txt |
| 加不可变锁 | chattr +i |
chattr +i important.conf |
| 解锁 | chattr -i |
chattr -i important.conf |
| 看隐藏权限 | lsattr |
lsattr important.conf |
常用权限数字:644 普通文件 / 755 目录和程序 / 600 私密文件 / 700 私密目录 / 777 别用。
A.6 装软件
| 我想…… | 命令(CentOS) | 命令(Ubuntu) |
|---|---|---|
| 装 | yum install -y 包名 |
apt install -y 包名 |
| 卸 | yum remove 包名 |
apt remove 包名 |
| 更新 | yum update |
apt update && apt upgrade |
| 搜索 | yum search 关键字 |
apt search 关键字 |
| 看信息 | yum info 包名 |
apt show 包名 |
| 列已装 | yum list installed |
dpkg -l |
| 重建软件源缓存 | yum makecache |
apt update |
| 装单个 rpm 包 | rpm -ivh x.rpm |
dpkg -i x.deb |
| 这命令来自哪个包 | rpm -qf $(which nc) |
dpkg -S $(which nc) |
| 这包装了哪些文件 | rpm -ql 包名 |
dpkg -L 包名 |
A.7 压缩与解压
| 我想…… | 命令 |
|---|---|
| 压 zip | zip -r 包名.zip 目录/ |
| 解 zip | unzip 包名.zip |
| 解 zip 到指定目录 | unzip 包名.zip -d /tmp/ |
| 压 tar.gz | tar -czvf 包名.tar.gz 目录/ |
| 解 tar.gz | tar -xzvf 包名.tar.gz |
| 解 tar.gz 到指定目录 | tar -xzvf 包名.tar.gz -C /tmp/ |
| 只看包里有什么(不解压) | tar -tzvf 包名.tar.gz |
| gzip 压单文件 | gzip 文件名 |
| gzip 解压 | gzip -d 文件名.gz |
tar 记忆口诀:c 打包 / x 解包 / z gzip / j bzip2 / J xz / v 显示过程 / f 指定文件名 / C 指定解压目录。
注意:-f 后面紧跟包名,所以 -czvf 包名.tar.gz 目录 的顺序不能乱。
A.8 磁盘
| 我想…… | 命令 | 例子 |
|---|---|---|
| 看所有磁盘和分区 | lsblk |
lsblk |
| 看磁盘的 UUID 和文件系统 | lsblk -f |
lsblk -f |
| 看各分区使用率 | df -h |
df -h |
| 看目录占用 | du -sh |
du -sh /* |
| 分区(MBR) | fdisk |
fdisk /dev/sdb |
| 分区(GPT) | gdisk |
gdisk /dev/sdc |
| 格式化为 ext4 | mkfs.ext4 |
mkfs.ext4 /dev/sdb1 |
| 格式化为 xfs | mkfs.xfs |
mkfs.xfs /dev/sdb2 |
| 挂载 | mount |
mount /dev/sdb1 /data/A |
| 卸载 | umount |
umount /data/A |
| 挂载 fstab 里的全部 | mount -a |
mount -a |
| 看挂载情况 | mount / df -h |
df -h |
| 格式化 swap | mkswap |
mkswap /dev/sdb3 |
| 开 / 关 swap | swapon/swapoff |
swapon /dev/sdb3 |
A.9 系统状态与进程
| 我想…… | 命令 | 例子 |
|---|---|---|
| 内核版本、架构 | uname -a |
uname -a |
| 发行版版本 | cat /etc/os-release |
cat /etc/os-release |
| CPU 信息 | lscpu |
lscpu |
| 内存 | free -h |
free -h |
| 磁盘空间 | df -h |
df -h |
| 主机名 | hostname |
hostname |
| 永久改主机名 | hostnamectl |
hostnamectl set-hostname web01 |
| 运行时间、负载 | uptime |
uptime |
| 所有进程 | ps -aux |
ps -aux |
| 动态看进程 | top |
top(m 内存、t CPU、q 退出) |
| 结束进程 | kill |
kill 1234 |
| 强杀进程 | kill -9 |
kill -9 1234 |
| 按名字找进程 | pgrep |
pgrep nginx |
| 这端口谁在用 | ss -lnutp |
ss -lnutp \| grep 80 |
A.10 网络
| 我想…… | 命令 | 例子 |
|---|---|---|
| 看 IP 地址 | ip a |
ip a |
| 简洁看 IP | ip -br a |
ip -br a |
| 看路由/网关 | ip route |
ip route |
| 测连通性 | ping |
ping -c 4 www.baidu.com |
| 看路由路径 | traceroute |
traceroute www.baidu.com |
| 域名解析 | dig / nslookup |
dig www.baidu.com |
| 测端口是否开放 | telnet / nc |
nc -zv 192.168.8.28 22 |
| 发 HTTP 请求 | curl |
curl -I http://www.baidu.com |
| 下载文件 | wget |
wget https://xxx/file.tar.gz |
| 图形化配网卡 | nmtui |
nmtui |
A.11 服务管理
| 我想…… | 命令 | 例子 |
|---|---|---|
| 启动 | systemctl start |
systemctl start httpd |
| 停止 | systemctl stop |
systemctl stop httpd |
| 重启 | systemctl restart |
systemctl restart httpd |
| 重载配置(不断服务) | systemctl reload |
systemctl reload nginx |
| 开机自启 | systemctl enable |
systemctl enable httpd |
| 设自启并立即启动 | systemctl enable --now |
systemctl enable --now httpd |
| 取消自启 | systemctl disable |
systemctl disable httpd |
| 看状态 | systemctl status |
systemctl status httpd |
| 看是否运行中 | systemctl is-active |
systemctl is-active httpd |
| 列所有服务 | systemctl list-units --type=service |
同上 |
| 看服务日志 | journalctl -u |
journalctl -u httpd -n 50 |
| 实时看日志 | journalctl -fu |
journalctl -fu httpd |
| 彻底禁用服务 | systemctl mask |
systemctl mask httpd |
A.12 防火墙
| 我想…… | 命令(CentOS 7,firewalld) |
|---|---|
| 看状态 | systemctl status firewalld |
| 开 / 关 | systemctl start firewalld / stop |
| 看开了哪些端口 | firewall-cmd --list-all |
| 放行端口(永久) | firewall-cmd --permanent --add-port=80/tcp |
| 放行服务(永久) | firewall-cmd --permanent --add-service=http |
| 撤销放行 | firewall-cmd --permanent --remove-port=80/tcp |
| 让配置生效 | firewall-cmd --reload |
| 临时关闭全部 | systemctl stop firewalld && systemctl disable firewalld |
iptables 速记:
| 我想…… | 命令 |
|---|---|
| 看规则(带行号) | iptables -L -n -v --line-numbers |
| 追加允许 22 端口 | iptables -A INPUT -p tcp --dport 22 -j ACCEPT |
| 插到最前面 | iptables -I INPUT -p tcp --dport 80 -j ACCEPT |
| 删除第 5 条 | iptables -D INPUT 5 |
| 清空规则 | iptables -F |
| 设默认策略 | iptables -P INPUT DROP |
| 保存规则 | service iptables save(CentOS 7 需装 iptables-services) |
⚠️ 在
-P INPUT DROP之前,必须先放行 22 端口,否则 SSH 会断,你把自己锁在外面。
A.13 找文件
| 我想…… | 命令 | 例子 |
|---|---|---|
| 按名字找 | find -name |
find / -name "*.conf" |
| 不区分大小写 | find -iname |
find / -iname "*.conf" |
| 按类型找目录 | find -type d |
find /data -type d |
| 按大小找 | find -size |
find / -size +100M |
| 按修改时间(天) | find -mtime |
find /var/log -mtime -1 |
| 找到后执行操作 | find -exec |
find . -name "*.log" -exec rm {} \; |
| 按命令名找路径 | which |
which nginx |
| 按文件名找(快速) | locate |
locate nginx.conf(需先 updatedb) |
A.14 文本三剑客
| 我想…… | 命令 | 例子 |
|---|---|---|
| 按关键字过滤 | grep |
grep root /etc/passwd |
| 忽略大小写 | grep -i |
grep -i root /etc/passwd |
| 显示行号 | grep -n |
grep -n root /etc/passwd |
| 反向(不含) | grep -v |
grep -v "^#" /etc/sudoers |
| 递归查目录 | grep -rn |
grep -rn "listen" /etc/nginx/ |
| 用扩展正则 | grep -E |
grep -E "80\|443" a.txt |
| 批量替换 | sed -i 's/旧/新/g' |
sed -i 's/8080/80/g' a.conf |
| 改前先备份 | sed -i.bak |
sed -i.bak 's/旧/新/g' a.conf |
| 删除某行 | sed -i '3d' |
sed -i '/^#/d' a.conf |
| 打印匹配行 | sed -n '/关键字/p' |
sed -n '/error/p' app.log |
| 按列取数 | awk -F |
awk -F: '{print $1}' /etc/passwd |
| 取最后一列 | awk '{print $NF}' |
awk -F: '{print $NF}' /etc/passwd |
A.15 快捷键
| 快捷键 | 作用 |
|---|---|
Tab |
自动补全(命令、文件名、路径)—— 最该养成的习惯 |
↑ / ↓ |
翻历史命令 |
Ctrl + L |
清屏 |
Ctrl + C |
中断当前正在运行的命令 |
Ctrl + D |
退出当前终端 / 结束输入 |
Ctrl + A |
光标移到行首 |
Ctrl + E |
光标移到行尾 |
Ctrl + U |
删掉光标前的内容 |
Ctrl + Z |
把当前命令放到后台 |
Ctrl + R |
搜索历史命令(很好用) |
A.16 特殊符号
| 符号 | 作用 | 例子 |
|---|---|---|
* |
任意多个字符 | rm *.log |
? |
任意一个字符 | ls a?.txt |
[abc] |
括号里任意一个字符 | ls [abc].txt |
{1..10} |
序列 | touch file{1..10}.txt |
{a,b} |
枚举 | mkdir /data/{A,B} |
> |
输出重定向,覆盖 | ls -l > list.txt |
>> |
输出重定向,追加 | echo hi >> list.txt |
< |
输入重定向 | bc < calc.txt |
<< |
键盘输入直到标记 | cat >> a.txt << EOF |
\| |
管道:前一个的输出给后一个 | ps -aux \| grep nginx |
; |
依次执行,不管成功失败 | cd /tmp ; ls |
&& |
前一个成功才执行后一个 | cd /tmp && ls |
\|\| |
前一个失败才执行后一个 | ping -c1 a \|\| echo 不通 |
# |
注释(配置文件里) | # 这是注释 |
~ |
家目录 | cd ~ |
. / .. |
当前目录 / 上一级目录 | cd .. |
附录B 常见报错与解决办法
遇到报错先别慌,按顺序做三件事:① 看清报错最后一行 ② 确定是"找不到"还是"没权限"还是"网络不通" ③ 再对症。
| # | 报错 | 中文意思 | 常见原因 | 解决办法 |
|---|---|---|---|---|
| 1 | command not found |
找不到这个命令 | 命令打错了 / 没装这个软件 / 路径不对 | 先用 Tab 补全确认拼写;确认装没装 rpm -qf $(which 命令) |
| 2 | No such file or directory |
没有这个文件或目录 | 路径写错 / 文件名大小写不对 / 文件真不存在 | ls 到上级目录看看真实名字,注意大小写 |
| 3 | Permission denied |
权限不够 | 当前用户对这个文件/目录没权限 | 看 ls -l 的 ugo 三段;确认是不是需要 sudo;不要无脑 777 |
| 4 | Operation not permitted |
不允许操作 | ① 普通用户改属主 ② 文件被 chattr +i 锁了 |
加 sudo;或 lsattr 看是不是有 i,用 chattr -i 解锁 |
| 5 | Is a directory / Not a directory |
这是个目录 / 这不是目录 | 把目录当文件用,或把文件当目录 cd |
ls -ld 名字 看清类型再操作 |
| 6 | rm: cannot remove 'xxx': Is a directory |
不能删,它是目录 | 删目录没加 -r |
rm -r 目录(确认清楚再敲) |
| 7 | Tom is not in the sudoers file |
你没被授权用 sudo | 没加进 wheel(CentOS)或 sudo(Ubuntu)组 |
root 执行 usermod -aG wheel tom,然后重新登录 |
| 8 | Sorry, user tom may not run sudo on this host |
有 sudo 但这条命令不许 | sudoers 里限制了这个命令 | sudo -l 看允许范围;找管理员申请 |
| 9 | Authentication failure |
认证失败(密码错) | 密码打错了 / 键盘大小写 / 账号被锁 | 重新输;root 用 passwd -S 用户 看是否锁定 |
| 10 | sudo: command not found |
系统没装 sudo | 最小化安装的 CentOS 常没装 | root 执行 yum install -y sudo |
| 11 | Could not resolve host: xxx |
域名解析不了 | DNS 没配 / 网卡没连 / /etc/resolv.conf 空 |
ping 8.8.8.8 测外网;检查 cat /etc/resolv.conf |
| 12 | Network is unreachable |
网络不可达 | 没有默认网关 / 网卡没启动 | ip a、ip route 检查;systemctl restart network |
| 13 | Connection refused |
连接被拒绝 | 目标端口没监听 / 服务没起 | 到目标机 ss -lnutp \| grep 端口、systemctl status 服务 |
| 14 | Connection timed out |
连接超时 | 防火墙拦了 / 网络不通 / IP 错 | 检查 firewalld、iptables -L -n;先 ping |
| 15 | Permission denied (publickey,gssapi-keyex,password) |
SSH 登录被拒 | 密码错 / root 禁止登录 / 密钥不对 | 看 /etc/ssh/sshd_config 的 PermitRootLogin;确认密码 |
| 16 | Another app is currently holding the yum lock |
yum 被另一个进程占用 | 另一次 yum 还在跑 / 上次异常退出 | ps -aux \| grep yum 找到后 kill,或删 /var/run/yum.pid |
| 17 | Cannot find a valid baseurl for repo |
找不到可用的软件源 | yum 源地址错 / 没网 / 光盘没挂载 | 先 ping www.baidu.com;检查 /etc/yum.repos.d/ 下的 baseurl |
| 18 | No package xxx available |
源里没有这个包 | 包名写错 / 源里确实没有 | yum search 关键字 找准确包名 |
| 19 | Device or resource busy |
设备正忙 | 有进程在用这个目录 | lsof 目录 或 fuser -vm 目录 找出进程再处理 |
| 20 | mount: wrong fs type, bad option, bad superblock |
挂载失败 | 分区没格式化 / 文件系统类型写错 / 设备名错 | lsblk -f 确认文件系统和设备名;没格式化先 mkfs |
| 21 | No space left on device |
磁盘满了 | 日志或数据把磁盘写满 | df -h 找满的分区;du -sh /* 找大目录清理 |
| 22 | Argument list too long |
参数太多 | rm * 时文件数量上百万 |
改用 find 目录 -name "*.log" -delete |
| 23 | Text file busy |
文件正在被使用 | 程序正在运行还想覆盖它 | 先停服务 systemctl stop 服务,再操作 |
| 24 | E212: Can't open file for writing(vim 里) |
写不进去 | 普通用户改系统文件 | sudo vim 文件 |
| 25 | vim 卡住打不了字 | 可能在插入模式外 | 按 i 进编辑模式;或者上次没正常退出 |
Esc 后 :wq;不行就 :q! |
💡 万能排查三步:
- 是不是打错了?用
Tab补全验证命令和路径。- 是不是没权限?
ls -l看 ugo,加sudo试试。- 是不是网络/服务问题?
ping→ss -lnutp→systemctl status。
附录C 学习路线与下一步
C.1 学完本书,你已经拥有了什么
| 能力 | 对应章节 |
|---|---|
| 独立登录、远程连接 Linux | 第 6 章 |
看懂命令格式,会用 --help 和 man 自己查 |
第 8 章 |
| 会四处走动、会增删改查文件和目录 | 第 9–18 章 |
| 会用 vim 改配置文件(这可是运维的日常) | 第 19–21 章 |
| 会建用户、配权限、用 sudo | 第 22–33 章 |
| 会装软件、配 yum 源、压缩解压 | 第 34–39 章 |
| 会给服务器加新硬盘并挂载 | 第 40–44 章 |
| 会看系统状态、找进程、排查网络 | 第 47–51 章 |
| 会用 grep/sed/awk 处理日志 | 第 52–55 章 |
| 会开服务、配网络、设防火墙 | 第 56–59 章 |
C.2 下一步学什么(按推荐顺序)
| 顺序 | 主题 | 为什么先学它 |
|---|---|---|
| 1 | Shell 脚本编程 | 把重复的命令写成脚本,是"从会用变高效"的分水岭 |
| 2 | 计划任务(crontab、at) |
定时备份、定时清理,运维必备 |
| 3 | SSH 免密与安全加固 | 生产环境第一课 |
| 4 | 常见服务部署(Nginx、MySQL、Redis) | 把前面的知识用起来 |
| 5 | 日志分析(结合 grep/sed/awk) | 真正解决故障靠日志 |
| 6 | Docker / 容器 | 现在的部署标准 |
| 7 | 监控告警(Zabbix、Prometheus) | 从"出了问题再修"到"提前发现" |
| 8 | 自动化(Ansible) | 管 1 台和管 100 台的区别 |
| 9 | Kubernetes | 云原生方向必备 |
| 10 | 安全加固与等保 | 做运维迟早要面对 |
C.3 三个建议,帮你别停下
- 给自己找一个真任务。 比如:用一台虚拟机搭一个能访问的个人主页;给家里的旧电脑装个 Linux 当下载机。有目标,学得下去。
- 养成记笔记的习惯。 只记两样:你不会的、和你踩过的坑。半年后这本笔记比任何教程都值钱。
- 别只看,一定要敲。 看视频觉得"我会了",一上手全忘——这是所有人的通病。动手是唯一出路。
C.4 推荐的学习资料
| 类型 | 推荐 |
|---|---|
| 官方文档 | man 命令(最权威,就在你机器上) |
| 命令速查 | tldr 工具(比 man 简洁,能直接装) |
| 中文社区 | 阿里云/腾讯云开发者社区、博客园、CSDN 的实操类文章 |
| 系统学习 | 各发行版官方文档(Ubuntu Docs、Red Hat Documentation) |
| 刷题验证 | 自己搭环境做实验,比任何题库都有用 |
附录D 原始文档整理说明(勘误)
本教程由三份原始课堂笔记整理而成:
Linux命令基础.md(1446 行)Linux简介 - 副本.md(1274 行)Linux基础 - 副本.md(55 行)
整理时做了四类工作:重排结构、补全讲解、统一术语、修正错误。下面列出发现的主要问题,方便你对照原文档核对。
D.1 原文的错误与笔误
| # | 原文位置 | 原文 | 问题 | 本文改为 |
|---|---|---|---|---|
| 1 | Linux基础 - 副本.md 第 7 行 |
「侠义上讲」 | 错别字 | 「狭义上讲」 |
| 2 | Linux命令基础.md 第 419 行 |
yum install makecache |
命令写错,会把 makecache 当包名去安装 |
yum makecache |
| 3 | Linux命令基础.md 第 648 行 |
setfac -b file |
命令名少个 l |
setfacl -b file |
| 4 | Linux命令基础.md 第 1219 行 |
ifconifg |
拼写错误 | ifconfig |
| 5 | Linux命令基础.md 第 724 行 |
bzip file / bzip -d |
命令名错误(应为 bzip2) | bzip2 file / bzip2 -d |
| 6 | Linux简介 - 副本.md 第 729–730 行 |
gz 文件 / gz -d |
命令名错误 | gzip 文件 / gzip -d |
| 7 | Linux简介 - 副本.md 第 844 行 |
「nfs windows默认文件系统」 | 事实错误:Windows 默认文件系统是 NTFS/FAT32/exFAT,NFS 是 Linux 的网络文件系统 | 改为「NTFS / FAT32 / exFAT」 |
| 8 | Linux命令基础.md 第 1108 行 |
sed -i ”2,9p“ 文件 |
用了中文全角引号,会直接报错;且 p 模式应配 -n |
改为半角引号,并说明 -n 的必要性 |
| 9 | Linux命令基础.md 第 1132 行 |
「安装顺序依次执行」 | 错别字 | 「按顺序依次执行」 |
| 10 | Linux命令基础.md 第 498 行 |
「将用户家目录(慎用)个邮件池删除」 | 错别字/病句 | 「家目录和邮件池一并删除」 |
| 11 | Linux命令基础.md 第 1010 行 |
RAID 1「可用容量为总容量的 n/1」 | 写反了 | 「1/n」(n 块盘只用 1 块的容量) |
| 12 | Linux命令基础.md 第 1175 行 |
? 「匹配0或1次,非贪婪模式」 |
概念混淆:? 是"0 或 1 次";"非贪婪"是在数量词后再加 ? |
分开讲清 |
| 13 | Linux命令基础.md 第 1167–1169 行 |
\w \d \W \s 被当作通用元字符,且 \w 解释为「匹配任意字符」 |
① \w 的含义是"字母/数字/下划线",不是"任意字符";② GNU grep 的 -E 里 \w \W \s \S 属于 GNU 扩展,能用但不可移植;③ \d/\D 在 -E 里并不支持,要加 -P |
第 55 章统一改教 [0-9]、[a-zA-Z] 这类哪种环境都能用的写法,并注明 GNU 方言的差异 |
| 14 | Linux命令基础.md 第 1149 行 |
$1~$n 表示列第1列到第N列 |
awk 没有这种语法,会误导 | 删除,改为逐个说明 $1 $2 $NF |
| 15 | Linux命令基础.md 第 570 行 |
chmod 700 dir # 锁定目录,只有属主才能读写文件 |
表述不准:目录的 r/w/x 含义与文件不同 | 第 25 章单列"rwx 对目录的含义" |
| 16 | Linux命令基础.md 第 150 行 |
「查看系统内核版本 Linux 7.2」 | 示例内核是 3.10.0-1160.el7,属于 CentOS 7,不是所谓"Linux 7.2" |
改为按实际内核版本号解释 |
| 17 | Linux命令基础.md 第 963 行 |
mount /dev/vg1/lv1 |
缺挂载点参数 | 补成 mount /dev/vg1/lv1 /mnt/data |
| 18 | Linux命令基础.md 第 1347 行 |
firewalld「底层仍调用 iptables」 | 过时:CentOS 8+/新版 firewalld 默认后端是 nftables | 改为「底层是 iptables 或 nftables」 |
| 19 | Linux命令基础.md 第 651 行 |
%minsudev ALL=... |
组名疑似拼写错误 | 本文改用通行的 %wheel 示例 |
| 20 | Linux命令基础.md 第 1421–1424 行 |
只放行 tcp 53 |
DNS 还需要 udp 53,只放 tcp 会导致解析异常 |
补充 udp 说明 |
| 21 | Linux命令基础.md 第 44 行 |
提示符写成 [ root@localhost ~ ]# |
方括号内多了空格,和真实提示符不一致 | 统一为 [root@localhost ~]# |
| 22 | Linux简介 - 副本.md 第 111 行 |
–-all |
用了长横线(en dash)而不是两个连字符,照着敲必然报错 | 改为 --all |
| 23 | Linux命令基础.md 第 284 行 |
ESC键:wq 文件名 # 另存为 |
说错了::wq 文件名 是"写入该文件并退出";另存为是 :w 文件名 |
改正并区分两者 |
| 24 | Linux命令基础.md 第 84–86 行 |
/sys 说成"运行时产生的缓存数据(关机则消失)"、/proc 说成"启动后加载的内核数据" |
二者是内核提供的虚拟文件系统(sysfs、procfs),不占磁盘、由内核实时生成,既不是"缓存"也不是"加载的数据" | 第 9 章按虚拟文件系统解释 |
| 25 | Linux命令基础.md 第 154 行 |
把 uname -a 的版本串拆成"主版本.次版本.修补次数.系统信息.架构" |
拆法不准确,容易误导 | 第 47 章只讲"3.10.0 是内核版本",不硬拆 |
| 26 | Linux命令基础.md 第 350 行 |
「p 粘贴、np 重复复制 n 次、可以剪切 dd 删除的内容」 |
表述混乱:np 是重复粘贴 n 次;dd 是剪切、p 是粘贴,不是"复制" |
第 21 章重新表述 |
| 27 | Linux命令基础.md 第 122、243 行 |
rm *、cp * /newPath |
未提醒:复制目录要加 -r;* 匹配不到隐藏文件;rm 没有回收站 |
第 13、16 章补警告 |
| 28 | Linux简介 - 副本.md 第 766 行 |
nginx-1.31.0.tar.gz |
该版本号不存在,照着下载会 404 | 改用真实版本,并注明"版本号以官网为准" |
| 29 | Linux简介 - 副本.md 第 770 行 |
编译依赖未含 pcre-devel |
少了它 ./configure 会在 rewrite 模块处报错 |
第 38 章补进依赖列表 |
| 30 | Linux命令基础.md 第 930–939 行 |
LVM 扩容前先 umount |
多余:ext4 支持在线扩容,不必先卸载 | 第 45 章改为不停机扩容 |
| 31 | Linux命令基础.md 第 765 行 |
「GPT 支持 128 个分区」写作「128 个主分区」 | GPT 就是 128 个分区,没有主分区/扩展分区之分 | 第 41 章改正措辞 |
| 32 | Linux命令基础.md 第 771 行 |
btyes、GTP |
错别字:应为 bytes、GPT |
已改正 |
| 33 | Linux命令基础.md 第 1380、1389、1292 行 |
iptable、—F(破折号)、is-enable |
命令名/选项/子命令拼写错误 | 改为 iptables、-F、is-enabled |
| 34 | Linux命令基础.md 第 1227–1235 行 |
ifcfg 示例缺 BOOTPROTO=none |
少了它有的机器会退回 DHCP,手工配的 IP 不生效 | 第 57 章补上并说明含义 |
D.2 结构问题(已重排)
| 问题 | 本教程的处理 |
|---|---|
| 三份文档内容大量重叠(用户/权限/UGO/ACL/sudo/rpm/yum/压缩/磁盘/LVM/RAID/find/grep/sed/awk 各出现两次) | 合并去重,每个知识点只讲一次 |
| 同一知识点两处写法/示例冲突(如 sudoers 授权示例) | 统一为一个标准示例 |
| 概念、命令、运维实践混在一起,没有先后 | 重排为 10 篇:认识 → 走进 → 文件 → 编辑 → 权限 → 软件 → 磁盘 → 运维 → 文本 → 服务 |
| 章节编号中断(正文编到 23 后突然出现无编号的「Linux网络基础」「Linux服务管理」) | 全篇统一编号:59 章 |
标题层级混乱(### 6.VI编辑器 出现在第 5 节下面) |
统一为 ## 章、### 节 |
| 大量命令只列语法不给示例、不给预期输出 | 每条命令都配示例和 # 你会看到: |
| 危险命令没有统一警示 | 统一用 > ⚠️ **注意** 标注后果 |
| 缺少"看不懂怎么办""装环境""怎么排错"的入门内容 | 新增前言、第 6 章、附录 B |
D.2.1 为"零基础"有意做的简化(不是漏写)
| 原文档有 | 本教程的处理 | 为什么 |
|---|---|---|
LVM 缩容完整步骤、pvmove/vgreduce |
只在第 45 章讲扩容,缩容改为一句话警告 | 缩容有丢数据风险,且 xfs 根本不支持缩容;零基础第一遍不该碰 |
RAID 用 mdadm 实操建阵列 |
只讲原理和对比表 | 建 RAID 需要在虚拟机里加多块盘,入门阶段收益低 |
| 源码编译安装的模块参数 | 只给"下载→解压→configure→make→make install"五步 | 参数一多,新手就卡在报错上 |
| iptables 完整规则集(含 NAT、限速) | 只讲 filter 表 + INPUT 链 | 其余场景入门阶段用不到 |
%s###g、sed 高级模式、awk 脚本编程 |
只讲最常用的 s/d/p 和按列取数 |
先能干活,再谈精通 |
💡 一句话:进阶内容不是删掉,是藏起来了。等你把 🔰 章节用熟了,再回原文档翻这些细节,会轻松很多。
D.3 无法访问的资源(已移除)
| 位置 | 内容 | 处理 |
|---|---|---|
Linux命令基础.md 第 892 行 |
https://img-blog.csdnimg.cn/...lvm....png |
外链图片,改为文字描述 |
Linux命令基础.md 第 903 行 |
D:\Code\img\img\image-20261014101157308.png |
本地绝对路径,别人电脑上必然打不开,已删除 |
Linux命令基础.md 第 1006–1028 行 |
4 张 RAID 外链图 | 改为文字 + 对比表 |
Linux简介 - 副本.md 第 309 行 |
D:\Code\img\img\Linux文件查看与重定向技能.png |
本地绝对路径,已删除 |
D.4 时效性提示
| 内容 | 情况 | 建议 |
|---|---|---|
| CentOS 8 | 已于 2021 年底停止维护(EOL) | 新项目别用 |
| CentOS 7 | 已于 2024 年 6 月 30 日 EOL | 存量服务器仍在用,学习可用;新项目建议 Rocky Linux 9 / AlmaLinux 9 / Ubuntu 22.04 LTS |
| Ubuntu 20.04 | 2025 年 5 月结束标准支持 | 新装建议 22.04 或 24.04 LTS |
| 本书示例 | 以 CentOS 7 为准 | 换系统后主要改两处:装软件(yum → apt)和配网络(ifcfg → netplan) |
💡 一句话总结原文档:内容其实很扎实、覆盖面很全,问题不在"讲少了",而在"没考虑看的人是零基础"——缺过渡、缺解释、缺示例、缺排错。这一版补的就是这些。
结语
到这里,这本书就结束了。
Linux 不难,难的是第一次面对一个黑漆漆的终端时,不知道从哪下手。你已经走过了这一段——你现在知道 ls 在哪、知道报错怎么读、知道权限不上去该改哪里。
剩下的路就是多用。用得越多,那些命令就越不像"要背的东西",而像"顺手的工具"。
祝你早日敲出那句属于你自己的 It works!。