RHCSA9课堂笔记一
1 | 作者:李晓辉 |
第一章 红帽企业 Linux ⼊⻔
🎯 为什么必须了解 Linux?
Linux 是 IT 专业人士不可或缺的核心技能,原因如下:
🌍 全球广泛应用,触手可及
- 互联网用户每天都在与 Linux 打交道:从访问网站、使用电商平台,到后台服务器运行
- Linux 不仅支撑互联网,还广泛应用于销售点系统、全球股票市场、智能电视与机上娱乐系统
📈 世界前 500 强超级计算机中,超过 90% 运行 Linux
☁️ 云原生与现代架构的基石
- Linux 是推动云计算革命的核心技术
- 构建容器化微服务、软件定义存储、大数据解决方案的首选平台
- 私有云、公有云实例几乎都以 Linux 为操作系统
🧱 Kubernetes、Docker、OpenStack 等关键技术均基于 Linux 构建
💼 职业发展与技能需求
- Linux 与 Windows 并列为现代数据中心的主流操作系统
- 企业、云平台、嵌入式设备对 Linux 的需求持续增长
- 掌握 Linux 能力,意味着更高的就业竞争力与职业拓展空间
💡 Linux 技能是进入 DevOps、云原生、系统架构等高薪岗位的通行证
🔄 跨平台互操作与开发托管
- Windows 用户需与 Linux 系统进行互操作
- 应用开发常以 Linux 为运行环境与部署平台
- 移动应用与物联网设备也多运行于 Linux 内核
🌟 Linux 的核心优势
Linux 作为企业级与开发者首选的操作系统,具备以下显著优点:
1️⃣ 开源驱动创新
Linux 是开源软件,意味着你可以:
- 深入了解系统的工作机制
- 自由修改源代码以满足个性化需求
- 快速迭代与创新,推动技术演进
💡 适合研发人员、系统架构师进行深度定制与优化
2️⃣ 强大的命令行接口(CLI)
Linux 提供高效的命令行环境,具备:
- 快速访问与操作系统资源的能力
- 强大的脚本化支持(如 Bash),可实现自动化任务
- 适合 DevOps、运维工程师进行批量管理与部署
🛠️ CLI 是提升效率与掌控力的利器
3️⃣ 模块化设计,灵活可控
Linux 采用模块化架构,具备以下优势:
- 系统组件可按需替换、删除或升级
- 支持轻量化部署与定制化构建
- 易于维护与扩展,适合容器化与云原生场景
🔧 模块化是构建高可用系统的基础
🧩 什么是开源软件?
开源软件(Open Source Software)是指任何人都可以使用、研究、修改和共享其源代码的软件。
🔍 源代码是什么?
- 源代码是一组人类可读的指令,用于编写程序
- 可被解释为脚本,或编译为计算机可执行的二进制文件
- 创建后受版权保护,使用需遵循软件许可协议
🔐 开源 vs 闭源:许可机制对比
| 类型 | 权限范围 | 源代码访问 | 修改与分发 | 商业用途 |
|---|---|---|---|---|
| 闭源软件 | 受限 | 不公开或有限 | 禁止或受限 | 受限 |
| 开源软件 | 开放 | 完全公开 | 允许修改与再分发 | 可商业化 |
📜 开源许可证(如 GPL、MIT、Apache)赋予用户运行、查看、修改和免版税分发的权利
🚀 开源的价值与优势
开源软件不仅适用于个人开发者,也广泛服务于企业级应用:
- ✅ 促进协作与创新:全球开发者共同改进与分享成果
- ✅ 支持商业运作:如红帽等企业提供开源产品的商业支持与解决方案
- ✅ 可嵌入专有产品:部分许可证允许在商业产品中复用开源代码
🎁 用户收益:为什么选择开源?
| 维度 | 收益说明 |
|---|---|
| 🧭 控制权 | 查看并改进代码,掌握软件运行机制 |
| 🎓 培训性 | 从真实代码中学习,提升实战能力 |
| 🔐 安全性 | 自主检查与修复敏感代码,无需依赖原作者 |
| 🧱 稳定性 | 即使原作者退出,代码仍可持续发展 |
📜 开源许可证的主要类型
开源软件的开发者可以通过不同的许可证方式授权其源代码的使用与分发。要被视为“开源”,许可证必须允许用户:
- 自由使用程序
- 查看源代码
- 修改与编译代码
- 分发原始或修改后的代码
开源许可证主要分为两大类:
🛡️ 公共版权许可证(Copyleft License)
核心理念:鼓励代码保持开源,确保衍生作品也必须开源。
- ✅ 修改后的代码必须继续以开源形式发布
- ✅ 有助于扩大可用的开源代码库
- 📌 常见示例:
- GNU 通用公共许可证(GPL)
- GNU 宽通用公共许可证(LGPL)
📢 适合希望推动社区共享与协作的项目
🧩 宽松式许可证(Permissive License)
核心理念:最大化代码的重用性,允许在专有项目中使用。
- ✅ 只需保留原始版权与许可声明
- ✅ 可用于任何用途,包括专有软件
- ⚠️ 风险:可能鼓励仅专有增强功能,减少社区回馈
- 📌 常见示例:
- MIT/X11 许可证
- 简化 BSD 许可证
- Apache 软件许可证 2.0
💼 适合商业项目或希望快速集成的技术栈
📊 开源许可证类型对比表
| 类别 | 核心理念 | 修改后代码要求 | 商业使用 | 常见示例 | 适用场景 |
|---|---|---|---|---|---|
| 🛡️ 公共版权许可证 | 保持代码开源,促进共享 | 必须继续开源并遵循原许可 | ✅ 支持 | GNU GPL、GNU LGPL | 社区项目、共享驱动型开发 |
| 🧩 宽松式许可证 | 提高代码可重用性,灵活集成 | 可用于专有项目,只需保留声明 | ✅ 支持 | MIT、BSD、Apache 2.0 | 商业项目、快速集成、企业开发 |
👥 开源软件由谁开发?
现代开源开发已高度专业化,不再仅依赖志愿者:
🏢 企业主导,专业驱动
- 多数开源开发者由企业雇佣,专职参与项目开发
- 企业通过开源项目构建自身产品所需的增强功能
- 开源成为企业技术战略的重要组成部分
💼 如 Red Hat、Google、Microsoft 等均积极参与开源社区
🤝 志愿者与学术团体仍具影响力
- 在新兴技术领域,志愿者与高校研究者贡献突出
- 正式与非正式开发者共同构建一个高效、动态的协作生态
🌱 开源社区融合多元角色,推动技术持续演进
🐧 什么是 Linux 发行版?
Linux 发行版是一个可安装的完整操作系统,由 Linux 内核与用户空间程序组成。
🧠 Linux 内核的起源与演进
- 1991 年,Linus Torvalds 开发了类 Unix 内核 Linux
- 采用 GPL 开源协议,允许自由使用与修改
- 内核负责硬件管理、内存调度与程序运行
🔧 Linux 内核 + GNU 工具 + 图形平台 = 完整操作系统
🧩 发行版的构成与功能
- 包含 Linux 内核与支持程序(如 Shell、图形界面、网络服务)
- 可小型化用于嵌入式设备,也可包含数千个开源组件
- 提供统一的安装、更新与管理机制
- 发行版厂商通常也参与社区开发并提供技术支持
📦 常见发行版包括 Ubuntu、CentOS、Debian、Fedora、Red Hat Enterprise Linux 等
⚙️ 发行版的诞生背景
- 早期用户需手动组装各组件,部署复杂
- 发行版解决了集成难题,提供预构建、测试好的系统包
- 降低了 Linux 的使用门槛,推动其广泛普及
📌 Linux 发行版的共同特征
| 特征维度 | 说明 |
|---|---|
| 核心组成 | 包含 Linux 内核与用户空间程序 |
| 规模灵活 | 可为单一用途定制,也可包含大量组件 |
| 软件管理方式 | 提供统一的安装与更新机制 |
| 社区参与 | 发行版厂商通常参与开发并提供支持 |
🏗️ 红帽企业 Linux 生态系统概览
红帽企业 Linux(RHEL)生态系统由多个关键组件构成,形成了从社区开发到企业级发布的完整链路:

🧪 Fedora:创新孵化器
- 由社区驱动,免费、完整的 Linux 操作系统
- 用于测试和验证新技术与功能
- 不提供商业支持,Bug 较多,适合开发者尝鲜
🔬 Fedora 是新技术的实验平台,为 RHEL 提供源头创新
📦 EPEL:企业扩展包仓库
- 由 Fedora 特别兴趣小组(SIG)维护
- 名为 Extra Packages for Enterprise Linux
- 提供 RHEL 默认未包含的额外软件包
🧰 EPEL 是 RHEL 用户获取社区软件的桥梁
🔄 CentOS Stream:RHEL 的上游预览
- 介于 Fedora 与 RHEL 之间的中间层
- Fedora 测试通过的软件提交至 CentOS Stream
- CentOS Stream 稳定后再进入 RHEL
- 不提供商业支持,适合开发者提前适配 RHEL 变更
🧬 CentOS Stream 是 RHEL 的“开发快照”,用于预览与反馈
🏢 RHEL:企业级生产环境首选
- 红帽官方发布的稳定、受支持的 Linux 发行版
- 提供硬件与软件认证、技术支持、培训与维护保障
- 拥有庞大的合作伙伴生态系统,适用于关键业务场景
🛡️ RHEL 是企业部署 Linux 的标准选择,支持长期维护与安全保障
所以RHEL的由来关系是: fedora—> CentOS Stream—> RHEL
以上三者之间的区别如下所示:

🧭 基于 RHEL 的边缘环境优化镜像
红帽提供了一系列专为边缘场景设计的产品与服务,核心能力包括:
🛠️ RHEL 镜像构建器(Image Builder)
- 支持创建定制化的 RHEL 操作系统镜像
- 可快速部署至边缘架构,如零售终端、远程设备、IoT 网关等
- 支持生命周期内的持续构建、更新与维护
⚙️ 镜像部署可针对具体边缘场景进行裁剪与优化
🔐 边缘功能优势
- 零接触式配置(Zero-touch provisioning)
- 系统健康状态可视化
- 单一界面快速完成安全修复与扩展管理
📦 提升边缘设备的安全性、可控性与运维效率
🐧 红帽企业 Linux CoreOS(RHCOS)
RHCOS 是红帽 OpenShift 容器平台(RHOCP)的一部分,专为云原生应用设计:
- 基于 RHEL 组件构建,不是独立操作系统
- 作为容器主机运行于 OpenShift 节点
- 使用符合 CRI-O 规范的容器运行时引擎
- 由 OpenShift 平台统一发布、升级与管理
🧬 RHCOS 是 OpenShift 的底层支撑,适用于大规模容器集群部署
📦 红帽通用基础镜像(UBI)
UBI 是 RHEL 的自由再发行衍生产品,专为容器化应用设计:
🔧 核心特性
- 包含 RHEL 子集的软件包,源自官方安全渠道
- 可在 RHEL 主机与 OpenShift 平台上运行
- 享有与 RHEL 类似的支持服务
🧱 镜像组成
- 一组基础镜像(Minimal/Base)
- 一组应用镜像(如 Python、Node.js、Ruby、httpd、nginx)
- 一组 RPM 仓库,用于扩展依赖包
🚀 UBI 让开发者专注于应用构建,简化容器镜像开发流程
操作系统下载
| 产品/资源 | 获取方式 | 说明 |
|---|---|---|
| Fedora Linux | fedoraproject.org | 社区驱动的免费发行版,包括 Fedora CoreOS |
| EPEL / EPEL Next | EPEL 文档 | 提供 RHEL 默认未包含的额外软件包 |
| CentOS Stream | centos.org/centos-stream | RHEL 的上游版本,适合开发者提前适配 |
📦 以上资源均可免费使用,适合学习与非生产环境测试
开发者下载红帽系统可能需要有开发者订阅,此订阅是免费注册的,具体链接如下:
RHEL 开发者订阅注册:https://developers.redhat.com/register
RHEL 下载链接:https://access.redhat.com/downloads/content/rhel
🧱 RHEL 10 的镜像模式:容器原生的系统部署方式
红帽企业 Linux 10 引入了镜像模式(Image Mode),这是一种基于容器原生工具的新型操作系统部署与管理方式。
🚀 核心理念:操作系统即镜像
- 使用容器原生工具构建、部署和管理操作系统
- 通过**可启动容器镜像(bootc)**完成系统部署
- 支持将构建好的镜像推送至镜像仓库,实现集中管理与分发
📦 bootc 镜像是可直接启动的系统镜像,适用于边缘设备与云原生场景
🧰 镜像构建流程
- 选择 RHEL 组件与所需软件包
- 使用镜像构建器工具生成 bootc 镜像
- 推送至镜像仓库(如 Quay、Red Hat Registry)
- 在目标设备上拉取并部署镜像
🧪 镜像可预集成依赖项,实现“即部署即运行”的体验
🌐 镜像模式的优势
| 优势维度 | 说明 |
|---|---|
| 🔒 限制基础架构偏移 | 保持一致性,避免环境漂移 |
| 📈 增强可扩展性 | 支持大规模边缘设备部署 |
| 🛠️ 简化故障排除 | 镜像可回滚、重建,提升运维效率 |
💡 镜像模式是 RHEL 向云原生架构演进的重要里程碑
第二章 访问命令⾏
💻 Bash Shell 简介
在 Linux 系统中,命令行是一种基于文本的交互界面,用户通过它向系统输入指令。命令行由名为 Shell 的程序提供支持。
🧠 什么是 Shell?
- Shell 是用户与操作系统之间的桥梁
- 接收用户输入的命令并将其传递给系统执行
- 多年来发展出多种 Shell 变体,如:
sh、bash、zsh、csh等 - 每位用户可以选择不同的 Shell,但红帽建议使用默认 Shell 进行系统管理
🧭 Shell 是 Linux 运维与自动化的核心工具
🐚 Bash:红帽默认 Shell
- RHEL 默认提供的 Shell 是 GNU Bourne-Again Shell(Bash)
- Bash 是 UNIX 原始 Bourne Shell(
sh)的增强版本 - 支持命令历史、自动补全、脚本编写等高级功能
- 广泛用于系统管理、脚本自动化与认证考试中
💡 Shell 提示符(Prompt)
当 Shell 等待用户输入时,会显示一个提示符字符串:
- 普通用户的提示符通常以美元符号
$结尾 - 超级用户(root)的提示符则以井号
#结尾
示例:
1 | [lixiaohui@host1 ~]$ |
🔐 提示符不仅反映身份,还影响命令权限与系统安全
🧩 Shell 命令的基本结构
在 Shell 提示符下输入的命令通常由三个基本部分组成:
1️⃣ 命令(Command)
- 要执行的程序名称
- 是整个指令的核心动作
- 例如:
ls、cp、mkdir、yum、systemctl
2️⃣ 选项(Option)
- 用于调整命令的行为或功能
- 通常以一个或两个破折号开头:
- 单字符选项:
-a、-l - 多字符选项:
--all、--help
- 单字符选项:
- 可组合使用,如:
ls -al
3️⃣ 参数(Argument)
- 命令的目标对象,如文件名、路径、服务名等
- 指定命令作用的具体位置或对象
- 例如:
ls /etc、cp file.txt /tmp/
📌 示例解析
1 | ls -l /home/xiaohui |
| 部分 | 内容 | 说明 |
|---|---|---|
| 命令 | ls | 列出目录内容 |
| 选项 | -l | 以长格式显示文件信息 |
| 参数 | /home/xiaohui | 指定要查看的目录路径 |
🧠 掌握命令结构是学习 Bash 的第一步,也是 RHCSA 实操题的基础
🔐 登录本地系统:从终端到图形界面
在 Linux 中,登录系统是获取 Shell 提示符并开始操作的第一步。根据环境不同,登录方式也有所差异。
💻 终端与控制台基础
- 终端是一个基于文本的界面,用于输入命令与查看输出
- 物理控制台指直接连接键盘与显示器的本地设备
- 支持多个虚拟控制台(tty),每个 tty 都可运行独立终端与登录会话
🔄 使用
Ctrl + Alt + F1 ~ F6可在 tty1 到 tty6 之间切换
🧑💻 文本登录流程
- 在虚拟控制台中,系统提供文本登录提示符
- 输入正确的用户名与密码后,即可登录并获得 Shell 提示符
- 普通用户提示符以
$结尾,root 用户以#结尾
🖼️ 图形环境登录
- 图形界面也运行在虚拟控制台上,通常位于
tty1 - 登录图形环境后,可通过终端程序获取命令行提示符
- 图形会话可能占用
tty2或下一个空闲 tty,具体取决于当前会话状态
📌 图形登录屏幕始终运行在
tty1,注销后会自动切回该界面
⚙️ 管理员实践建议
- 系统管理员通常不在服务器上启用图形环境,以节省资源
- 图形界面占用较多 CPU 与内存,不适合生产环境中的服务器负载
🧭 无外设服务器的远程登录方式
在数据中心中,许多服务器不连接键盘与显示器,称为无外设服务器(headless server):
| 登录方式 | 场景说明 |
|---|---|
| 🔌 串行控制台 | 通过串口连接至网络控制台服务器,适用于网卡故障或无网络连接时 |
| 🌐 远程桌面协议(RDP) | 在目标服务器上运行图形界面,适用于远程图形访问 |
| 🧠 SSH 登录 | 最常见的远程文本登录方式,适用于大多数运维场景 |
🛠️ 串行控制台是故障排查与紧急访问的重要手段
🌐 登录远程系统:通过 SSH 获取 Shell 访问权限
在现代计算环境中,Linux 用户与管理员常常需要通过网络连接远程系统,以获取命令行访问权限。
🧠 为什么需要远程登录?
- 许多服务器是虚拟机或云实例,无法直接连接键盘与显示器
- 公共云与私有云中的实例通常不提供物理控制台或串口访问
- 运维人员需远程管理这些系统,执行命令、部署服务或排查故障
🧭 远程登录是现代 DevOps 与云运维的基础技能
🔐 SSH:远程登录的标准方式
- SSH(Secure Shell) 是一种加密的远程连接协议
- 提供安全的命令行访问,支持身份验证与数据加密
- 大多数 Linux 系统(包括 RHEL)和 macOS 都内置 OpenSSH 客户端程序
ssh
📌 SSH 登录示例
假设当前用户在本地主机(host1)上,使用 lixiaohui 用户身份登录远程 Linux 系统 host1:
1 | [lixiaohui@host1 ~]$ ssh lixiaohui@host2 |
| 部分 | 说明 |
|---|---|
ssh | 命令名称,表示使用 SSH 协议连接远程系统 |
lixiaohui | 登录远程系统的用户名 |
host1 | 远程系统的主机名或 IP 地址 |
🔒 登录后将获得远程系统的 Shell 提示符,可执行命令与脚本
在第一次连接陌生的机器时,会提示你 yes/no,如果确认机器无误,输入yes回车即可连接,任务完毕后,输入 exit 退出SSH会话
SSH(Secure Shell)通过加密连接防止通信被窃听或密码被劫持。在现代云环境中,许多系统(如新建云实例)禁止使用密码登录,改为使用更安全的公钥身份验证。
🔐 SSH 公钥身份验证简介
SSH(Secure Shell)通过加密连接防止通信被窃听或密码被劫持。在现代云环境中,许多系统(如新建云实例)禁止使用密码登录,改为使用更安全的公钥身份验证。
🧠 公钥身份验证的原理
- 用户拥有一个包含私钥的身份文件,相当于保密的密码
- 远程服务器上的账户配置了与之匹配的公钥,该公钥不需要保密
- 登录时,系统使用私钥与公钥进行匹配验证,无需输入密码
🛡️ 公钥身份验证提升了远程登录的安全性与自动化能力
📌 SSH 公钥登录示例
假设用户在本地主机 host1 上,使用 lixiaohui 用户身份,通过私钥文件 secret.pem 登录远程系统:
1 | [lixiaohui@host1 ~]$ ssh -i secret.pem lixiaohui@host2 |
| 部分 | 说明 |
|---|---|
ssh | 使用 SSH 协议连接远程系统 |
-i secret.pem | 指定私钥文件路径 |
lixiaohui@host1 | 登录的远程用户名与主机名 |
🔑 前提是远程系统的
lixiaohui账户已配置匹配的公钥(通常存放于~/.ssh/authorized_keys)
Bash 基本技巧
如上所述,Bash 一般分为 命令+选项+参数 输入完毕后回车即可执行单个命令
多个命令连接
在 Bash Shell 中,可以使用**分号(;)**将多个命令写在同一行中依次执行。
🧠 分号的作用
- 分号是 Bash 中的元字符(metacharacter),具有特殊语法含义
- 用于将多个命令分隔开,使它们按顺序依次执行
- 每个命令都会被独立执行,彼此之间不影响返回值判断
📌 示例
以下案例中,ls /home是列出/home的内容,echo hello是在屏幕中输出hello字符串,用分号 ; 连接在一起,可以一起执行
1 | [lixiaohui@host1 ~]$ ls /home; echo hello |
执行效果:
1 | lixiaohui readme.txt |
🧪 系统会依次执行
echo和date,并分别输出结果,然后返回新的 Shell 提示符
⚠️ 注意事项
- 分号后必须有空格,以避免与命令名混淆
- 分号不会判断前一个命令是否成功,始终执行后续命令
- 若需在前一个命令成功时才执行下一个命令,请使用
&&(逻辑与)
🔁 对比:; vs &&
| 运算符 | 含义 | 示例 | 执行条件 |
|---|---|---|---|
; | 顺序执行所有命令 | cmd1; cmd2 | 始终执行 cmd2 |
&& | 仅当前一个命令成功时执行 | cmd1 && cmd2 | cmd1 成功才执行 cmd2 |
获取时间
我们注意到不同的选项有不同的结果
1 | [lixiaohui@host1 ~]$ date |
更改用户的密码
普通用户改自己的密码需要输入当前密码才可以改,而且普通用户无法给别人改密码
超级用户root可以给别人改密码,且不需要当前密码
1 | [lixiaohui@host1 ~]$ passwd |
1 | [lixiaohui@host1 ~]$ su - root |
识别文件类型
在 Linux 中,文件类型的识别不依赖扩展名,而是通过内容分析实现。这与 Windows 等系统的扩展名识别方式不同。
🧠 文件扩展名不是关键
- Linux 文件系统允许任何文件使用任意扩展名,甚至没有扩展名
- 文件的实际类型由系统根据内容判断,而非文件名后缀
🧭 这使得 Linux 更灵活,但也要求用户具备基本的文件识别能力
🔍 使用 file 命令识别文件类型
file命令会扫描文件的编译标头信息,尤其是其中2位的的 magic number(魔数)- 魔数是文件开头的特定字节序列,用于标识文件类型
- 对于文本文件,因未编译,
file命令会识别为 “ASCII text” 或 “UTF-8 text”等类型
📌 示例
1 | file script.sh |
输出可能为:
1 | script.sh: Bourne-Again shell script, ASCII text executable |
🔧 即使文件没有
.sh扩展名,系统仍能识别其为 Shell 脚本
1 | [lixiaohui@host1 ~]$ file /etc/passwd |
📖 查看文件内容
cat more less head tail 等命令可以用来查看文件内容
- cat 用于全文输出,通常用于小型文件, 命令后可以跟多个文件用于一起输出
1 | [lixiaohui@host1 ~]$ cat /readme.txt /mnt/test.txt |
- 文件较长时就不推荐用cat了,less 命令⼀次显⽰⽂件的⼀个⻚⾯,可以按上下键一行一行查看,也可以按下up和down键来一页一页查看,按q结束查看
1 | [lixiaohui@host1 ~]$ less /etc/passwd |
- head 和 tail 命令分别显⽰⽂件的开头和结尾部分。默认情况下,这两个命令显⽰⽂件的 10 ⾏,但它们都有⼀个 -n 选项,允许指定不同的⾏数。
查看文件开头的10行或2行
1 | [lixiaohui@host1 ~]$ head /etc/passwd |
查看文件结尾的10行或2行
1 | [lixiaohui@host1 ~]$ tail /etc/passwd |
| 命令 | 功能说明 | 示例 |
|---|---|---|
cat | 全文输出,适合小型文件,可合并多个文件 | cat file1 file2 |
less | 分页查看,支持上下滚动与搜索,适合大型文件 | less /etc/passwd |
head | 查看文件开头部分,默认显示前 10 行,可用 -n 指定行数 | head -n 5 file.txt |
tail | 查看文件结尾部分,默认显示后 10 行,可用 -n 指定行数 | tail -n 5 file.txt |
📊 统计文件信息
wc(word count)命令用于统计文件中的行数、单词数与字符数:
1 | wc /etc/passwd # 显示行、词、字符总数 |
Tab 补全
Tab 补全是 Bash 提供的高效输入辅助功能,适用于命令、参数与路径补齐。
🧠 命令补齐
- 输入命令前缀后按一次 Tab:若唯一匹配,则自动补齐
- 输入命令前缀后按两次 Tab:显示所有可能匹配项
命令和参数补齐
1 | [lixiaohui@host1 ~]$ pasTab+Tab # 手工输入了pas字符串,并快速按下两次TAB键,会自动找出所有以pas开头的命令,结果有多个匹配 |
1 | [root@host ~]# useradd --Tab+Tab ## 手工输入useradd --后快速按下两次TAB,可以用于补齐参数 |
路径补齐
Tab 补全可以帮助在键⼊⽂件名作为命令的参数时将它们补全。按 Tab,尽可能将⽂件名补充完整。
1 | [user@host ~]$ ls /etc/pasTab # 手工输入了/etc/pas字符串,并快速按下一次TAB键,就会自动补齐/etc/passwd |
🔄 使用反斜杠 \ 拆分长命令
在 Bash 中,具有多个选项和参数的命令可能会变得冗长、不易阅读。为提升可读性与可维护性,可以使用**反斜杠(\)**将命令拆分为多行。
🧠 什么是反斜杠?
\是 Bash 中的转义字符- 用于告诉 Shell:当前命令尚未结束,下一行是其延续
- 拆分后的命令在逻辑上仍被视为一条完整命令
📌 示例:多文件行数统计
1 | [lixiaohui@host1 ~]$ wc -l /etc/passwd \ |
输出结果:
1 | 45 /etc/passwd |
⚠️ 注意:从第一次使用
\并回车后,Shell 会自动显示>作为命令续行提示符。无需手动输入>符号
✅ 使用反斜杠的优势
| 优点 | 说明 |
|---|---|
| 📖 提高可读性 | 将复杂命令分行书写,结构更清晰 |
| 🛠️ 便于维护 | 修改参数或路径更方便 |
| 🧪 避免输入错误 | 减少因命令过长导致的拼写或格式错误 |
🕘 操作命令历史记录
history 命令显⽰之前执⾏的命令的列表,带有命令编号作为前缀。默认提供1000条历史记录
1 | [lixiaohui@host1 ~]$ set | grep -i histsize |
1 | [lixiaohui@host1 ~]$ history |
重复调用历史输入过的命令
- 字符匹配法
这种方法会自动从history命令的输出中自下向上匹配开头的字符串是否匹配,匹配到第一个就执行
1 | [lixiaohui@host1 ~]$ !ls |
- 数字法匹配
这种方法需要你知道准确的history命令行编号
1 | [lixiaohui@host1 ~]$ !26 |
- 快捷键匹配
在bash中,按下ctrl r 后,输入的任何字符串都会从history中,自下向上匹配,如果显示的内容不符合要求,可以再多输入一些内容,它会再次匹配
以下例子中,我按下了ctrl r,然后输入了一个w字符串,它自动识别到了wc -l /etc/passwd -l /etc/fstab -l /readme.txt
1 | [lixiaohui@host1 ~]$ |
快速访问上一次参数
同时使⽤ Esc+. 或 Alt+. 组合键,在光标的当前位置插⼊上⼀命令的最后⼀个单词,Alt+. 组合键尤其⽅便,因为你可
以按住 Alt 键,再反复按 . 键来轻松地循环更早的命令。
1 | [lixiaohui@host1 ~]$ ls /etc/passwd |
⌨️ Bash 快捷键速查表
| 快捷键 | 描述 |
|---|---|
Ctrl + A | 跳到命令行开头 |
Ctrl + E | 跳到命令行末尾 |
Ctrl + U | 清除光标到行首的内容 |
Ctrl + K | 清除光标到行尾的内容 |
Ctrl + ← | 跳到前一个单词开头 |
Ctrl + → | 跳到下一个单词末尾 |
Ctrl + R | 搜索历史命令 |
第三章 在红帽企业 Linux 中获取帮助
掌握获取帮助的方式是 Linux 运维的基本技能之一,尤其在命令众多、参数复杂的环境中,快速查阅文档能显著提升效率。
🧰 常规命令帮助
许多命令内置简要帮助信息,可通过以下方式查看:
1 | [lixiaohui@host1 ~]$ useradd --help |
📌 适用于快速了解命令语法与常用选项
📖 二、Man 手册页(Manual Page)
Man 是 Linux 系统最传统的文档系统,提供详细的命令、配置文件、系统调用等说明。
📁 Man 页存储位置
- 所有 man 页存储于
/usr/share/man的子目录中 - 使用
man 命令名即可查看对应文档
📚 Man 页章节结构
| 章节 | 类型 | 描述 |
|---|---|---|
| 1 | 用户命令 | 可执行命令与 shell 程序 |
| 2 | 系统调用 | 内核例程接口 |
| 3 | 库函数 | 程序库提供的函数 |
| 4 | 特殊文件 | 设备文件等 |
| 5 | 文件格式 | 配置文件结构说明 |
| 6 | 游戏与屏保 | 趣味程序 |
| 7 | 标准与惯例 | 协议、文件系统等 |
| 8 | 系统管理命令 | 特权维护任务 |
| 9 | 内核 API | 内部内核调用接口 |
📌 使用
man 章节号 命令名可指定查看某一章节,如man 5 passwd
我们注意到,不是所有的命令都有所有的章节,而且也不一定要输入章节数字,没有数字就进入默认章节
1 | [lixiaohui@host1 ~]$ man 5 useradd |
🔍 Man 页使用技巧
| 命令 | 功能说明 |
|---|---|
| Spacebar | 向下滚动一整屏内容 |
| PageDown | 向下滚动一整屏内容 |
| PageUp | 向上滚动一整屏内容 |
| DownArrow | 向下滚动一行 |
| UpArrow | 向上滚动一行 |
| d | 向下滚动半屏 |
| u | 向上滚动半屏 |
| /string | 搜索包含指定关键字的内容 |
| n | 查找下一个匹配项(继续上一次搜索) |
| N | 查找上一个匹配项(反向继续上一次搜索) |
| q | 退出 man 手册页,返回命令行提示符 |
| Q | 同样是退出 man 手册页,功能与 q 相同 |
🔎 标题与描述搜索:man -k
在 Linux 中,man -k 命令(等同于 apropos)用于在手册页的标题与描述中搜索关键字,帮助用户快速定位相关命令或主题。
man -k会在所有 man 页的标题与简要描述中查找指定关键字- 返回结果包含:
- 匹配的命令或主题名称
- 所属章节编号(如
passwd (1)表示第 1 章) - 简要说明文本
📌 适用于不确定命令名称时的模糊搜索,如查找与 “passwd” 相关的所有命令,若
man -k无法返回结果,可能是索引未构建或已过期,可使用mandb命令更新 man 页索引数据库
1 | man -k passwd |
搜索所有包含
passwd的命令标题与描述
📄 全文搜索:man -K
除了标题与描述搜索(man -k),Bash 还支持使用 man -K 进行全文搜索,帮助用户在所有手册页内容中查找关键字。
🧠 man -K 的功能说明
man -K会在所有 man 页的完整内容中查找指定关键字- 不仅限于标题或简要描述,适合查找深入说明或配置细节
- 返回结果包含匹配的手册页文件路径与命令名
📌 适用于查找某个配置项、参数或术语出现在哪些命令文档中
⚠️ 注意事项
- 全文搜索会扫描整个 man 页数据库
- 资源消耗较大,搜索速度较慢,尤其在大型系统中
- 建议在明确目标或使用关键词较精准时使用
1 | man -K passwd |
搜索所有 man 页内容中包含
passwd的条目(较慢)
🧩 红帽订阅体系与系统注册
红帽企业 Linux(RHEL)采用基于订阅的内容交付模式,为用户提供持续的软件更新与技术支持资源。
🎯 红帽订阅的核心优势
| 优势类别 | 说明 |
|---|---|
| 📦 软件更新 | 提供安全补丁、错误修复与功能增强的软件包 |
| 🔐 内容访问 | 通过红帽 CDN 获取官方软件仓库内容 |
| 📚 技术资源 | 包括知识库、文档、实验室、智能分析与专家支持 |
| 🔄 简化管理 | 采用 SCA(简单内容访问)模式,无需每台系统单独附加订阅 |
| 🧠 智能分析集成 | 与混合云控制台集成,支持预测性问题分析与修复建议 |
🔄 SCA 模式简介(2024 起)
- SCA(Simple Content Access) 是红帽的新订阅模式
- 每个组织只需拥有有效订阅,无需在每台系统上单独附加
- 降低订阅管理复杂度,简化工具使用流程
- 客户订阅服务已迁移至 红帽混合云控制台,替代原 客户门户网站
🖥️ 注册 RHEL 系统的方式
你可以通过以下方式将系统注册到红帽订阅服务:
| 工具/方式 | 功能说明 |
|---|---|
| 🖥️ RHEL Web 控制台 | 图形化界面,适合桌面或远程管理 |
🧑💻 subscription-manager | 命令行工具,适用于传统注册流程 |
🔧 rhc 工具(推荐) | 适用于 RHEL 8.8+,支持一键注册与智能分析集成 |
📌 注册流程说明
- 注册系统:将系统与红帽账户绑定,获取唯一身份证书
- 启用存储库:自动启用默认仓库,或手动启用其他内容源
- 查看授权:在混合云控制台的 Subscription Inventory 页面查看使用情况
- 启用智能分析(可选):注册后可使用预测性分析与修复建议服务
🧑💻 使用 rhc 工具注册系统
- 适用于 RHEL 8.8 及以上版本
- 默认启用以下三项功能:
| 功能名称 | 说明 |
|---|---|
content | 访问红帽内容仓库 |
analytics | 启用智能分析服务 |
remote-management | 支持远程系统管理 |
✅ 使用
rhc工具需满足:
- 拥有有效订阅的红帽账户
- 拥有系统的 root 权限
第六章 ⽂件系统层次结构导览
Linux 文件系统遵循 FHS(Filesystem Hierarchy Standard)标准,整体结构类似一棵倒置的树:
- 根目录
/是所有路径的起点 - 所有系统文件、用户数据、设备挂载点等都在其下展开
- 每个一级目录都有明确的功能分工

📁 常见一级目录说明
| 目录 | 功能说明 |
|---|---|
/bin | 存放基本命令,如 ls、cp,所有用户可执行,系统启动必备 |
/sbin | 存放系统管理命令,仅供 root 使用,如 reboot、fdisk |
/etc | 存放系统配置文件,如 passwd、fstab、ssh 配置等 |
/home | 普通用户的主目录,如 /home/lixiaohui |
/root | 超级用户(root)的主目录 |
/boot | 存放启动相关文件,如内核镜像 vmlinuz、引导加载器配置 |
/lib /lib64 | 存放共享库文件,供 /bin 和 /sbin 中程序调用 |
/dev | 设备文件目录,Linux 中设备以文件形式访问,如 /dev/sda |
/mnt /media | 挂载点目录,临时或自动挂载外部设备(如 U 盘、光驱) |
/opt | 可选软件安装目录,第三方应用常放此处 |
/proc | 虚拟目录,映射系统内存,存放运行时内核信息,如 /proc/cpuinfo |
/sys | 与 /proc 类似,提供系统硬件信息接口 |
/usr | 用户级应用与库文件目录,如 /usr/bin、/usr/lib |
/var | 存放可变数据,如日志文件 /var/log、邮件队列等 |
/tmp | 临时文件目录,系统重启后可能清空 |
📁 绝对路径与相对路径
在 Linux 中,理解路径的概念是操作文件系统的基础。路径分为两类:绝对路径与相对路径。
🧭 绝对路径(Absolute Path)
- 从根目录
/开始,完整描述文件在系统中的位置 - 每一级目录都必须明确写出
- 不受当前工作目录影响,始终指向唯一位置
绝对路径名输入起来可能会太⻓,但是绝对有效和准确
1 | cat /etc/passwd |
📌
touch命令用于创建空白文件或更新文件时间戳
📍 相对路径(Relative Path)
- 基于当前工作目录进行定位
- 使用
.表示当前目录,..表示上一级目录 - 更简洁,适合在脚本或交互中使用
🧠 类比理解
大家先看这一段描述内容:
1 | 我是李晓辉,我来自宇宙、银河系、地球、亚洲、中国、河南省、安阳市、经纬度为xxxx |
描述准确无误,但是这是绝对路径,说起来太麻烦
大家再看这些描述
1 | 我在中国 //我不需要说我在宇宙中,因为大家已经在宇宙中了 |
1 | 你帮我从那个红色的桌子上拿一个充电宝过来 //我没有说从安阳市哪个街道哪个小区哪个楼哪个门牌号,因为我们都在这个屋子里 |
相对路径有一个基准,就是当前位置,在Linux中,当前位置用一个英文的句号来表示 . ,上一级路径用两个英文句号来表示 ..
cd 命令用于切换工作路径,cd .表示进入当前路径,cd ..进入父目录,cd - 切换回进⼊当前⽬录之前所处的⽬录,需要注意的是以点号 . 开头的文件被视为隐藏文件
1 | cd /lixiaohui/project1/test/ |
查询当前路径在系统中的绝对路径写法
1 | [lixiaohui@host1 ~]$ pwd |
第七章 从命令⾏管理⽂件
创建⽬录
1 | mkdir /lxhfolder |
mkdir -p 在父目录不存在时,直接将父目录自动创建
1 | [lixiaohui@host1 ~]$ mkdir /tmp/lixiaohui/testfolder |
复制⽂件和⽬录
cp 命令可复制⽂件到当前⽬录或其他指定⽬录
cp 可以不断的表示要复制走的文件,但是要求最后一个参数必须是目标文件夹
1 | [lixiaohui@host1 ~]$ mkdir /home/lixiaohui/folder1 |
cp 在复制文件夹时,必须带上 -r 这个参数做递归操作才能把文件夹复制走
1 | [lixiaohui@host1 ~]$ cp /home/lixiaohui/folder1 /tmp/ |
移动⽂件和⽬录
mv 命令可将⽂件从⼀个位置移动到另⼀个位置,如果源路径和目标路径是同样的路径,但目前文件名和源文件名不同,将是重命名效果
文件移动
1 | [lixiaohui@host1 ~]$ touch /tmp/file1 |
文件重命名
1 | [lixiaohui@host1 ~]$ ll /tmp/folder1/ |
删除⽂件和⽬录
rm 默认删除文件,但是不删除目录,可以加上
-r递归选项来同时删除非空目录rm 可以跟上
-i在删除具体文件时,问你是否删除,跟上-f来不提示且强制删除rm -rf 可以删除文件以及所有目录,此操作强制静默执行目录的递归删除
从命令行(shell)执行的文件删除操作不可撤销,系统也不提供回收站机制。
1 | [lixiaohui@host1 ~]$ ll /tmp/folder1/ |
在 Linux 中,链接是一种特殊的文件类型,用于指向另一个文件。链接分为两种:硬链接(Hard Link)与软链接(Symbolic Link)。
🧱 硬链接(Hard Link)
📌 原理说明
- 每个文件在文件系统中都有一个唯一的 inode 编号
- 硬链接是对同一个 inode 的多个引用,不会复制数据,也不会额外占用空间
- 所有硬链接都是“平等的”,没有“源文件”与“目标文件”之分
- 删除其中一个链接,只是取消一个路径引用,数据仍然存在于其他链接中
- 不能跨设备或分区创建硬链接,也不能对目录创建硬链接
以下例子中,所有的硬链接都具有相同的编号: 268964355
1 | [lixiaohui@host1 ~]$ touch /tmp/folder1/lxhfile1 |
📌 两个文件共享同一个 inode 编号,表示它们是同一个数据的多个路径引用
🧷 软链接(Symbolic Link)
📌 原理说明
- 使用
ln -s创建软链接 - 类似于 Windows 的快捷方式,软链接是一个指向目标路径的文件
- 可以跨设备、跨分区创建,也可以对目录创建软链接
- 软链接依赖源文件,如果源文件被删除,链接将失效
1 | [lixiaohui@host1 ~]$ ll -i /tmp/folder1/lxhfile1 |
📌 删除源文件后,软链接失效,无法访问原始内容
🔍 对比总结
| 特性 | 硬链接 | 软链接 |
|---|---|---|
| 是否占用额外空间 | ❌ 不占用 | ✅ 占用一个链接文件空间 |
| 是否依赖源文件 | ❌ 不依赖 | ✅ 严重依赖 |
| 是否可跨设备 | ❌ 不可 | ✅ 可跨设备 |
| 是否可链接目录 | ❌ 不可 | ✅ 可链接目录 |
| 是否共享 inode | ✅ 是 | ❌ 否 |
🧠 使用 Shell 扩展匹配文件名
Bash Shell 提供多种扩展机制,帮助用户在命令行中动态生成、替换或匹配文本,是高效操作文件与路径的核心技巧。
🔧 Bash Shell 的五种主要扩展方式
| 扩展类型 | 功能说明 |
|---|---|
| 🧩 大括号扩展 | 生成多个字符串或路径组合 |
| 🏠 波形符扩展 | 将 ~ 扩展为当前用户主目录路径 |
| 💲 变量扩展 | 将 $变量名 替换为变量的值 |
| 🔁 命令替换 | 将 $(命令) 或 `命令` 替换为命令输出 |
| 📁 路径名扩展 | 使用通配符匹配多个文件名或路径(也称为通配) |
元字符和匹配项表:
| 模式(Pattern) | 匹配说明 |
|---|---|
* | 匹配任意长度的任意字符(包括零个字符) |
? | 匹配任意单个字符 |
[abc...] | 匹配方括号中任意一个字符 |
[!abc...] | 匹配不在方括号中的任意一个字符(感叹号表示排除) |
[^abc...] | 匹配不在方括号中的任意一个字符(脱字符表示排除) |
[[:alpha:]] | 匹配任意字母字符(A-Z 或 a-z) |
[[:lower:]] | 匹配任意小写字母 |
[[:upper:]] | 匹配任意大写字母 |
[[:alnum:]] | 匹配任意字母或数字字符 |
[[:punct:]] | 匹配任意可打印的非空格非字母数字字符(如标点) |
[[:digit:]] | 匹配任意数字(0 到 9) |
[[:space:]] | 匹配任意空白字符(包括空格、制表符、换行等) |
路径名扩展和模式匹配
1 | [lixiaohui@host1 ~]$ mkdir glob; cd glob |
⼤括号扩展
1 | [lixiaohui@host1 glob]$ echo {Sunday,Monday,Tuesday,Wednesday}.log |
波形符扩展
1 | [lixiaohui@host1 glob]$ echo ~root |
变量扩展
变量名称只能包含字⺟(⼤写和⼩写)、数字和下划线。变量名称区分⼤⼩写,不能以数字开头。
变量的赋值和引用
1 | [lixiaohui@host1 glob]$ username=lixiaohui |
要预防因其他 shell 扩展⽽引起的错误,可以将变量的名称放在⼤括号中
1 | [lixiaohui@host1 glob]$ username=lixiaohui |
命令替换
命令替换允许命令的输出替换命令⾏上的命令本⾝。当命令括在括号中并且前⾯有美元符号 $ 时,会发⽣命令替换。$(command) 形式可以互相嵌套多个命令扩展。
1 | [lixiaohui@host1 glob]$ echo Today is $(date +%A). |
防⽌参数被扩展
在 Bash shell 中,许多字符具有特殊含义(如 $、*、?、! 等),会触发变量扩展、通配符匹配、命令替换等行为。为了防止这些扩展,可以使用引号或转义符进行保护。
🧱 反斜杠转义:\
- 反斜杠是 Bash 中的转义字符
- 它会取消紧随其后的字符的特殊含义,使其按字面值处理
- 常用于保护特殊字符或在字符串中插入空格、引号等
🧾 引号机制
| 引号类型 | 功能说明 |
|---|---|
'单引号' | 禁止所有扩展,完全按字面值处理 |
"双引号" | 禁止路径名扩展与通配符,但允许变量与命令替换 |
无引号 | 所有扩展均可能发生(默认行为) |
1 | [lixiaohui@host1 glob]$ echo The value of $HOME is your home directory. |
第八章 📝 使用 Vim 编辑文件
在 Linux 中,系统配置与信息通常存储为纯文本文件,这使得使用文本编辑器成为日常运维的核心技能。
📁 为什么使用文本编辑器
- Linux 遵循“文本即配置”的设计理念
- 配置文件格式多样:INI、XML、YAML、列表等
- 纯文本结构便于审查、版本控制与远程编辑
- 可在无图形界面环境下通过终端或 SSH 编辑
🧠 Vim 编辑器简介
- Vim 是 vi 编辑器的增强版本,功能更强大
- 默认随大多数 Linux/UNIX 系统安装
- 提供分屏编辑、语法高亮、颜色格式等高级功能
- 高度可配置,适合 CLI 环境下高效编辑文件
✅ Vim 的优势
| 优势点 | 说明 |
|---|---|
| 📦 默认安装 | 几乎所有 Linux 发行版都预装 Vim 或 vi |
| 🧑💻 适合远程编辑 | 可通过 SSH/Web 控制台在无 GUI 环境下使用 |
| 🧱 POSIX 标准支持 | vi 是 POSIX 标准的一部分,Vim 是其实现之一 |
| 🍎 跨平台兼容 | macOS 默认也包含 Vim 的轻量版本 |
| 🔧 高度可配置 | 支持插件、快捷键映射、主题等个性化设置 |
🛠️ 安装 Vim 编辑器(RHEL)
在 Red Hat Enterprise Linux 中,你可以通过以下软件包安装 Vim:
| 软件包名称 | 功能说明 |
|---|---|
vim-minimal | 提供基本 vi 命令与核心功能,轻量级安装 |
vim-enhanced | 提供完整 Vim 功能,支持语法高亮与扩展配置 |
📌 安装命令示例
1 | sudo dnf install vim-minimal |
🧩 Vim 与 vi 的别名机制与功能差异
在 RHEL 系统中,安装 vim-enhanced 后,系统会为普通用户设置一个 shell 别名,使 vi 命令自动调用 vim,但该机制对某些用户不适用。
🔧 别名行为说明
| 用户类型 | vi 命令行为 |
|---|---|
| 普通用户(UID ≥ 200) | 自动调用 vim(通过别名) |
| 系统用户(UID < 200) | 调用原始 vi(无别名) |
root 用户 | 调用原始 vi(无别名) |
📌 别名机制仅对普通用户生效,系统服务用户与 root 不受影响
🧪 如何临时绕过别名
若普通用户希望使用原始 vi 命令而非别名指向的 vim,可使用反斜杠 \ 临时绕过别名:
1 | \vi filename.txt |
✅ 该方式会执行系统路径下的
vi命令,而非别名指向的vim
🎮 Vim 操作模式详解
Vim 编辑器采用多模式设计,不同模式下相同按键会触发不同功能。理解并识别当前模式是高效使用 Vim 的关键。
🧩 Vim 的四大核心模式
| 模式名称 | 功能说明 |
|---|---|
| 🟦 命令模式(Normal) | 默认进入模式,用于导航、删除、复制、粘贴等操作 |
| 🟨 编辑模式(Insert) | 用于输入文本,按 i、a、o 等进入 |
| 🟪 扩展命令模式(Command-line) | 用于执行保存、退出、搜索、替换等命令,按 : 进入 |
| 🟥 可视模式(Visual) | 用于选中文本块,按 v 或 Ctrl+v 进入 |
🧩 Vim 模式切换与功能概览
| 模式名称 | 进入方式 | 功能说明 |
|---|---|---|
| 🟦 命令模式 | 默认启动 | 用于导航、剪切、粘贴、删除等操作 |
| 🟨 插入模式 | i、a、o | 用于输入文本内容 |
| 🟥 可视模式 | v、Shift+v、Ctrl+v | 用于选中文本块(字符、行、列) |
| 🟪 扩展命令模式 | : | 用于执行保存、退出、搜索、替换等命令 |
📌 按
Esc可随时返回命令模式,是最安全的操作起点
📌 扩展命令模式常用命令
1 | :w # 保存文件 |
命令模式
Vim 是一个多模式文本编辑器,初次打开时默认进入命令模式。不同模式下按键行为不同,掌握模式切换与常用命令是高效使用 Vim 的关键。
🧠 常用命令与按键速查表
| 按键/命令 | 功能说明 |
|---|---|
i | 进入插入模式(光标前插入) |
Esc | 返回命令模式 |
: | 进入扩展命令模式 |
U | 撤销最近一次编辑 |
X | 删除光标所在字符 |
:w | 保存文件但不退出 |
:wq | 保存并退出 Vim |
:q! | 强制退出,不保存更改 |
案例:
1 | [lixiaohui@host1 ~]$ vim file1 #回车后会进入命令模式 |
📚 学习 Vim 的推荐方式
使用以下命令启动官方 Vim 教程:
1 | vimtutor |
- 来自
vim-enhanced软件包 - 提供交互式练习,覆盖 Vim 核心功能
- 建议新用户花 30 分钟完成教程,打下坚实基础
📝 编辑模式
编辑模式是 Vim 中用于输入文本内容的核心模式。当你进入编辑模式后,键盘输入将直接写入文件,而不是触发命令。
🧭 如何进入编辑模式
在命令模式下,按以下任意键即可进入编辑模式:
| 按键 | 含义说明 |
|---|---|
i | 在光标前插入文本 |
a | 在光标后插入文本 |
I | 在当前行行首插入文本 |
A | 在当前行行尾插入文本 |
o | 在当前行下方新建一行并插入文本 |
O | 在当前行上方新建一行并插入文本 |
cw | 替换当前单词(删除并进入编辑模式) |
s | 删除当前字符并进入编辑模式 |
🔙 如何退出编辑模式
- 按
Esc键即可退出编辑模式,返回命令模式 - 这是 Vim 中最常用的模式切换方式
🔄 复制与粘贴操作
在 Vim 中,可以使用 Y(复制)与 P(粘贴)命令实现文本的拖拉与重排操作。
🧩 操作流程概览
- 将光标定位到要复制的起始位置
- 进入可视模式:
- 按
v:选择字符块 - 按
Shift+v:选择整行 - 按
Ctrl+v:选择列块(矩形选择)
- 按
- 使用方向键扩展选择范围
- 按
Y复制选中内容到内存(寄存器) - 将光标移动到目标位置
- 按
P将内容粘贴到光标后方
可视模式
🔁 可视模式细分
| 按键组合 | 选择类型 |
|---|---|
v | 字符块选择 |
Shift+v | 行块选择 |
Ctrl+v | 列块选择(矩形) |
📌 再次按下相同按键可退出可视模式
vim 基本命令
1 | [lixiaohui@host1 ~]$ cp /etc/passwd /tmp/passwd |
先进入到具体有内容的文件中,执行以下命令:
yy复制光标所在行p在光标所在行下方插入刚复制的内容x删除光标所在的单个字符dd删除光标所在行3dd删除包括光标所在行的向下3行3,5y复制第3到第5行3,5d删除第3到第5行/lixiaohui快速搜索lixiaohui字符串n或N,搜索到之后,向下或向上查找u撤销你刚才修改的内容ctrl r撤销你刚才撤销的动作,也就是说把刚才撤销的东西再找回来:w只保存不退出:q!只退出不保存set nu显示行号set nonu取消行号显示
⚙️ Vim 配置文件详解
Vim 编辑器支持通过配置文件自定义行为,提升编辑效率与体验。配置文件分为系统级与用户级两类:
📁 配置文件路径说明
| 配置文件路径 | 作用范围 |
|---|---|
/etc/vimrc | 系统级配置,影响所有用户 |
~/.vimrc | 当前用户专属配置,仅影响该用户 |
🧠 可配置项示例
- 默认制表符间距(如
ts=2) - 是否显示行号(如
set number) - 是否启用语法高亮、颜色方案
- 针对特定文件类型的自动行为(如 YAML、Python)
🧾 示例:用户级配置文件 ~/.vimrc
以下配置适用于 YAML 文件编辑,并启用行号显示:
1 | autocmd FileType yaml setlocal ts=2 |
📌 配置说明:
| 指令 | 功能 |
|---|---|
autocmd FileType yaml ... | 针对 YAML 文件类型设置行为 |
setlocal ts=2 | 设置制表符宽度为 2 空格 |
set number | 启用行号显示,适用于所有文件类型 |
✅ YAML 对缩进非常敏感,设置合适的制表符宽度有助于避免语法错误
第九章 🧵 重定向 Shell 输⼊和输出
在 Linux 中,所有运行中的程序(进程)都通过称为**文件描述符(File Descriptor)**的编号通道进行输入与输出操作。理解这三种标准流是掌握 Shell 编程与调试的基础。
📦 三个默认文件描述符
| 描述符编号 | 名称 | 功能说明 |
|---|---|---|
0 | 标准输入(stdin) | 默认从键盘读取输入 |
1 | 标准输出(stdout) | 将正常输出发送到终端 |
2 | 标准错误(stderr) | 将错误信息发送到终端 |
📌 每个进程启动时都会自动拥有这三个通道
🧠 输入输出行为说明
- 标准输入:程序等待用户输入,如
read命令或交互式脚本 - 标准输出:程序的正常结果,如
echo、ls输出 - 标准错误:程序的错误信息,如命令失败、语法错误等
| 用法 | 说明 |
|---|---|
> FILE | 重定向标准输出(stdout),覆盖目标文件内容。 |
>> FILE | 重定向标准输出,追加到目标文件末尾。 |
2> FILE | 重定向标准错误(stderr),覆盖目标文件内容。 |
2>> FILE | 重定向标准错误,追加到目标文件末尾。 |
2>/dev/null | 将标准错误重定向到 /dev/null,丢弃错误信息。 |
> FILE 2>&1 | 同时重定向标准输出和标准错误,覆盖写入同一个文件。 |
>> FILE 2>&1 | 同时重定向标准输出和标准错误,追加写入同一个文件。 |
重定向
从 shell 提⽰符运⾏命令时,通常会从键盘读取其输⼊,并将输出发送到终端窗⼝,通过重定向,可以将消息保存到⽂件或直接丢弃,⽽不在终端上显⽰输出
/dev/null是一个特殊设备,所有重定向到这里的内容,将不做保存和处理,直接丢弃
重定向将会清空文件原有内容,并插入新内容,文件不存在时,会创建出来
1 | [lixiaohui@host1 ~]$ echo hello |
追加
保留原有内容并在后方插入新内容
1 | [lixiaohui@host1 ~]$ echo hello line2 >> file1 |
处理错误输出
shell中的错误,在操作重定向时,将会把错误内容默认输出到屏幕,可以使用2>来单独重定向错误信息
1 | [lixiaohui@host1 ~]$ ls /home/lixiaohui/ /nolixiaohui > file1 |
分别保存正确和错误
1 | [lixiaohui@host1 ~]$ ls /home/lixiaohui/ /nolixiaohui > correct.txt 2> error.txt |
正确和错误合并处理
1 | [lixiaohui@host1 ~]$ ls /home/lixiaohui/ /nolixiaohui |
🔗 管道(Pipe)机制详解
在 Linux Shell 中,管道是一种将多个命令连接起来的机制,使得一个命令的输出可以直接作为下一个命令的输入。
🧠 管道的基本原理
- 使用竖线字符
|将多个命令连接成一个命令序列 - 管道将前一个命令的标准输出(stdout)连接到后一个命令的标准输入(stdin)
- 每个命令只处理自己关心的部分,形成高效的数据处理链
计算文件一共有几行
wc -l 需要一系列内容才能计算内容一共有几行,wc 命令所需要的内容由管道将管道前命令的输出提供
1 | [lixiaohui@host1 ~]$ cat /etc/passwd | wc -l |
tee 命令
重定向和追加有一个被迫选择的问题,要不输出到屏幕,要不输出到文件,而tee可以做到同时输出到文件和屏幕
tee 命令用于读取标准输入并将其内容同时写入文件和标准输出。它常用于管道中,帮助你在不中断数据流的情况下保存中间结果。
1 | [lixiaohui@host1 ~]$ echo hello > file1 |
👤 第十章 管理本地⽤⼾和组
在 Linux 系统中,用户账户不仅用于身份识别,更是系统安全与资源访问控制的核心机制。
🧠 用户账户的作用
- 提供人与程序之间的安全边界
- 每个用户拥有唯一的 用户名 与 用户 ID(UID)
- 登录时通过密码验证身份
- 每个进程都以某个用户身份运行
- 每个文件都归属于某个用户,系统据此进行访问控制
🔍 用户类型分类
Linux 系统中的用户账户主要分为三类:
| 用户类型 | UID 范围 | 功能说明 |
|---|---|---|
| 🛡️ 超级用户 | UID = 0 | 用户名为 root,拥有系统全部权限 |
| ⚙️ 系统用户 | UID < 1000(或 < 200) | 用于运行服务进程(如守护进程),不可交互登录 |
| 👨💻 普通用户 | UID ≥ 1000(或 ≥ 200) | 用于日常操作,权限受限,可交互登录 |
📌 不同发行版对 UID 范围略有差异,RHEL 通常以 UID ≥ 1000 作为普通用户起点
文件和进程都属于某一用户,用来配合权限工作
1 | [lixiaohui@host1 ~]$ id root |
✅ 查看当前用户信息
使用 id 命令可以查看当前登录用户的详细信息,id命令后面跟用户名,可以查询别的用户哦
1 | id |
输出示例:
1 | uid=1000(lixiaohui) gid=1000(lixiaohui) groups=1000(lixiaohui),10(wheel) |
uid:用户 IDgid:主组 IDgroups:所属的所有组
📁 用户信息文件 /etc/passwd
该文件包含所有本地用户的基本信息,每行一个用户,字段以冒号 : 分隔,共 7 个字段。
✅ 示例内容
1 | lixiaohui:x:1001:1001:Lxh:/home/lixiaohui:/bin/bash |
| 字段位置 | 内容示例 | 说明 |
|---|---|---|
| 1 | lixiaohui | 用户名 |
| 2 | x | 密码占位符(真实密码存储在 /etc/shadow) |
| 3 | 1001 | 用户 UID |
| 4 | 1001 | 主组 GID |
| 5 | Lxh | 用户描述或备注 |
| 6 | /home/lixiaohui | 用户主目录 |
| 7 | /bin/bash | 默认 shell 程序(如 /sbin/nologin 表示禁止登录) |
📦 组信息文件 /etc/group
该文件包含所有本地组的信息,每行一个组,字段以冒号 : 分隔,共 4 个字段。
✅ 示例内容
1 | lixiaohui:x:1001:user01,user02,user03 |
| 字段位置 | 内容示例 | 说明 |
|---|---|---|
| 1 | lixiaohui | 组名 |
| 2 | x | 密码占位符(通常不使用) |
| 3 | 1001 | 组 GID |
| 4 | user01,user02,user03 | 补充组成员列表 |
🧩 用户组类型说明
🟦 主要组(Primary Group)
- 每个用户有且仅有一个主要组
- 通常在创建用户时自动创建一个与用户名同名的私有组
- 用户是该组的唯一成员
1 | 我入职了 IT 部门,系统创建了 lixiaohui 用户,同时创建了 lixiaohui 组作为我的私有组。 |
🟨 补充组(Supplementary Groups)
- 用户可以属于多个补充组
- 补充组成员信息存储在
/etc/group的第四字段 - 文件权限可以通过补充组进行灵活控制
1 | 我是 IT 部门成员,同时属于 lixiaohui 私有组、it 部门组、公司全员组。 |
✅ 权限分配只需赋予组权限,用户即可获得访问能力,无需单独配置每个用户
🛡️ Linux 中的超级用户(root)
在 Linux 系统中,超级用户是拥有最高权限的特殊账户,主要用于系统管理与维护。Red Hat Enterprise Linux(RHEL)中,超级用户的用户名为 root,其 UID 为 0。
🧠 超级用户的权限与作用
- 拥有系统所有资源的访问与控制权
- 可执行安装、删除软件、修改系统配置、管理用户与文件
- 可访问或修改任何文件,无视文件权限限制
- 可控制大多数设备(如硬盘、网络接口)
⚠️ 权限风险与安全建议
| 风险点 | 建议做法 |
|---|---|
| root 可删除任意文件或用户 | 避免直接登录,使用临时提权机制 |
| root 被盗将导致系统失控 | 限制 root 登录方式,加强审计与监控 |
| 图形界面以 root 身份运行 | 禁止 root 启动桌面环境,避免扩大攻击面 |
📌 在 RHEL 10 中,root 默认没有有效密码,无法直接使用密码登录
🔐 提权机制推荐
| 工具/机制 | 功能说明 |
|---|---|
su | 切换到 root 用户身份(需输入 root 密码) |
sudo | 以当前用户身份临时执行 root 权限命令(需配置 /etc/sudoers) |
PolicyKit | 图形界面下的权限控制框架,用于细粒度授权 |
✅ Red Hat 建议管理员以普通用户身份登录,仅在需要时使用上述机制临时获取 root 权限
🔄 与 Windows 管理机制对比
| 操作系统 | 管理账户名称 | 推荐做法 |
|---|---|---|
| Linux | root | 使用 sudo 或 su 提权,避免直接登录 |
| Windows | Administrator | 使用管理员组成员身份运行任务,避免直接登录 |
su 直接切换身份
使用su - USERNAME的方法切换到目标用户身份下,普通用户的切换需要提供目标密码,而root用户切换到其他用户时无需密码
如果su后面省略⽤⼾名,则默认情况下会尝试切换到 root
1 | [lixiaohui@host1 ~]$ su - lxh |
su 与 su -
su命令后面也可以不写中横杠,区别如下:
su 命令将启动⾮登录 shell,su 以该⽤⼾⾝份启动shell,但使⽤的是原始⽤⼾的环境设置
su - 命令会启动登录 shell,会将 shell 环境设置为如同以该⽤⼾⾝份重新登录⼀样
一般来说,管理员应该运⾏ su - 以获得包含⽬标⽤⼾常规环境设置的 shell
1 | [lxh@host1 ~]$ su root |
通过sudo 获得权限
在 RHEL 10 中,出于安全考虑,root 用户默认没有有效密码,无法直接登录或使用 su 命令切换到 root。推荐的做法是使用 sudo 命令以 root 身份运行命令。
🧠 sudo 与 su 的区别
| 命令 | 身份验证方式 | 是否需要 root 密码 | 推荐使用场景 |
|---|---|---|---|
su | 输入目标用户密码 | ✅ 需要 root 密码 | 不推荐,除非已设置 root 密码 |
sudo | 输入当前用户密码 | ❌ 不需要 root 密码 | ✅ 推荐,可审计、可配置、可限制 |
✅ 使用 sudo 的基本流程
- 普通用户登录系统
- 执行命令时前加
sudo - 输入自己的密码进行身份验证
- 命令以 root 权限执行
1 | sudo dnf install httpd |
🔄 密码缓存机制
sudo默认会缓存密码验证结果 5 分钟- 在此期间无需重复输入密码
- 可使用以下命令清除缓存:
1 | sudo -k |
📦 sudo 的配置与审计优势
- 可通过
/etc/sudoers或visudo工具配置权限规则 - 可限制某用户只能以某个身份运行特定命令
- 所有
sudo执行记录默认写入/var/log/secure,便于审计与追踪
👥 wheel 组机制(RHEL 7+)
- RHEL 7 及更高版本中,wheel 组成员默认拥有 sudo 权限
- 成员可使用自己的密码通过
sudo以任何用户身份运行命令 - 添加用户到 wheel 组:
1 | usermod -aG wheel lixiaohui |
⚠️ 注意:RHEL 6 及更早版本中,wheel 组默认不具备特权,需手动配置
su、su - 和 sudo 命令之间的区别

普通用户不具有用户创建权限
1 | [lixiaohui@host1 ~]$ useradd zhangsan |
用root权限,授予lixiaohui用户可以创建用户和删除用户权限
先查询用户创建和删除的命令位置
1 | [root@host1 ~]# which useradd |
sudo 授权
以下授权允许lixiaohui用户可以sudo运行useradd和userdel命令,但是不允许用sudo的方式运行ls命令
手工修改此文件有语法错误的可能性,可以使用 visudo 命令去自动打开此文件修改,保存时,会去验证是否正确
如果不想修改主配置文件,可以修改/etc/sudoers.d路径下的文件,新建一个文件放进来即可
1 | [root@host1 ~]# vim /etc/sudoers |
以下授权允许lixiaohui用户可以sudo运行所有命令,且不需要密码
1 | [root@host1 ~]# vim /etc/sudoers |
在配置了允许用户执行所有命令后,用户就可以执行 sudo -i来切换到超级用户身份执行命令了
以下授权允许lxhgroup 组可以sudo运行所有命令,且不需要密码
1 | [root@host1 ~]# vim /etc/sudoers |
测试权限
我们注意,在userdel时失败了一次,因为没有sudo命令开始,不经过我们的授权验证
1 | [root@host1 ~]# su - lixiaohui |
👤管理本地⽤⼾
创建⽤⼾
默认会创建用户的家目录,将/bin/bash设置为用户shell,UID和GID从/etc/login.defs中获取,默认创建的第一个用户UID是1000
-u指定UID-s指定shell,其中/sbin/nologin未不允许用户登录,但程序可以本地使用此用户-G指定辅助组-g执行主要组
1 | [root@host1 ~]# useradd lixiaohui |
useradd命令将创建名为 xxx 的用户账户,并完成以下任务:
- 读取默认配置文件
/etc/login.defs - 写入用户信息到:
/etc/group:组信息/etc/passwd:用户账户信息/etc/shadow:加密密码信息
- 从
/etc/skel复制默认配置文件到用户主目录/home/username
📊 用户创建流程图
graph TD
A[useradd username] --> B[读取 /etc/login.defs]
A --> C[写入 /etc/group]
A --> D[写入 /etc/passwd]
A --> E[写入 /etc/shadow]
A --> F[读取 /etc/skel]
F --> G[复制默认文件到 /home/username]📁 相关文件说明
| 文件路径 | 作用说明 |
|---|---|
/etc/login.defs | 用户默认设置(如 UID 范围、密码策略) |
/etc/group | 存储组信息,包含 GID 与成员列表 |
/etc/passwd | 存储用户基本信息(用户名、UID、主目录等) |
/etc/shadow | 存储加密密码与密码策略 |
/etc/skel | 默认用户配置文件模板目录 |
/home/username | 新用户的主目录,包含初始化文件 |
修改用户
usermod 可以修改用户信息,其中
- -a和-G 组合使用可以将用户添加到辅助组,而不从现有组中踢出此用户
只使用-G,会将用户从其他组中踢出
| 选项 | 用法说明 |
|---|---|
-a, --append | 与 -G 一起使用,将附加组添加到用户当前的组集合中,而不是替换组集合。 |
-c, --comment COMMENT | 将 COMMENT 文本添加到用户的注释字段。 |
-d, --home HOME_DIR | 为用户指定新的主目录。 |
-e, --expiredate DATE | 设置用户账户的过期日期。 |
-G, --groups GROUPS | 指定用户所属的附加组(多个组用逗号分隔)。 |
-g, --gid GROUP | 指定用户的初始主组。 |
-L, --lock | 锁定用户账户,禁止登录。 |
-m, --move-home | 将用户主目录移动到新位置,需与 -d 一起使用。 |
-s, --shell SHELL | 指定用户的登录 shell 程序。 |
-U, --unlock | 解锁用户账户,允许登录。 |
1 | [root@host1 ~]# id lixiaohui |
组合使用,可以叠加多个组
1 | [root@host1 ~]# id lixiaohui |
- -g 修改用户主要组
1 | [root@host1 ~]# usermod -g group2 lixiaohui |
- 锁定用户不允许登录
1 | [root@host1 ~]# usermod -L lixiaohui |
- 恢复用户登录
1 | [root@host1 ~]# usermod -U lixiaohui |
- -s 修改登录的登录shell
/sbin/nolgin和/bin/false都是拒绝用户交互式登录的shell,/sbin/nologin更友好,因为它会提示因为什么拒绝
1 | [root@host1 ~]# usermod -s /sbin/nologin lixiaohui |
删除用户
userdel 可以删除用户,以下是注意事项:
如果是暂时禁用用户,请使用usermod -L 锁定
如果确定要删除用户,而且不想删除用户的家目录资料,可以执行
userdel USERNAME如果确定要删除用户,而且连带用户家目录资料同步删除,可以执行
userdel -r USERNAME
设置用户密码
passwd可以给用户设置密码
普通用户不允许在passwd后面加用户名,只能给自己设置,root用户可以在passwd后面加用户名给别人设置密码
1 | [root@host1 ~]# passwd lixiaohui |
管理本地组帐⼾
创建本地组
groupadd可以创建本地组,默认从/etc/login.defs中获取GID的范围,也可以在创建时指定-g来设置GID,-r 创建系统组
1 | groupadd -r lxhgroup1 |
修改本地组
groupmod 命令可更改现有组的属性。groupmod 命令 -n 选项可指定组的新名称
1 | groupmod -n lxhgroup1 lxhgroup2 |
在 Linux 中,每个用户在登录时都会自动关联一个主要组(primary group)。使用 newgrp 命令可以临时切换当前 shell 会话的主要组,以便在创建文件或执行操作时使用不同的组权限。
🧠 newgrp 命令的作用
- 更改当前 shell 提示符下的默认主要组
- 仅影响当前 shell 会话,不影响其他终端或用户
- 适用于用户属于多个组时,临时切换到某个附加组
- 注销或关闭 shell 后,主要组将恢复为默认设置
✅ 使用示例
1 | id |
📦 注意事项
| 特性说明 | 详情 |
|---|---|
| 一次只能有一个主要组 | 切换后,原主要组不再生效,直到恢复 |
| 仅限当前 shell 会话 | 不影响其他终端或后台任务 |
| 需属于目标组 | 否则切换失败,提示权限不足 |
| 可切换回默认组 | 使用 newgrp 加原组名即可恢复 |
删除本地组
groupdel 命令可删除组
🔐 管理⽤⼾密码
/etc/shadow
Linux 使用 /etc/shadow 文件存储用户的加密密码与密码策略信息。该文件只能由 root 用户读取,每行对应一个用户账户,共包含 9 个以冒号分隔的字段。
1 | [root@host1 ~]# tail -n 1 /etc/shadow |
📊 字段说明表
| 字段位置 | 内容示例 | 字段说明 |
|---|---|---|
| 1 | lixiaohui | 用户名 |
| 2 | $6$... 或 ! | 加密后的哈希密码(! 表示账户被锁定) |
| 3 | 19758 | 上次更改密码的日期(自 1970-01-01 起的天数) |
| 4 | 1 | 密码最短更改间隔(天) |
| 5 | 30 | 密码最长有效期(天) |
| 6 | 7 | 密码过期前的警告天数 |
| 7 | 31 | 密码过期后账户锁定前的宽限天数 |
| 8 | 19773 | 密码到期日期(自 1970-01-01 起的天数) |
| 9 | 空字段 | 预留字段,未来用途 |
- 加密密码字段通常以
$id$salt$hash格式表示:$6$表示使用 SHA-512 加密算法salt是加密用的随机盐值hash是最终生成的密码摘要
- 若密码字段为
!或*,表示该账户已被锁定,无法登录 - 可使用
chage命令查看或修改这些字段对应的策略
加密哈希密码的格式
以 yescrypt 算法为例,密码字段格式如下:
1 | $y$j9T$qybndwEWzHhr0uTGAwO4Q0$OuNgGC5Mx2RrCO4JOXtR2VJfTA8dLPxa7NV1tvhziHC |
加密哈希密码字段中存储了三段信息:
- 所⽤的哈希算法,6 表⽰ SHA-512 哈希,这是 RHEL 9 的默认算法;1 表⽰ MD5,⽽ 5则表⽰ SHA-256
- salt,CSsXcYG1L/4ZfHr/
- 加密哈希值,2W6evvJahUfzfHpc9X.45Jc6H30E
salt 添加随机数据到加密哈希,以创建唯⼀哈希来增强加密哈希密码。每段信息由美元符号 ($) 字符分隔
📊 字段组成说明
| 字段位置 | 内容示例 | 说明 |
|---|---|---|
$y | y | 哈希算法标识:y 表示 yescrypt,6 表示 SHA-512,5 表示 SHA-256 |
j9T | j9T | yescrypt 参数,用于调整算法行为(其他算法可能无此字段) |
salt | qybndwEWzHhr0uTGAwO4Q0 | 加密用的随机盐值,用于抵御预计算攻击 |
hash | OuNgGC5Mx2RrCO4JOXtR2VJfTA8dLPxa7NV1tvhziHC | 最终生成的密码哈希值 |
🧠 为什么要使用 salt?
- salt 是随机生成的字符串,与明文密码一起参与加密过程
- 有效防止使用预计算哈希表(如彩虹表)进行暴力破解
- 增加攻击者破解成本,使每个密码哈希唯一,即使密码相同
🔐 Linux 密码验证机制详解
Linux 系统通过 /etc/shadow 文件中的加密哈希密码字段进行用户登录验证。该机制确保系统可以验证密码正确性,而无需存储明文密码。
🧠 验证流程原理
- 用户在登录界面输入用户名与密码
- 系统在
/etc/shadow中查找对应用户名的条目 - 提取该用户的:
- 加密算法标识(如
$6$表示 SHA-512) - salt(随机加密盐值)
- 加密后的哈希密码
- 加密算法标识(如
- 系统将用户输入的明文密码与 salt 组合
- 使用指定的哈希算法重新加密该组合
- 将结果与
/etc/shadow中的哈希密码进行比对:- ✅ 若匹配:密码正确,允许登录
- ❌ 若不匹配:密码错误,拒绝登录
🔒 安全优势
- 系统不存储明文密码,即使
/etc/shadow被泄露也无法直接获取密码 - 使用 salt 可抵御预计算攻击(如彩虹表)
- 每个用户的密码哈希都是唯一的,即使密码相同也无法直接识别
- 支持多种加密算法(如 SHA-512、yescrypt),可根据系统策略升级安全性
✅ 示例流程图(Mermaid)
flowchart TD
A[用户输入密码] --> B[系统查找 /etc/shadow 条目]
B --> C[提取 salt 和哈希算法]
A --> D[将密码与 salt 组合]
C --> D
D --> E[使用哈希算法加密组合]
E --> F[比对结果与 shadow 中哈希]
F --> G{是否匹配?}
G -- 是 --> H[登录成功]
G -- 否 --> I[登录失败]配置密码期限

- 让用户于2026-03-01日过期
1 | [root@host1 ~]# chage -E 2026-03-01 lixiaohui |
- 用户下次登陆前必须改密码
1 | [root@host1 ~]# chage -d 0 lixiaohui |
控制对⽂件的访问
Linux ⽂件系统权限概述
⽂件具有三个应⽤权限的⽤⼾类别。⽂件归某个⽤⼾所有,通常是⽂件的创建者。⽂件还归单个组所有,通常是创建该⽂件的⽤⼾的主要组,但是可以进⾏更改。
权限承载的主体有:
所属⽤⼾(⽤⼾权限)
所属组(组权限)系统上
⾮所属⽤⼾和⾮所属组成员的所有其他⽤⼾(其他权限)
最具体的权限具有优先权。用户权限覆盖组权限,后者⼜覆盖其他权限
权限对⽂件和⽬录的影响

查看权限
看出不管是文件还是目录,都归当前用户以及当前用户组所有
1 | [lixiaohui@host1 ~]$ touch lxhfile |
文件类型
ll 命令是ls -l的缩写,以下命令输出中第一个字母d代表这次的输出是文件夹
1 | [lixiaohui@host1 ~]$ ll -d lxhfolder |
第一个字母还可以是以下的字母:
-是常规⽂件。d是⽬录。l是符号链接。c是字符设备⽂件。b是块设备⽂件。p是命名管道⽂件。s是本地套接字⽂件
权限解释
九个字符代表⽂件权限。这些字符解释为三组,每组三个字符:第⼀组是适⽤于⽂件所有者的权限,第⼆组⽤于⽂件的组所有者,最后⼀组则适⽤于所有其他(全局)⽤⼾
1 | [lixiaohui@host1 ~]$ ll -d lxhfolder |
d,代表文件类型rwx,第一组三位字符是指此文件所属用户的权限为读、写、执行r-x,第二组三位字符是指此文件所属组的权限为读、执行r-x,第三组三位字符是指非所属用户和所属组的其他所有人的权限为读、执行.,这代表常规已经显示完毕,如果写的是+,代表还有额外的acl权限2,这代表文件的链接数量,每个目录的链接数最起码是2,指向自身(.)或上级(..)lixiaohui,第一个lixiaohui是指此文件夹被lixiaohui用户所拥有lixiaohui,第二个lixiaohui是指此文件夹被lixiaohui组所拥有
更改⽂件和⽬录权限
通过符号法更改权限
chmod 命令具有以下特性:可从命令⾏更改⽂件和⽬录权限。这可以解释为“更改模式”,因为⽂件的模式是⽂件权限的另⼀个名称
使⽤ chmod 命令修改⽂件和⽬录权限的格式如下:
1 | chmod Who/What/Which file|directory |
who 代表用户主体,可以是:
| who | 主体 |
|---|---|
| u | user |
| g | group |
| o | other |
| a | all |
what 代表从文件身上添加还是删除权限
| what | 操作 |
|---|---|
| + | 添加 |
| - | 删除 |
| = | 等于 |
which 代表具体的权限
| which | 权限或模式 | 备注 |
|---|---|---|
| r | 读 | - |
| w | 写 | - |
| x | 执行 | 对于目录而言,必须要有x权限,不然无法进入 |
| X | 特殊的执行权限 | 仅仅给这个目录添加执行权限,而不影响下级文件的执行权限 |
1 | [lixiaohui@host1 ~]$ ll -d lxhfolder |
可以使⽤ chmod 命令 -R 选项,以递归⽅式对整个⽬录树中的⽂件设置权限
1 | [root@host1 ~]# mkdir folder1 |
通过⼋进制法更改权限
可以使⽤ chmod 命令,通过⼋进制法(⽽⾮符号法)来更改⽂件权限,具体格式:
1 | chmod ### file|directory |
以上的三个#号是数字,每个数字分别代表用户、组、其他人,单个⼋进制数字可以表⽰ 0-7 的任何单个值,7代表最高所有权限都有
0,没有权限1,执行权限2,写入权限3,写入和执行(1+2)4,读取权限5,执行和读取(1+4)6,写入和读取(2+4)7,写入和读取和执行(1+2+4)
1 | [lixiaohui@host1 ~]$ ll |
更改文件或目录所有权
⽤⼾以及用户的私有组拥有其创建的⽂件,但是也可以用chown或chgrp来更改,这两个命令都可以用-R参数对文件夹进行递归修改,也就是对文件夹里的文件同步生效的意思
只更改文件的拥有人
将lxhfile2的拥有人改为laoli
1 | [root@host1 ~]# touch lxhfile2 |
只更改文件的所属组
1 | [root@host1 ~]# chown :lixiaohui lxhfile2 |
同时更改文件的拥有人和所属组
1 | [root@host1 ~]# ll lxhfile2 |
管理默认权限和文件访问
特殊权限
特殊权限是除了⽤⼾、组和其他类型之外的第四种权限类型,所有的特殊权限都要求相应的权限主体有执行权限,如果没有执行权限,所有的特殊权限都会以大写的方式警告此权限无法生效
- suid,chmod中的数字修改法中,用4表示
- sgid,chmod中的数字修改法中,用2表示
- sticky,,chmod中的数字修改法中,用1表示
1 | [root@host1 ~]# chmod 1777 folder |
| 权限 | 对文件的影响 | 对⽬录的影响 |
|---|---|---|
| u+s (suid) | 以拥有⽂件的⽤⼾⾝份,⽽不是以运⾏⽂件的⽤⼾⾝份执⾏⽂件 | ⽆影响 |
| g+s (sgid) | 以拥有⽂件的组⾝份执⾏⽂件 | ⽬录中创建的⽂件的组所有者与⽬录的组所有者相匹配 |
| o+t (sticky) | ⽆影响 | 对⽬录具有写⼊访问权限的⽤⼾仅可以删除其所拥有的⽂件,⽽⽆法删除或强制保存到其他⽤⼾所拥有的⽂件 |
SUID
这出现在程序或脚本场景中,不管谁执行程序,都以程序文件所属的用户身份和权限执行,而不是执行人的身份和权限
我们发现所有人对密码文件都没有修改权限,而root由于是特殊的超级管理员,只有root用户可以修改
1 | [root@host1 ~]# ll /etc/shadow |
/bin/passwd是用来改密码的,此程序已经被执行了chmod u+s /bin/passwd,所以用户权限上有一个小写的s,这就意味着所有人执行/bin/passwd时,都以root用户身份和权限修改/etc/shadow,所以才能改密码
1 | [root@host1 ~]# ll /bin/passwd |
SGID
这出现在文件夹的场景下,我们要求不管谁向特定的文件夹写入文件,新产生的文件要自动归属于特定的组拥有,例如root用户写的代码必须自动归属于group1这个组
1 | [root@host1 ~]# mkdir /lxh-sgid-folder |
sticky 权限
这出现在公共目录使用场景,要求人们只能管理和删除自己的文件,删除别人的文件会报告Operation not permitted
1 | [root@host1 ~]# mkdir /lxh-sticky |
默认⽂件权限
在创建时,⽂件被分配初始权限。有两个因素会影响这些初始权限。其⼀是你要创建常规⽂件还是⽬录。其⼆是当前的 umask,它代表⽤⼾⽂件创建掩码
如果创建⽬录,则其初始⼋进制权限为 0777 (drwxrwxrwx)。如果你创建常规⽂件,则其初始⼋进制权限为 0666 (-rw-rw-rw-),umask是从以上权限数字中,减去特定的数字,最终得到权限
如果umask是0022,那么文件夹默认权限是0755,文件权限是0644
1 | [root@host1 ~]# umask |
修改umask值
你可以在命令行中输入umask xxxx回车,但是这只有临时生效,你可以放入家目录中的.bashrc只影响自己一个人,也可以把umask xxxx这个内容放入/etc/bashrc或/etc/profile影响整个系统
第八章 监控和管理 Linux 进程
了解进程
进程:进程是已启动的可执⾏程序的运⾏中实例
PS 查询进程
进程有多个状态,要警惕僵尸状态的进程,查询状态的命令如下:
- ps
ps 通常是一次性的输出,可以用于配合grep来筛选特定进程是否存在
1 | [root@host1 ~]# ps aux |
在查询中,注意–color=auto这一行,这一行是ps命令回车产生的命令本身进程,并不算查询结果中的一个
1 | [root@host1 ~]# ps aux | grep sshd |
查询进程之间的依赖
1 | [root@host1 ~]# pstree |
树形格式查询进程
1 | [root@host1 ~]# ps --forest |
top 查询进程
- top
top 通常用于动态观察系统的压力情况,和Windows 任务管理器相似
1 | [root@host1 ~]# top |
我们注意到top命令右上角有一个 load average,这是系统的平均负载,表⽰⼀段时间内感知的系统负载,三个数字是最近 1 分钟、5 分钟和 15 分钟内的平均值
负载平均值代表⼀段时间内感知的系统负载。通过报告 CPU 上准备运⾏的进程数以及等待磁盘或⽹络 I/O 完成的进程数,Linux 可以确定负载平均值
还可以通过以下命令显示这三个数字:
1 | [root@host1 ~]# uptime |
这个数字和你的CPU核心数有关系,有一个核心,那每个数字最好都不好接近或超过1,趋近于1就说明CPU可能处于100%,两个核心,那就是不要趋近于2
查询CPU信息
可以看出,我的电脑有4个CPU,每个cpu插槽里有4个核心,每个核心是一个超线程,那就是我有16核心
1 | [root@host1 ~]# lscpu |
1 | [root@host1 ~]# grep "model name" /proc/cpuinfo | wc -l |
TOP 快捷键
| 快捷键 | 效果 |
|---|---|
| u | 过滤⽤⼾名称 |
| M | 按照内存使⽤率,以降序⽅式对进程列表排序 |
| P | 按照处理器使⽤率,以降序⽅式对进程列表排序 |
| k | 中止特定进程 |
| r | 调整nice值 |
| h | 查询top命令其他快捷键或帮助 |
进程或作业管理
每一次的shell命令回车,系统都会创建一个作业或进程
前后台任务调度
安排后台作业
任何命令或管道都可以在后台启动,只需在命令上附加⼀个 & 符号即可
我们在后台安排了一个任务,并看到作业编号为1,进程编号为2875
1 | [lixiaohui@host1 ~]$ sleep 1000 & |
如果将包含竖线 (|) 的命令⾏发送到后台,将显⽰管道中最后⼀个命令的 PID
将后台作业调度到前台
使⽤ fg 命令将后台作业置于前台。使⽤ (%jobNumber) 格式将进程指定到前台
+ 符号表⽰此作业是当前的默认作业。如果不带 %jobNumber 参数使⽤作业控制命令,则对默认作业执⾏操作。- 符号表⽰在当前默认作业完成时将成为默认作业的上⼀作业。
1 | [lixiaohui@host1 ~]$ jobs |
将前台作业调度到后台
要将前台进程发送到后台,在终端中按键盘⽣成的暂停请求 (Ctrl+z)。该作业将被置于后台并暂停,然后执行bg %NUMBER继续后台运行
1 | [lixiaohui@host1 ~]$ jobs |
查询特定所用的所有进程
1 | [lixiaohui@host1 ~]$ pgrep -u lixiaohui |
杀死特定用户的所有进程
有时候我们可能会怀疑被人非法入侵,我们需要知道有谁登录了系统,如果异常,要把用户踢下去
1 | [root@host1 ~]# w |
还有一些杀死进程的方法:
kill PID # 这种是温柔的杀死进程,进程会正常退出
kill -9 #这种是暴力杀死进程,进程数据可能会异常,但是有时候可能也没办法
pgrep和pkill # 查询和杀死特定用户的进程
killall programName #基于名称的杀死进程
第九章 控制服务和守护进程
了解 Systemd
systemd 守护进程管理 Linux 的启动过程,⼀般包括服务启动和服务管理,在红帽企业 Linux 中,第⼀个启动的进程 (PID 1) 是 systemd 守护进程
服务单元介绍
单元通过称为单元⽂件的配置⽂件表⽰,其中封装了关于系统服务、侦听套接字以及与 systemd init 系统相关的其他对象的信息。单元具有名称和单元类型。名称为单元提供唯⼀标识。通过单元类型,可以将单元与其他类似的单元类型分组到⼀起
列出服务单元
使⽤ systemctl 命令来探索系统的当前状态
1 | [root@host1 ~]# systemctl list-units --type=service |
systemctl list-units –type=service 命令仅列出激活状态为 active 的服务单元。systemctl list-units –all 选项可列出所有服务单元,不论激活状态如何
1 | [root@host1 ~]# systemctl list-units --type=service --all |
systemctl 命令 list-units 选项可显⽰ systemd 服务尝试解析并加载到内存中的单元。此选项不显⽰已安装但未启⽤的服务,可以使⽤ systemctl 命令 list-unit-files 选项来查看所有已安装的单元⽂件的状态
1 | [root@host1 ~]# systemctl list-unit-files --type=service |
查看服务状态
使⽤ systemctl status name.type 命令来查看单元的状态
1 | [root@host1 ~]# systemctl status sshd.service |
验证服务的状态
使⽤ systemctl 命令 is-active 选项来验证服务单元是否处于活动状态(正在运⾏)
运⾏ systemctl 命令 is-enabled 选项可验证服务单元是否已启⽤为在系统引导期间⾃动启动
验证单元是否在启动过程中失败,请运⾏ systemctl 命令 is-failed 选项
要列出所有失败的单元,请运⾏ systemctl –failed –type=service 命令
1 | [root@host1 ~]# systemctl is-active sshd.service |
管理服务状态
启动服务
1 | [root@host1 ~]# systemctl start psacct.service |
停止服务
1 | [root@host1 ~]# systemctl stop psacct.service |
启用服务
启用服务使得服务器重启时, 此服务会自动启动,可以加--now来立刻影响服务状态
1 | [root@host1 ~]# systemctl enable psacct.service |
禁用服务
禁用服务使得服务器重启时, 此服务会不自动启动,可以加--now来立刻影响服务状态
1 | [root@host1 ~]# systemctl disable psacct.service |
重启服务
1 | [root@host1 ~]# systemctl restart psacct.service |
重新加载服务
修改了配置文件的参数时,不一定要重启服务,因为重启服务会结束进程,重新启动,而reload是在现有进程基础上重新加载新参数
1 | [root@host1 ~]# systemctl reload psacct.service |
列出服务的依赖项
1 | [root@host1 ~]# systemctl list-dependencies sshd.service |
屏蔽服务
部分服务之间可能彼此冲突,或者你不需要停止a服务后,a服务又被其他管理员启动或被b服务唤醒
1 | [root@host1 ~]# systemctl mask psacct.service |
第十章 配置和保护 SSH
OpenSSH 软件包提供了Secure Shell 或 SSH 协议。借助 SSH 协议,系统能够通过不安全的⽹络在加密和安全的通道中进⾏通信
SSH 命令的基本使用
远程登录系统,不加用户名就是当前用户
1 | [root@host1 ~]# ssh lxh-host2 |
1 | [root@host1 ~]# ssh lixiaohui@lxh-host2 |
查询系统中登录的用户
1 | [lixiaohui@lxh-host2 ~]$ w |
不以交互式方式登录对方,但是用对方的shell环境执行命令
1 | [root@host1 ~]# ssh lixiaohui@lxh-host2 hostname |
主机密钥检查
默认情况下,第一次去连接对方时,对方会给出他的公钥信息,客户端会比比对/etc/ssh/ssh_known_hosts或 ~/.ssh/known_hosts ⽂件中是否已经记录了相关信息,如果没有会问你是否连接对方,接受新密钥,则公钥的副本将保存在 ~/.ssh/known_hosts ⽂件中
1 | [root@host1 ~]# ssh root@servera |
禁用密钥检查
交互式输入yes会打断自动化,所以可以在必要时禁用这个检查
StrictHostKeyChecking 参数在⽤⼾特定的 ~/.ssh/config ⽂件或系统范围的 /etc/ssh/ssh_config ⽂件中设置,或者通过指定 ssh 命令的 -o StrictHostKeyChecking= 选项来设置。
1 | [root@host1 ~]# cat .ssh/config |
1 | [root@serverb ~]# ssh -o StrictHostKeyChecking=yes root@servera |
基于 SSH 密钥的⾝份验证
每次生成新密钥,都会覆盖原有密钥,导致无法用以前的密钥登录
交互式生成密钥文件
1 | [root@serverb ~]# ssh-keygen |
非交互式生成密钥文件
1 | [root@serverb ~]# ssh-keygen -N '' -f ~/.ssh/id_rsa |
分发密钥
分发公钥给所有需要被登录的机器,需要需要分发的公钥不在默认的位置,可以用-i参数来指定文件路径
1 | [root@serverb ~]# ssh-copy-id student@servera |
ssh 密钥管理器
如果在生成密钥的时候指定了使用密钥时的单独密码,每次使用私钥都会问你密码,这个非常不方便也不安全,可以将密钥缓存到ssh-agent程序中
1 | [root@serverb ~]# ssh student@servera |
⾃定义 OpenSSH 服务配置
sshd 守护进程提供 OpenSSH 服务。你可以通过编辑 /etc/ssh/sshd_config ⽂件来配置该服务
禁⽌超级⽤⼾进⾏登录
OpenSSH 服务器使⽤ /etc/ssh/sshd_config ⽂件中的 PermitRootLogin 配置设置,以允许或禁⽌⽤⼾以 root ⽤⼾⾝份登录系统
设置为without-password后,只允许root用密钥登录,不允许密码登录
设置后,需要重启sshd服务
1 | [root@host1 ~]# grep PermitRootLogin /etc/ssh/sshd_config |
禁⽌基于密码的⾝份验证
一般来说,默认是启用的
1 | [root@host1 ~]# grep PasswordAuthentication /etc/ssh/sshd_config |
第十一章 管理网络
网络接口名称的变化
在RHEL 7之后,不再用eth0、eth1来标记网络接口,系统将基于固件信息、PCI 总线拓扑及⽹络设备的类型来分配⽹络接⼝名称
⽹络接⼝名称以接⼝类型开头:
- 以太⽹接⼝以 en 开头
- WLAN 接⼝以 wl 开头
- WWAN 接⼝以 ww 开头
在类型之后,接⼝名称的其余部分将基于服务器固件所提供的信息,或由 PCI 拓扑中设备的位置确定。
- oN 表⽰板载设备,其唯⼀索引为 N,来⾃服务器的固件。eno1 名称是板载以太⽹设备 1。
- sN 表⽰这是⼀个位于 PCI 热插拔插槽 N 中的设备。例如,ens3 代表 PCI 热插拔插槽 3 中的以太
⽹卡。 - pMsN 表⽰这是⼀个位于插槽 N 中总线 M 上的 PCI 设备。wlp4s0 接⼝是位于插槽 0 中 PCI 总线 4
上的 WLAN 卡。
IPV4和IPV6
IPV4概述
IPv4 地址是⼀个 32 位数字,使⽤点号分隔的四个⼗进制⼋位字节(取值范围从 0 到 255)来表⽰。
此类地址分为两个部分,即⽹络前缀和主机编号。⽹络前缀标识唯⼀的物理或虚拟⼦⽹。主机号标识⼦⽹上的特定主机。同一子网中的主机可以无需网关互相通信,⽹络⽹关连接不同的⽹络,⽹络路由器通常充当⼦⽹的⽹关
IPV4 地址计算公式
192.168.1.0/24中一共有多少个地址可用?
1 | 2^(32-24) //2的32-24次方 |
对于/24子网,子网掩码是255.255.255.0,这意味着前24位是网络地址,最后8位是主机地址。因此,我们有2^8 = 256个可能的地址组合。
但是,我们需要减去两个地址:
网络地址(Network Address):它是子网的第一个地址,用于标识整个子网。例如,在192.168.1.0/24子网中,网络地址是192.168.1.0。
广播地址(Broadcast Address):它是子网的最后一个地址,用于向子网内的所有设备发送广播消息。在192.168.1.0/24子网中,广播地址是192.168.1.255。
因此,对于/24子网,实际可用的主机地址是256(总地址数) - 2(网络地址和广播地址) = 254个。
IPV6概述
IPv6 地址是⼀个 128 位数字,通常表⽰为⼋组以分号分隔的四个⼗六进制半字节。每个半字节均表⽰ 4 位的 IPv6 地址,因此每个组表⽰ 16 位的 IPv6 地址,在IPV6中的字母只能时A-F。
1 | 2001:0db8:0000:0010:0000:0000:0000:0001 |
简化IPV6写法
- 去掉前导零
1 | 2001:db8:0:10:0:0:0:1 |
- 去掉连续零
连续都是0时,用::表示,但是一个地址中只能出现一次
1 | 2001:db8:0:10::1 |
- 加端口的写法
如果在 IPv6 地址后⾯包括 TCP 或 UDP ⽹络端⼝,请始终将 IPv6 地址括在⽅括号中,以便端⼝不会被误认为是地址的⼀部分。
1 | [2001:db8:0:10::1]:80 |
主机名解析和 IP 地址映射
/etc/hosts⽂件中为每个主机名创建静态条⽬,但是需要管理员手工更新,且只影响此机器,影响不到别的机器/etc/resolv.conf⽂件中列出了所有使用中的DNS服务器地址
查询网络接口和IP
1 | [root@lixiaohui ~]# ip addr show |
- 网络接口有2个,
lo和ens160,其中lo为连接到服务器本⾝的环回设备,不能用于网络互通 ens160接口上的IPV4地址是:172.25.254.250/24ens160接口上的MAC地址是:00:0c:29:6a:16:13ens160接口上的IPV6地址是:fe80::20c:29ff:fe6a:1613/64
测试网络通畅
ping 命令可以测试连接。该命令将持续运⾏,直到按下 Ctrl+c 为⽌,或者指定-c参数
ping6命令可以测试ipv6连接
1 | [root@lixiaohui ~]# ping 127.0.0.1 |
查询路由
1 | [root@lixiaohui ~]# ip route |
追踪流量路由
可使⽤ traceroute 或tracepath 命令来完成追踪流量路由,通常,默认情况下系统不安装 traceroute 命令。
tracepath6 和 traceroute -6 命令等效于 IPv6 版本的 tracepath 和 traceroute 命令。
1 | [root@lixiaohui ~]# tracepath classroom |
端⼝和服务故障排除
/etc/services ⽂件中列出了标准端⼝的常⽤名称
ss 命令可⽤于显⽰套接字统计信息。ss 命令取代了 net-tools 软件包中所含的较早的⼯具netstat
1 | [root@lixiaohui ~]# ss -tunlpa |
-n显⽰接⼝和端⼝的编号,⽽不显⽰名称-t显⽰ TCP 套接字-u显⽰ UDP 套接字-l仅显⽰侦听中的套接字-a显⽰所有(侦听中和已建⽴的)套接字-p显⽰使⽤套接字的进程
NetworkManager
可以通过命令⾏或图形⼯具与 NetworkManager 服务交互。服务配置⽂件存储在 /etc/NetworkManager/system-connections/ ⽬录中。
NetworkManager 服务⽤于管理⽹络设备和⽹络连接。
- 设备是提供⽹络流量的物理或虚拟⽹络接⼝。
- 连接拥有单个⽹络设备的相关配置设置。连接也可称为⽹络配置集。每个连接必须具有唯⼀的名称或 ID,可以与其配置的设备名称匹配,
单个设备可以有多个连接配置并在它们之间切换,但每个设备只能有⼀个连接处于活跃状态
查看⽹络信息
以下信息中,eth0这个网络是类型是Ethernet,并已经连接到lxh-connection的链接,eno2的state部分显示disconnected,表示此接口此时不用于网络通信
1 | [root@lixiaohui ~]# nmcli device status |
查询所有链接
nmcli connection show 命令可显⽰所有连接的列表。使⽤ --active 选项可仅列出活动的连接
1 | [root@lixiaohui ~]# nmcli con show |
查询具体的网络连接详情
1 | [root@lixiaohui system-connections]# nmcli connection show lxh-con2 |
添加⽹络连接
使⽤ nmcli connection add 命令来添加⽹络连接,可以采取TAB键不断的补齐参数
以下命令将lxh-con2添加到eth0设备上,并将IPV4设置为1.1.1.1/24,网关设置为1.1.1.2,DNS设置为1.1.1.3,需要特别注意ipv4.method 参数设置为manual,只有设置为manual,你手工设置的网络信息才会优先生效,autoconnect yes为服务器重启时,自动激活此链接
1 | [root@lixiaohui ~]# nmcli connection add con-name lxh-con2 type ethernet ifname eth0 ipv4.method manual ipv4.addresses 1.1.1.1/24 ipv4.gateway 1.1.1.12 ipv4.dns 1.1.1.3 autoconnect yes |
以下命令将lxh-con3添加到eth0设备上,并将IPV6设置为2000::1/64,网关设置为2000::2,DNS设置为2000::3,需要特别注意ipv6.method参数设置为manual,只有设置为manual,你手工设置的网络信息才会优先生效,autoconnect yes为服务器重启时,自动激活`此链接
1 | [root@lixiaohui ~]# nmcli connection add con-name lxh-con3 type ethernet ifname eth0 ipv6.method manual ipv6.addresses "2000::1/64" ipv6.gateway "2000::2" ipv6.dns "2000::3" autoconnect yes |
查看具体的网络配置文件
1 | [root@lixiaohui system-connections]# cat /etc/NetworkManager/system-connections/lxh-con2.nmconnection |
修改网络连接
将lxh-con2的连接IP改为2.2.2.2/24,并添加另一个IP地址3.3.3.3/24到此连接上
+号可以用在ip地址、dns等信息上,用于添加辅助网络信息
1 | [root@lixiaohui ~]# nmcli connection modify lxh-con2 ipv4.addresses 2.2.2.2/24 +ipv4.addresses 3.3.3.3/24 |
激活网络连接
需要注意的是,一个设备同时只能激活一个连接
1 | [root@lixiaohui ~]# nmcli connection up lxh-con2 |
关闭网络连接
关闭网络连接后,可能会面临断网的情况
1 | [root@lixiaohui ~]# nmcli connection down lxh-con2 |
除了关闭网络连接外,还可以直接断开网络设备的连接
1 | [root@lixiaohui ~]# nmcli device disconnect eth0 |
重新加载网络连接
1 | [root@lixiaohui ~]# nmcli connection reload lxh-con2 |
删除网络连接
1 | [root@lixiaohui ~]# nmcli connection delete lxh-con2 |
更新系统主机名
hostname或hostnamectl命令可以显示主机名,hostnamectl命令可以设置主机名,主机名将放入到/etc/hostname中
1 | [root@lixiaohui ~]# hostnamectl |
配置名称解析
/etc/hosts⽂件中为每个主机名创建静态条⽬,但是需要管理员手工更新,且只影响此机器,影响不到别的机器/etc/resolv.conf⽂件中列出了所有使用中的DNS服务器地址
测试一下DNS名称解析
getent将先查询/etc/hosts,如果没找到,才找dns服务器,所以此命令可以帮助测试hosts文件
host、dig不会查看/etc/hosts
1 | [root@lixiaohui ~]# host servera |
第十二章 安装和更新软件包
系统订阅与注册
Linux 系统需要以安装软件包的方式丰富服务器功能,而红帽提供了在线的增值服务,给我们提供高质量的软件包仓库,我们从仓库中可以安装软件,这要求我们将系统注册到红帽网络,这个会涉及到购买服务,作为开发者,可以用以下连接完成注册为开发者,临时获得此服务
1 | RHEL 开发者订阅注册:https://developers.redhat.com/register |
以下命令完成了系统注册
1 | [root@lixiaohui ~]# subscription-manager register --username 939958092@qq.com |
以下命令取消了系统注册
1 | [root@lixiaohui ~]# subscription-manager unregister |
不过需要注意的是在RHEL8.8以上的版本中,注册管理的命令改为了rhc
注册系统
1 | rhc connect -u <_username_> -p <_password_> |
取消注册
1 | rhc disconnect |
RPM 软件包描述
RPM 软件包管理器最初是由红帽开发的,提供了⼀种标准的⽅式来打包软件进⾏分发,借助 RPM 软件包,管理员可以跟踪软件包会安装哪些⽂件,卸载软件包时将删除哪些⽂件,并且在安装时验证是否存在⽀持软件包
RPM 软件包⽂件名由四个元素组成(再加上 .rpm 后缀):name-version-release.architecture:
coreutils-8.32-21.el9.x86_64.rpm
coreutils是名字
8.32是版本
21.el9是发行版本号以及平台名称,此处是适用于el9的21此发行版本
x86_64是CPU指令集,这代表64位
- rpm -qa :列出所有已安装的软件包
- rpm -qf FILENAME :确定提供 FILENAME 的软件包
- rpm -q coreutils:列出当前安装的软件包版本
- rpm -qi coreutils:获取软件包的详细信息。
- rpm -ql coreutils:列出软件包安装的⽂件
- rpm -qc coreutils:仅列出软件包安装的配置⽂件
- rpm -qd coreutils:仅列出软件包安装的⽂档⽂件
- rpm -q –scripts :列出在安装或删除软件包之前或之后运⾏的 shell 脚本
- rpm -q –changelog :列出软件包的更改⽇志信息
- rpm -qlp coreutils-8.32-21.el9.x86_64.rpm:列出本地软件包安装的⽂件。
- rpm -ivh podman-4.0.0-6.el9.x86_64.rpm。使⽤ rpm 命令来安装已下载到本地⽬录的 RPM 软件包
- rpm2cpio httpd-2.4.51-7.el9_0.x86_64.rpm | cpio -idv rpm2cpio 命令将 RPM 软件包转换为 cpio 归档。将 RPM 软件包转换为 cpio 归档后,可以使⽤cpio 命令提取⽂件列表
DNF 管理软件包
在新版本的Linux上,DNF命令取代了以前的YUM命令,但YUM依旧可以使用,但会自动链接到DNF并执行
DNF 仓库配置
和RPM不同,DNF依赖于仓库的存在,DNF并不要求你指定软件包的具体位置,你只需要指定名称,就可以通过DNF命令来完成安装、更新、卸载等操作,DNF会自动从你配置的仓库中,搜索下载软件包
列出本地仓库
1 | [root@lixiaohui ~]# dnf repolist all |
所有的仓库将以文件的方式存在于/etc/yum.repos.d/中,此路径中包括在系统中可用的仓库文件,文件名要求以repo结尾,具体格式如下:
1 | [root@lixiaohui ~]# cat /etc/yum.repos.d/rhel_dvd.repo |
禁用和启用仓库
1 | [root@lixiaohui ~]# dnf config-manager --disable rhel-9.3-for-x86_64-baseos-rpms |
1 | [root@lixiaohui ~]# dnf config-manager --enable rhel-9.3-for-x86_64-baseos-rpms |
添加 DNF 仓库
1 | [root@lixiaohui ~]# dnf config-manager --add-repo="https://dl.fedoraproject.org/pub/epel/9/Everything/x86_64/" |
默认情况下,命令添加仓库时,没有GPG公钥,这个需要自己手工下载到系统中,并在repo文件中添加,添加好之后的样例如下:
1 | [EPEL] |
DNF 安装软件
1 | [root@lixiaohui ~]# dnf install httpd -y |
列出已安装的软件包
1 | [root@lixiaohui ~]# dnf list installed |
列出在仓库中可用的软件包
1 | [root@lixiaohui ~]# dnf list available |
DNF 搜索软件包
1 | [root@lixiaohui ~]# dnf search all 'web server' |
查看软件包信息
1 | [root@lixiaohui ~]# dnf info httpd |
查询文件来源
1 | [root@lixiaohui ~]# dnf provides /var/www/html |
删除软件包
1 | [root@lixiaohui ~]# dnf remove httpd |
更新软件包
注意 如果dnf update后面不加软件包名字,它将更新系统中的所有软件包,其中就包括内核
1 | [root@lixiaohui ~]# dnf list kernel |
只更新特定软件包:
1 | [root@lixiaohui ~]# dnf update httpd |
列出软件包组
dnf 命令也具有组的概念,即⼀起安装的相关软件集合。
1 | [root@lixiaohui ~]# dnf grouplist |
查询软件包组信息
这些集合提供的软件包或组可以列为 mandatory(安装该组时必须予以安装)、default(安装该组时通常会安装),或 optional(安装该组时不予安装,除⾮特别要求)
1 | [root@lixiaohui ~]# dnf groupinfo "System Tools" |
安装软件包组
1 | [root@lixiaohui ~]# dnf group install "RPM Development Tools" -y |
DNF 事务
所有安装和删除事务的⽇志都记录在 /var/log/dnf.rpm.log 中。
1 | [root@lixiaohui ~]# tail /var/log/dnf.rpm.log |
查询DNF 历史
1 | [root@lixiaohui ~]# dnf history |
撤销DNF事务
从上面的查询来看,ID为2是安装了httpd软件包,撤销就是卸载的意思
1 | [root@lixiaohui ~]# dnf history undo 2 |
重做DNF事务
刚卸载了httpd,现在可以redo重做事务来再安装
1 | [root@lixiaohui ~]# dnf history redo 2 |
第十三章 访问 Linux ⽂件系统
识别⽂件系统和设备
从RHEL 7开始默认的文件系统为XFS
挂载点
通过将⽂件系统挂载到空⽬录来访问⽂件系统的内容。该⽬录被称为挂载点,⽬录挂载后,使⽤ ls 命令列出该⽬录的内容。许多⽂件系统系统启动时⾃动挂载。
块设备
块设备是提供存储设备低级别访问权限的⽂件。必须对块设备进⾏可选分区,并创建⽂件系统,然后才能挂载该设备。
/dev ⽬录存储 RHEL ⾃动为所有设备创建的块设备⽂件。在 RHEL 9 中,检测到的第⼀个SATA、SAS、SCSI 或 USB 硬盘驱动器被称为 /dev/sda 设备,第⼆个被称为 /dev/sdb 设备,以此类推。这些名称代表整个硬盘驱动器。
磁盘分区
分区本⾝就是块设备。例如,在第⼀ SATA 附加存储中,第⼀分区是 /dev/sda1 磁盘。同⼀存储的第⼆分区是 /dev/sda2 磁盘。
逻辑卷
整理磁盘和分区的另⼀种⽅式是利⽤逻辑卷管理 (LVM)。借助 LVM,可以将多个块设备聚合到⼀个卷组中。卷组中的磁盘空间分割成若⼲逻辑卷,它们的功能等同于物理磁盘上的分区。
LVM 系统在创建时为卷组和逻辑卷分配名称。LVM 在 /dev ⽬录中创建⼀个名称与组名匹配的⽬录,然后在该新⽬录中创建⼀个与逻辑卷同名的符号链接。之后,可以挂载该逻辑卷⽂件。例如,如果存在⼀个 myvg 卷组和 mylv 逻辑卷,那么其逻辑卷的完整路径名是 /dev/myvg/mylv。
文件系统查询
- 使⽤ df 命令可显⽰本地和远程⽂件系统设备的概览,其中包括总磁盘空间、已⽤磁盘空间、可⽤
磁盘空间,以及占整个磁盘空间的百分⽐
df 命令的 -h 或 -H 选项是⼈类可读选项,可以改善输出⼤⼩的可读性。-h 选项的报告单位是 KiB(1024进制),⽽ -H 选项的报告单位是 SI 单位(1000进制)
1 | [root@lixiaohui ~]# df -h |
- du 命令的 -h 和 -H 选项可以将输出转换为⼈类可读格式。du 命令以递归⽅式显⽰当前⽬录树中所有⽂件的⼤⼩。
1 | [root@lixiaohui ~]# du /boot |
挂载和卸载⽂件系统
⼿动挂载⽂件系统
通过 mount 命令,root ⽤⼾可以⼿动挂载⽂件系统。mount 命令的第⼀个参数指定要挂载的⽂件系统。第⼆个参数指定在⽂件系统层次结构中⽤作挂载点的⽬录。
可以使⽤ mount 命令,以下列⽅式之⼀挂载⽂件系统:
- 使⽤ /dev ⽬录中的设备⽂件名。
- 使⽤ UUID,即设备的通⽤唯⼀标识符。
注意 如果使⽤ mount 命令挂载⽂件系统,之后⼜重新了启动系统,该⽂件系统不会⾃动重新挂载,需要手工挂载,在RH134课程中,我们将介绍如何处理此情况
识别块设备
使⽤ lsblk 命令可列出指定块设备或所有可⽤设备的详细信息
1 | [root@lixiaohui ~]# lsblk |
使⽤分区名称挂载⽂件系统
1 | [root@lixiaohui ~]# mount /dev/vdb1 /mnt |
使⽤分区 UUID 挂载⽂件系统
1 | [root@lixiaohui ~]# mount UUID="8599ac53-e0cc-4ca0-a3eb-233ccbcff9bd" /opt |
卸载⽂件系统
umount 命令使⽤挂载点作为参数,以卸载⽂件系统。
1 | [root@lixiaohui ~]# umount /mnt |
如果挂载的⽂件系统在使⽤之中,则⽆法卸载。要成功执⾏ umount 命令,所有进程必须停⽌访问挂载点下的数据。lsof 命令可列出所有打开的⽂件,以及访问该⽂件系统的进程。此列表可以帮助识别哪些进程正在阻⽌⽂件系统被成功卸载
1 | [root@lixiaohui opt]# lsof | grep /opt |
查找系统中的⽂件
- locate 命令搜索预⽣成索引中的⽂件名或⽂件路径,并即时返回结果。此命令速度较快,因为它是从 mlocate 数据库中
查找这些信息的。但是,此数据库不会实时更新,需要频繁更新才能获得准确结果。
先更新数据库
1 | [root@lixiaohui ~]# updatedb |
再查询
-i 忽略大小写
-n 限制返回的搜索结果数
1 | [root@lixiaohui ~]# locate passwd |
- find 命令通过解析整个⽂件系统层次结构来实时搜索⽂件,此命令速度⽐ locate 命令慢,但更加准确。此外,find 命令还可以根据⽂件名以外的条件搜索⽂件,例如⽂件的权限、⽂件、⼤⼩或修改时间。
基于名称的查询
1 | find / -name sshd_config |
基于用户或组的查询
1 | find -user developer |
基于特定权限的查询,权限前⾯带有 / 或 - 符号,以控制搜索结果
带有 / 符号将匹配权限集中为⽤⼾、组或其他⼈设置了⾄少⼀个权限的⽂件。具有r–r–r– 权限的⽂件与 /222 权限不匹配,但与 rw-r–r– 权限匹配。
权限前带有 - 符号表⽰权限的所有三个部分都必须匹配。对于上⼀⽰例,具有 rw-rw-rw- 权限的⽂件将符合条件
1 | find /home -perm 764 |
基于文件大小的查询
1 | find -size 10M |
基于时间的查询
1 | find / -mmin 120 |
基于文件类型的查询
1 | find /etc -type d |
第十四章 分析服务器和获取支持
分析和管理远程服务器
Web 控制台
⾃红帽企业 Linux 7 起,除了最⼩安装外,所有安装中都默认安装 Web 控制台,直接启用即可
1 | [root@lixiaohui ~]# systemctl enable --now cockpit |
也可以用以下方式来安装
1 | [root@lixiaohui ~]# dnf install cockpit |
想要被外部访问到,需要在防火墙开通cockpit或者9090端口号
1 | [root@lixiaohui ~]# firewall-cmd --add-service=cockpit --permanent |
访问控制台可以用http://IP:9090来访问
如果root用户无法登录,可按照以下方式解除root用户限制,在编辑文件后,去掉root字样即可
1 | [root@lixiaohui ~]# vim /etc/cockpit/disallowed-users |
创建sosreport
sos 报告通常是红帽技术⽀持调查所报告问题的起点,⽤于收集红帽技术⽀持调查所报告问题所需的诊断信息。
创建报告
1 | [root@lixiaohui ~]# sos report |
如果你想限制一些隐私,可以尝试sos clean
1 | [root@lixiaohui ~]# sos clean /var/tmp/sosreport-lixiaohui-2026-02-18-ectivgc.tar.xz |
红帽智能分析insights-client
1 | [root@lixiaohui ~]# dnf install insights-client |
使⽤ insights-client 命令可以刷新客⼾端的元数据
注册完成后,打开:https://console.redhat.com/insights在 Web UI 的 Inventory 部分下可以看到系统。
在同样的这个页面中,点击左侧的按钮,查看系统的分析和诊断信息