1
2
3
4
5
作者:李晓辉

微信联系:lxh_chat

联系邮箱: 939958092@qq.com

第一章 红帽企业 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 作为企业级与开发者首选的操作系统,具备以下显著优点:

开源驱动创新

Linux 是开源软件,意味着你可以:

  • 深入了解系统的工作机制
  • 自由修改源代码以满足个性化需求
  • 快速迭代与创新,推动技术演进

💡 适合研发人员、系统架构师进行深度定制与优化

强大的命令行接口(CLI)

Linux 提供高效的命令行环境,具备:

  • 快速访问与操作系统资源的能力
  • 强大的脚本化支持(如 Bash),可实现自动化任务
  • 适合 DevOps、运维工程师进行批量管理与部署

🛠️ CLI 是提升效率与掌控力的利器

模块化设计,灵活可控

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

以上三者之间的区别如下所示:

fedora-centos-rhel-dff

基于 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 Linuxfedoraproject.org社区驱动的免费发行版,包括 Fedora CoreOS
EPEL / EPEL NextEPEL 文档提供 RHEL 默认未包含的额外软件包
CentOS Streamcentos.org/centos-streamRHEL 的上游版本,适合开发者提前适配

📦 以上资源均可免费使用,适合学习与非生产环境测试

开发者下载红帽系统可能需要有开发者订阅,此订阅是免费注册的,具体链接如下:

RHEL 开发者订阅注册:https://developers.redhat.com/register

RHEL 下载链接:https://access.redhat.com/downloads/content/rhel

RHEL 10 的镜像模式

红帽企业 Linux 10 引入了镜像模式(Image Mode),这是一种基于容器原生工具的新型操作系统部署与管理方式。

核心理念:操作系统即镜像

  • 使用容器原生工具构建、部署和管理操作系统
  • 通过**可启动容器镜像(bootc)**完成系统部署
  • 支持将构建好的镜像推送至镜像仓库,实现集中管理与分发

📦 bootc 镜像是可直接启动的系统镜像,适用于边缘设备与云原生场景

镜像构建流程

  1. 选择 RHEL 组件与所需软件包
  2. 使用镜像构建器工具生成 bootc 镜像
  3. 推送至镜像仓库(如 Quay、Red Hat Registry)
  4. 在目标设备上拉取并部署镜像

🧪 镜像可预集成依赖项,实现“即部署即运行”的体验

镜像模式的优势

优势维度说明
🔒 限制基础架构偏移保持一致性,避免环境漂移
📈 增强可扩展性支持大规模边缘设备部署
🛠️ 简化故障排除镜像可回滚、重建,提升运维效率

💡 镜像模式是 RHEL 向云原生架构演进的重要里程碑

第二章 访问命令⾏

Bash Shell 简介

在 Linux 系统中,命令行是一种基于文本的交互界面,用户通过它向系统输入指令。命令行由名为 Shell 的程序提供支持。

🧠 什么是 Shell?

  • Shell 是用户与操作系统之间的桥梁
  • 接收用户输入的命令并将其传递给系统执行
  • 多年来发展出多种 Shell 变体,如:shbashzshcsh
  • 每位用户可以选择不同的 Shell,但红帽建议使用默认 Shell 进行系统管理

🧭 Shell 是 Linux 运维与自动化的核心工具

🐚 Bash:红帽默认 Shell

  • RHEL 默认提供的 Shell 是 GNU Bourne-Again Shell(Bash)
  • Bash 是 UNIX 原始 Bourne Shell(sh)的增强版本
  • 支持命令历史、自动补全、脚本编写等高级功能
  • 广泛用于系统管理、脚本自动化与认证考试中

Shell 提示符(Prompt)

当 Shell 等待用户输入时,会显示一个提示符字符串:

  • 普通用户的提示符通常以美元符号 $ 结尾
  • 超级用户(root)的提示符则以井号 # 结尾

示例:

1
2
[lixiaohui@host1 ~]$ 
[root@host1 ~]#

🔐 提示符不仅反映身份,还影响命令权限与系统安全

🧩 Shell 命令的基本结构

在 Shell 提示符下输入的命令通常由三个基本部分组成:

1️⃣ 命令(Command)

  • 要执行的程序名称
  • 是整个指令的核心动作
  • 例如:lscpmkdiryumsystemctl

2️⃣ 选项(Option)

  • 用于调整命令的行为或功能
  • 通常以一个或两个破折号开头:
    • 单字符选项:-a-l
    • 多字符选项:--all--help
  • 可组合使用,如:ls -al

3️⃣ 参数(Argument)

  • 命令的目标对象,如文件名、路径、服务名等
  • 指定命令作用的具体位置或对象
  • 例如:ls /etccp 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 登录最常见的远程文本登录方式,适用于大多数运维场景

🛠️ 串行控制台是故障排查与紧急访问的重要手段

登录远程系统

在现代计算环境中,Linux 用户与管理员常常需要通过网络连接远程系统,以获取命令行访问权限。

为什么需要远程登录?

  • 许多服务器是虚拟机或云实例,无法直接连接键盘与显示器
  • 公共云与私有云中的实例通常不提供物理控制台或串口访问
  • 运维人员需远程管理这些系统,执行命令、部署服务或排查故障

🧭 远程登录是现代 DevOps 与云运维的基础技能

SSH:远程登录的标准方式

  • SSH(Secure Shell) 是一种加密的远程连接协议
  • 提供安全的命令行访问,支持身份验证与数据加密
  • 大多数 Linux 系统(包括 RHEL)和 macOS 都内置 OpenSSH 客户端程序 ssh

📌 SSH 登录示例

假设当前用户在本地主机(host1)上,使用 lixiaohui 用户身份登录远程 Linux 系统 host1

1
2
[lixiaohui@host1 ~]$ ssh lixiaohui@host2
lixiaohui@host2's password: `password`
部分说明
ssh命令名称,表示使用 SSH 协议连接远程系统
lixiaohui登录远程系统的用户名
host1远程系统的主机名或 IP 地址

🔒 登录后将获得远程系统的 Shell 提示符,可执行命令与脚本

在第一次连接陌生的机器时,会提示你 yes/no,如果确认机器无误,输入yes回车即可连接,任务完毕后,输入 exit 退出SSH会话

SSH(Secure Shell)通过加密连接防止通信被窃听或密码被劫持。在现代云环境中,许多系统(如新建云实例)禁止使用密码登录,改为使用更安全的公钥身份验证

SSH 公钥身份验证

SSH(Secure Shell)通过加密连接防止通信被窃听或密码被劫持。在现代云环境中,许多系统(如新建云实例)禁止使用密码登录,改为使用更安全的公钥身份验证

🧠 公钥身份验证的原理

  • 用户拥有一个包含私钥的身份文件,相当于保密的密码
  • 远程服务器上的账户配置了与之匹配的公钥,该公钥不需要保密
  • 登录时,系统使用私钥与公钥进行匹配验证,无需输入密码

🛡️ 公钥身份验证提升了远程登录的安全性与自动化能力

📌 SSH 公钥登录示例

假设用户在本地主机 host1 上,使用 lixiaohui 用户身份,通过私钥文件 secret.pem 登录远程系统:

1
2
[lixiaohui@host1 ~]$ ssh -i secret.pem lixiaohui@host2
[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
2
lixiaohui  readme.txt
hello

🧪 系统会依次执行 echodate,并分别输出结果,然后返回新的 Shell 提示符

⚠️ 注意事项

  • 分号后必须有空格,以避免与命令名混淆
  • 分号不会判断前一个命令是否成功,始终执行后续命令
  • 若需在前一个命令成功时才执行下一个命令,请使用 &&(逻辑与)

🔁 对比:; vs &&

运算符含义示例执行条件
;顺序执行所有命令cmd1; cmd2始终执行 cmd2
&&仅当前一个命令成功时执行cmd1 && cmd2cmd1 成功才执行 cmd2

获取时间

我们注意到不同的选项有不同的结果

1
2
3
4
5
6
[lixiaohui@host1 ~]$ date
Wed Jan 31 10:53:33 PM CST 2026
[lixiaohui@host1 ~]$ date +%R
22:53
[lixiaohui@host1 ~]$ date +%x
01/31/2026

更改用户的密码

普通用户改自己的密码需要输入当前密码才可以改,而且普通用户无法给别人改密码

超级用户root可以给别人改密码,且不需要当前密码

1
2
3
4
5
6
7
8
9
[lixiaohui@host1 ~]$ passwd
Changing password for user lixiaohui.
Current password:
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[lixiaohui@host1 ~]$
[lixiaohui@host1 ~]$ passwd user1
passwd: Only root can specify a user name.
1
2
3
4
5
6
7
8
9
10
[lixiaohui@host1 ~]$ su - root
Password:
Last login: Wed Jan 31 22:48:06 CST 2026 from 172.25.254.1 on pts/0
[root@host1 ~]#
[root@host1 ~]# passwd lixiaohui
Changing password for user lixiaohui.
New password:
BAD PASSWORD: The password is a palindrome
Retype new password:
passwd: all authentication tokens updated successfully.

识别文件类型

在 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
2
3
4
5
6
7
[lixiaohui@host1 ~]$ file /etc/passwd
/etc/passwd: ASCII text
[lixiaohui@host1 ~]$ file /bin/passwd
/bin/passwd: setuid ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=a467cb9c8fa7306d41b96a820b0178f3a9c66055, for GNU/Linux 3.2.0, stripped
[lixiaohui@host1 ~]$
[lixiaohui@host1 ~]$ file /home
/home: directory

查看文件内容

cat more less head tail 等命令可以用来查看文件内容

  1. cat 用于全文输出,通常用于小型文件, 命令后可以跟多个文件用于一起输出
1
2
3
4
[lixiaohui@host1 ~]$ cat /readme.txt /mnt/test.txt
This is a vm for RedHat Training,Created by Xiaohui Li, Contact me via WeiXin: Lxh_Chat, QQ: 939958092

test file
  1. 文件较长时就不推荐用cat了,less 命令⼀次显⽰⽂件的⼀个⻚⾯,可以按上下键一行一行查看,也可以按下up和down键来一页一页查看,按q结束查看
1
[lixiaohui@host1 ~]$ less /etc/passwd
  1. head 和 tail 命令分别显⽰⽂件的开头和结尾部分。默认情况下,这两个命令显⽰⽂件的 10 ⾏,但它们都有⼀个 -n 选项,允许指定不同的⾏数。

查看文件开头的10行或2行

1
2
[lixiaohui@host1 ~]$ head /etc/passwd
[lixiaohui@host1 ~]$ head -n 2 /etc/passwd

查看文件结尾的10行或2行

1
2
[lixiaohui@host1 ~]$ tail /etc/passwd
[lixiaohui@host1 ~]$ tail -n 2 /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
2
3
4
wc /etc/passwd         # 显示行、词、字符总数
wc -l /etc/passwd # 仅显示行数
wc -w /etc/passwd # 仅显示单词数
wc -c /etc/passwd # 仅显示字符数

Tab 补全

Tab 补全是 Bash 提供的高效输入辅助功能,适用于命令、参数与路径补齐。

🧠 命令补齐

  • 输入命令前缀后按一次 Tab:若唯一匹配,则自动补齐
  • 输入命令前缀后按两次 Tab:显示所有可能匹配项

命令和参数补齐

1
2
3
4
5
6
[lixiaohui@host1 ~]$ pasTab+Tab # 手工输入了pas字符串,并快速按下两次TAB键,会自动找出所有以pas开头的命令,结果有多个匹配
passwd paste pasuspender
[lixiaohui@host1 ~]$ passTab # 手工输入了pass字符串,并快速按下一次TAB键, 会自动找出所有以pass开头的命令,结果只有一个匹配,会自动补齐剩下的字符串
[lixiaohui@host1 ~]$ passwd
Changing password for user lixiaohui.
Current password:
1
2
3
[root@host ~]# useradd --Tab+Tab ## 手工输入useradd --后快速按下两次TAB,可以用于补齐参数

--badnames --gid --no-log-init

路径补齐

Tab 补全可以帮助在键⼊⽂件名作为命令的参数时将它们补全。按 Tab,尽可能将⽂件名补充完整。

1
2
3
[user@host ~]$ ls /etc/pasTab # 手工输入了/etc/pas字符串,并快速按下一次TAB键,就会自动补齐/etc/passwd
[user@host ~]$ ls /etc/passwdTab # 自动补齐/etc/passwd字符串,并快速按下一次TAB键,就会自动补齐/etc/passwd开头的所有文件路径和名称
passwd passwd-

使用反斜杠 \ 拆分长命令

在 Bash 中,具有多个选项和参数的命令可能会变得冗长、不易阅读。为提升可读性与可维护性,可以使用**反斜杠(\)**将命令拆分为多行。

🧠 什么是反斜杠?

  • \ 是 Bash 中的转义字符
  • 用于告诉 Shell:当前命令尚未结束,下一行是其延续
  • 拆分后的命令在逻辑上仍被视为一条完整命令

📌 示例:多文件行数统计

1
2
3
[lixiaohui@host1 ~]$ wc -l /etc/passwd \
> -l /etc/fstab \
> -l /readme.txt

输出结果:

1
2
3
4
45 /etc/passwd
17 /etc/fstab
1 /readme.txt
63 total

⚠️ 注意:从第一次使用 \ 并回车后,Shell 会自动显示 > 作为命令续行提示符。无需手动输入 > 符号

✅ 使用反斜杠的优势

优点说明
📖 提高可读性将复杂命令分行书写,结构更清晰
🛠️ 便于维护修改参数或路径更方便
🧪 避免输入错误减少因命令过长导致的拼写或格式错误

操作命令历史记录

history 命令显⽰之前执⾏的命令的列表,带有命令编号作为前缀。默认提供1000条历史记录

1
2
[lixiaohui@host1 ~]$ set | grep -i histsize
HISTSIZE=1000
1
2
3
4
5
6
7
8
9
10
[lixiaohui@host1 ~]$ history
...output omitted...
23 clear
24 who
25 pwd
26 ls /etc
27 uptime
28 ls -l
29 date
30 history

重复调用历史输入过的命令

  1. 字符匹配法

这种方法会自动从history命令的输出中自下向上匹配开头的字符串是否匹配,匹配到第一个就执行

1
2
3
4
[lixiaohui@host1 ~]$ !ls
ls -l
total 0
drwxr-xr-x. 2 student student 6 Feb 27 19:24 Desktop
  1. 数字法匹配

这种方法需要你知道准确的history命令行编号

1
2
3
[lixiaohui@host1 ~]$ !26
ls /etc
abrt hosts
  1. 快捷键匹配

在bash中,按下ctrl r 后,输入的任何字符串都会从history中,自下向上匹配,如果显示的内容不符合要求,可以再多输入一些内容,它会再次匹配

以下例子中,我按下了ctrl r,然后输入了一个w字符串,它自动识别到了wc -l /etc/passwd -l /etc/fstab -l /readme.txt

1
2
[lixiaohui@host1 ~]$
(reverse-i-search)`w': wc -l /etc/passwd -l /etc/fstab -l /readme.txt

快速访问上一次参数

同时使⽤ Esc+. 或 Alt+. 组合键,在光标的当前位置插⼊上⼀命令的最后⼀个单词,Alt+. 组合键尤其⽅便,因为你可
以按住 Alt 键,再反复按 . 键来轻松地循环更早的命令。

1
2
3
[lixiaohui@host1 ~]$ ls /etc/passwd
/etc/passwd
[lixiaohui@host1 ~]$ cat /etc/passwd # 此处的/etc/passwd并非是我手工输入,是按下alt和英文句号的自动效果

Bash 快捷键速查表

快捷键描述
Ctrl + A跳到命令行开头
Ctrl + E跳到命令行末尾
Ctrl + U清除光标到行首的内容
Ctrl + K清除光标到行尾的内容
Ctrl + ←跳到前一个单词开头
Ctrl + →跳到下一个单词末尾
Ctrl + R搜索历史命令

第三章 从本地⽂档获取帮助

掌握获取帮助的方式是 Linux 运维的基本技能之一,尤其在命令众多、参数复杂的环境中,快速查阅文档能显著提升效率。

常规命令帮助

许多命令内置简要帮助信息,可通过以下方式查看:

1
2
[lixiaohui@host1 ~]$ useradd --help
[lixiaohui@host1 ~]$ useradd -h

📌 适用于快速了解命令语法与常用选项

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
2
3
4
[lixiaohui@host1 ~]$ man 5 useradd
No manual entry for useradd in section 5
[lixiaohui@host1 ~]$ man passwd
[lixiaohui@host1 ~]$ man 5 passwd

🔍 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+,支持一键注册与智能分析集成

📌 注册流程说明

  1. 注册系统:将系统与红帽账户绑定,获取唯一身份证书
  2. 启用存储库:自动启用默认仓库,或手动启用其他内容源
  3. 查看授权:在混合云控制台的 Subscription Inventory 页面查看使用情况
  4. 启用智能分析(可选):注册后可使用预测性分析与修复建议服务

使用 rhc 工具注册系统

  • 适用于 RHEL 8.8 及以上版本
  • 默认启用以下三项功能:
功能名称说明
content访问红帽内容仓库
analytics启用智能分析服务
remote-management支持远程系统管理

✅ 使用 rhc 工具需满足:

  • 拥有有效订阅的红帽账户
  • 拥有系统的 root 权限

先看看当前的软件仓库配置,什么都没有,然后连接一下红帽订阅账号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@lxhhost1 ~]# ls /etc/yum.repos.d/
[root@lxhhost1 ~]# rhc connect
Connecting lxhhost1 to Red Hat.
This might take a few seconds.

Features preferences: [✓]content, [✓]analytics, [✓]remote-management

Username: xxx
Password: xxx

[✓] Connected to Red Hat Subscription Management
[✓] Content ... Red Hat repository file generated
[|] Connecting to Red Hat Insights...
...

你看上面启用了3个,两个都要注册到红帽网站的分析系统,如果你只希望启用内容仓库访问,而不启用其他功能,可以使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@lxhhost1 ~]# rhc connect --disable-feature=analytics,remote-management
Connecting lxhhost1 to Red Hat.
This might take a few seconds.

Features preferences: [✓]content, [ ]analytics, [ ]remote-management

Username: 939958092@qq.com
Password:

[✓] Connected to Red Hat Subscription Management
[✓] Content ... Red Hat repository file generated
[ ] Analytics ... Connecting to Red Hat Insights disabled
[ ] Management .... Starting yggdrasil service disabled (required feature "analytics" is disabled)

Successfully connected to Red Hat!

Manage your connected systems: https://red.ht/connector

连接好了之后,就有仓库文件了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@lxhhost1 ~]# head /etc/yum.repos.d/redhat.repo -n 20
#
# Certificate-Based Repositories
# Managed by (rhsm) subscription-manager
#
# *** This file is auto-generated. Changes made here will be overwritten. ***
# *** Use "subscription-manager repo-override --help" if you wish to make changes. ***
#
# If this file is empty and this system is subscribed, consider
# running "dnf repolist" to refresh the available repositories.
#

[rhel-atomic-7-cdk-3.6-debug-rpms]
name = Red Hat Container Development Kit 3.6 /(Debug RPMs)
baseurl = https://cdn.redhat.com/content/dist/rhel/atomic/7/7Server/$basearch/cdk/3.6/debug
enabled = 0
gpgcheck = 1
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
sslverify = 1
sslcacert = /etc/rhsm/ca/redhat-uep.pem
sslclientkey = /etc/pki/entitlement/4924066368813422029-key.pem

如果想断开红帽订阅,可以:

1
2
3
4
5
6
7
8
9
10
11
[root@lxhhost1 ~]# rhc connect --disable-feature=analytics,remote-management
this system is already connected
[root@lxhhost1 ~]# rhc disconnect
Disconnecting lxhhost1 from Red Hat.
This might take a few seconds.

[✓] Deactivated the yggdrasil service
[✓] Disconnected from Red Hat Insights
[✓] Disconnected from Red Hat Subscription Management

Manage your connected systems: https://red.ht/connector

rhel8.8以前的系统还得用以前的方法来注册系统

工具名称适用版本范围功能特点与适用场景
rhc(Red Hat Connector)RHEL 9.1+ / RHEL 10 推荐✅ 首选注册工具,支持内容仓库、智能分析、远程管理三合一注册
subscription-managerRHEL 8.x / RHEL 9.x / RHEL 10✅ 传统注册工具,适用于细粒度控制与兼容旧版本系统
1
2
3
subscription-manager register --username=xxx --password=xxx
subscription-manager attach --auto
subscription-manager repos --enable=rhel-10-baseos-rpms

在 RHEL 10 中,部分与“单系统订阅”相关的模块已移除,但工具本身仍保留,功能未被弃用

如果你觉得麻烦,你也可以用图形化或者cockpit来完成

第五章 用 Lightspeed 获取 AI 辅助

Red Hat Enterprise Linux Lightspeed 是红帽在 RHEL 10 中引入的智能化系统管理技术,融合了数十年企业级 Linux 运维经验与现代 AI 技术,旨在:

  • 为新手与专家提供主动式指导与建议
  • 简化系统构建、部署与维护流程
  • 提高生产力,降低人为错误与学习成本
  • 增强用户体验,使 RHEL 更加直观易用

Lightspeed 技术已包含在 RHEL 订阅中,无需额外付费。

技术优势与设计理念

特性说明
AI 驱动基于红帽知识库与智能模型,提供上下文相关建议
主动式指导不再依赖用户手动查阅文档,系统可主动提示
终端原生集成无需额外工具,直接在 shell 中使用
适配多经验层级无论是新手还是专家,都能获得定制化帮助
降低运维成本减少配置错误、加快问题定位与解决速度

Lightspeed 的核心组件(RHEL 10 起)

命令行助手(Command Line Helper)

  • 集成于 RHEL 10 的终端环境
  • 用户可直接用英语提问,如:“How do I configure SELinux for web server?”
  • 基于红帽知识库与 AI 模型,提供即时建议、命令示例与操作指导
  • 适用于:
    • Linux 新手:简化复杂命令与配置流程
    • 资深管理员:加快查找与执行效率,减少文档查阅时间

Insights 镜像构建器软件包建议(Image Builder Package Recommendations)

  • 集成于 Red Hat Insights 平台
  • 在构建镜像时,自动推荐相关软件包与依赖项
  • 降低遗漏关键组件的风险
  • 帮助用户构建更完整、稳定、功能完善的系统镜像
  • 适用于:
    • 平台工程师:构建标准化镜像
    • DevOps 团队:提升部署一致性与可靠性

对于我们的课程,只用到命令行助手

🎯 功能亮点

命令行助手可用于:

  • ✅ 回答与 RHEL 相关的问题(命令、配置、工具使用等)
  • ✅ 协助故障排除(如服务异常、权限问题)
  • ✅ 解读日志条目(如 systemd、audit、SELinux 日志)
  • ✅ 提供命令建议与操作指导
  • ✅ 减少查阅外部文档的时间,提高任务完成效率

⚠️ 使用限制与注意事项

限制项说明
❌ 无法访问本地系统信息不支持读取当前系统状态(如内存、CPU、磁盘)
✅ 提供命令建议会告诉你如何使用命令查看系统信息
🌐 需联网使用当前版本仅支持在线访问,未来可能支持离线部署
🔐 不读取用户数据不会访问或分析用户文件、配置或进程内容

🧬 技术架构

  • 命令行助手由 IBM watsonx AI API 提供支持
  • 使用 IBM Granite LLM 模型,以 SaaS 形式托管在 watsonx 平台
  • 模型训练数据包括:
    • Red Hat 官方文档
    • KCS(Knowledge Centered Support)知识库文章
    • RHEL 实践经验与技术资源

安装命令行助手

你得先订阅系统才行

1
[root@lxhhost1 ~]# dnf install command-line-assistant -y

在 RHEL 10 中,命令行助手的主要用户界面就是 c 命令。它由 RHEL Lightspeed 软件包提供,允许用户在终端中直接使用自然语言提问,获取基于红帽知识库与 AI 模型的即时建议与指导。

如果安装成功并联网,执行c chat后系统将进入命令行助手交互界面,提示你输入问题。例如:

1
[root@lxhhost1 ~]# c chat 'How do I configure a firewall for a web server?'

输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
⁺₊+ Asking RHEL Lightspeed
This feature uses AI technology. Do not include any personal information or other sensitive information in your input. Interactions
may be used to improve Red Hat's products or services.
────────────────────────────────────────────────────────────────────────

To configure a firewall for a secure web server on Red Hat Enterprise Linux (RHEL) 9 or 10, you can use the firewalld service. Here's a step-by-step guide:

Prerequisites
··············

1. Ensure firewalld is running:
``bash
sudo systemctl start firewalld
sudo systemctl enable firewalld
`

2. Check the currently active firewall zone:
`bash
sudo firewall-cmd --get-active-zones
``

Configuring firewalld for a Secure Web Server
··············································

1. Allow HTTP (port 80) and HTTPS (port 443) traffic:

You can allow traffic for HTTP and HTTPS by adding services to the active zone. For example, to allow HTTP and HTTPS traffic on the public zone:

``bash
sudo firewall-cmd --zone=public --add-service=http
sudo firewall-cmd --zone=public --add-service=https
sudo firewall-cmd --reload
`

2. Optional: Allow specific IP addresses or networks:

If you want to allow traffic from specific IP addresses or networks, use the --add-source option:

`bash
sudo firewall-cmd --zone=public --add-source=192.168.1.0/24
sudo firewall-cmd --reload
`

3. Permanent configuration:

To make these changes permanent, use the --permanent flag:

`bash
sudo firewall-cmd --zone=public --permanent --add-service=http
sudo firewall-cmd --zone=public --permanent --add-service=https
sudo firewall-cmd --reload
``

Using the RHEL 9 Web Console
·····························

1. Access the Web Console:

Open a web browser and navigate to https://<server_ip>:9090. Log in with your credentials.

2. Navigate to Firewall Settings:

In the web console, go to the "Networking" section and click on "Firewall."

3. Add Services:

Select the active zone (e.g., public), and click on the "Add" button next to "Services." Choose "http" and "https" from the list of available services.

4. Save Changes:

Click "Save" to apply the changes.

Verification
·············

After configuring, verify that the rules are correctly set:

[bash] Snippet ────────────────
sudo firewall-cmd --list-all
────────────────────────

This command will display the current firewall settings, including active zones and services.

Important Notes
················

- Always ensure that you're allowing necessary ports for your web server (80 for HTTP, 443 for HTTPS) while restricting access to unnecessary ports.
- Regularly review and update your firewall rules to maintain security.

By following these steps, you can configure firewalld to support a secure web server on RHEL.

────────────────────────────────────────────────────────────────────────
Always review AI-generated content prior to use.

可以看到回答的还不错哦

命令行助手在故障排除中的价值

RHEL Lightspeed 命令行助手是一个AI 驱动的交互式支持工具,可帮助用户快速定位问题、获取解决方案建议,尤其适用于:

  • Linux 初学者:无需深入掌握命令细节
  • 经验管理员:加快排查速度,减少查阅文档时间
  • 多任务环境:提升效率,避免遗漏关键步骤
1
[root@lxhhost1 ~]# c chat '我无法ssh链接到服务器,是什么原因?'

输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
⁺₊+ Asking RHEL Lightspeed
────────────────────────────────────────────────────────────────────────

It seems like you're having trouble connecting to your server via SSH. Here are a few common reasons and troubleshooting steps:

1. Firewall Configuration: Ensure that the firewall on your server is configured to allow SSH connections. You can check and modify the firewall settings using the firewalld or iptables commands. For example, to allow SSH (port 22) with firewalld, you can use:
``
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
`

2. SSH Service Status: Verify that the SSH service is running on the server. You can check its status with:
`
sudo systemctl status sshd
`
If it's not running, start it with:
`
sudo systemctl start sshd
`
And set it to start on boot with:
`
sudo systemctl enable sshd
`

3. SSH Configuration: Check the SSH configuration file (/etc/ssh/sshd_config) for any misconfigurations. Common issues include incorrect Port settings, PermitRootLogin settings, or PasswordAuthentication settings.

4. Key-based Authentication: If you're using key-based authentication, ensure that the public key is correctly added to the ~/.ssh/authorized_keys file on the server.

5. Network Connectivity: Ensure that there are no network issues preventing the connection. You can test this by pinging the server from the client machine:
`
ping <server_ip>
`

6. SELinux or AppArmor: If SELinux or AppArmor is enabled, it might be blocking SSH connections. You can temporarily set SELinux to permissive mode to check if it's the cause:
`
sudo setenforce 0
`
Remember to set it back to enforcing mode once you're done troubleshooting:
`
sudo setenforce 1
``

If you've checked all these and are still unable to connect, please provide more details about the issue, such as any error messages you're encountering, and I'll be glad to assist further.

────────────────────────────────────────────────────────────────────────
Always review AI-generated content prior to use.

什么是命令行助手的交互模式?

交互模式允许用户与命令行助手进行多轮对话,适用于:

  • 更复杂的问题排查
  • 涉及多个步骤的配置任务
  • 需要上下文连续性的场景(如日志分析、权限诊断)

助手会记住当前会话中的上下文,从而生成更精准、更贴合的问题解决方案。

1
c chat --interactive

不过目前测试不咋好使,你可以试试,说不定你看到我的文章的时候,它已经进化了

命令行助手的输出分析能力

在故障排除中,上下文数据至关重要。命令行助手支持将命令输出直接作为输入内容进行分析,从而:

  • 提供更精准的诊断建议
  • 自动识别错误模式、日志关键字、配置异常
  • 减少人工筛查日志的时间与误判风险

🛠️ 使用方式示例

以下命令将 Apache 服务最近一小时的日志输出传送给助手进行分析:

1
2
sudo journalctl -u httpd.service --since "1 hour ago" | \
c chat "What could be causing errors in these logs?"

助手将:

  • 解析日志内容
  • 提取关键错误信息(如权限拒绝、端口冲突、模块加载失败)
  • 提出可能原因与排查建议
  • 推荐后续命令(如 semanage, firewall-cmd, restorecon

📎 --attachment-a 标志简介

命令行助手支持通过 --attachment-a 参数将本地文件内容直接传送给助手进行分析,适用于:

  • 日志文件诊断
  • 配置文件审查
  • 命令输出保存后的分析
  • 多轮交互中提供上下文数据

🛠️ 使用示例

分析系统启动日志:

1
c chat -a /var/log/boot.log "Why did the last boot take so long?"

助手将:

  • 读取日志内容
  • 提取关键启动阶段耗时信息
  • 提出可能原因(如服务延迟、硬件初始化慢、网络等待)
  • 推荐进一步排查命令(如 systemd-analyze blame

第六章 ⽂件系统层次结构导览

Linux 文件系统遵循 FHS(Filesystem Hierarchy Standard)标准,整体结构类似一棵倒置的树:

  • 根目录 / 是所有路径的起点
  • 所有系统文件、用户数据、设备挂载点等都在其下展开
  • 每个一级目录都有明确的功能分工

linux-file-tree

📁 常见一级目录说明

目录功能说明
/bin存放基本命令,如 lscp,所有用户可执行,系统启动必备
/sbin存放系统管理命令,仅供 root 使用,如 rebootfdisk
/etc存放系统配置文件,如 passwdfstabssh 配置等
/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
2
3
4
cat /etc/passwd
rm -rf /etc/lixiaohui/testfile
touch /tmp/lixiaohuitest
touch /mnt/lxh-testfile

📌 touch 命令用于创建空白文件或更新文件时间戳

相对路径(Relative Path)

  • 基于当前工作目录进行定位
  • 使用 . 表示当前目录,.. 表示上一级目录
  • 更简洁,适合在脚本或交互中使用

🧠 类比理解

大家先看这一段描述内容:

1
我是李晓辉,我来自宇宙、银河系、地球、亚洲、中国、河南省、安阳市、经纬度为xxxx

描述准确无误,但是这是绝对路径,说起来太麻烦

大家再看这些描述

1
我在中国 //我不需要说我在宇宙中,因为大家已经在宇宙中了
1
你帮我从那个红色的桌子上拿一个充电宝过来 //我没有说从安阳市哪个街道哪个小区哪个楼哪个门牌号,因为我们都在这个屋子里

相对路径有一个基准,就是当前位置,在Linux中,当前位置用一个英文的句号来表示 . ,上一级路径用两个英文句号来表示 ..

cd 命令用于切换工作路径,cd .表示进入当前路径,cd ..进入父目录,cd - 切换回进⼊当前⽬录之前所处的⽬录,需要注意的是以点号 . 开头的文件被视为隐藏文件

1
2
3
4
5
cd /lixiaohui/project1/test/
# 下面这个命令将进入cd /lixiaohui/project1/路径
cd ..
# 下面这个命令将/etc/fstab赋值到当前路径中
cp /etc/fstab .

查询当前路径在系统中的绝对路径写法

1
2
[lixiaohui@host1 ~]$ pwd
/home/lixiaohui

第七章 从命令⾏管理⽂件

创建⽬录

1
2
mkdir /lxhfolder
mkdir /tmp/lixiaohui

mkdir -p 在父目录不存在时,直接将父目录自动创建

1
2
3
4
5
6
[lixiaohui@host1 ~]$ mkdir /tmp/lixiaohui/testfolder
mkdir: cannot create directory ‘/tmp/lixiaohui/testfolder’: No such file or directory
[lixiaohui@host1 ~]$ mkdir -p /tmp/lixiaohui/testfolder
[lixiaohui@host1 ~]$
[lixiaohui@host1 ~]$ ll -d /tmp/lixiaohui/testfolder
drwxr-xr-x. 2 lixiaohui lixiaohui 6 Feb 1 00:37 /tmp/lixiaohui/testfolder

复制⽂件和⽬录

cp 命令可复制⽂件到当前⽬录或其他指定⽬录

cp 可以不断的表示要复制走的文件,但是要求最后一个参数必须是目标文件夹

1
2
3
4
5
6
7
8
9
[lixiaohui@host1 ~]$ mkdir /home/lixiaohui/folder1
[lixiaohui@host1 ~]$ ls -l /home/lixiaohui/folder1
total 0
[lixiaohui@host1 ~]$ cp /etc/fstab /mnt/readme.txt /home/lixiaohui/folder1
[lixiaohui@host1 ~]$
[lixiaohui@host1 ~]$ ls -l /home/lixiaohui/folder1
total 8
-rw-r--r--. 1 lixiaohui lixiaohui 982 Feb 1 00:39 fstab
-rw-r--r--. 1 lixiaohui lixiaohui 105 Feb 1 00:39 readme.txt

cp 在复制文件夹时,必须带上 -r 这个参数做递归操作才能把文件夹复制走

1
2
3
4
5
6
7
[lixiaohui@host1 ~]$ cp /home/lixiaohui/folder1 /tmp/
cp: -r not specified; omitting directory '/home/lixiaohui/folder1'
[lixiaohui@host1 ~]$ ls -d /tmp/folder1
ls: cannot access '/tmp/folder1': No such file or directory
[lixiaohui@host1 ~]$ cp -r /home/lixiaohui/folder1 /tmp/
[lixiaohui@host1 ~]$ ls -d /tmp/folder1
/tmp/folder1

移动⽂件和⽬录

mv 命令可将⽂件从⼀个位置移动到另⼀个位置,如果源路径和目标路径是同样的路径,但目前文件名和源文件名不同,将是重命名效果

文件移动

1
2
3
4
5
6
7
8
[lixiaohui@host1 ~]$ touch /tmp/file1
[lixiaohui@host1 ~]$ mkdir /tmp/folder1
[lixiaohui@host1 ~]$ ls -l /tmp/folder1
total 0
[lixiaohui@host1 ~]$ mv /tmp/file1 /tmp/folder1/
[lixiaohui@host1 ~]$ ls -l /tmp/folder1/
total 0
-rw-r--r--. 1 lixiaohui lixiaohui 0 Feb 1 22:50 file1

文件重命名

1
2
3
4
5
6
7
8
[lixiaohui@host1 ~]$ ll /tmp/folder1/
total 0
-rw-r--r--. 1 lixiaohui lixiaohui 0 Feb 1 22:50 file1
[lixiaohui@host1 ~]$
[lixiaohui@host1 ~]$ mv /tmp/folder1/file1 /tmp/folder1/file2
[lixiaohui@host1 ~]$ ll /tmp/folder1/
total 0
-rw-r--r--. 1 lixiaohui lixiaohui 0 Feb 1 22:50 file2

删除⽂件和⽬录

  1. rm 默认删除文件,但是不删除目录,可以加上-r递归选项来同时删除非空目录

  2. rm 可以跟上-i 在删除具体文件时,问你是否删除,跟上-f 来不提示且强制删除

  3. rm -rf 可以删除文件以及所有目录,此操作强制静默执行目录的递归删除

从命令行(shell)执行的文件删除操作不可撤销,系统也不提供回收站机制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[lixiaohui@host1 ~]$ ll /tmp/folder1/
total 0
-rw-r--r--. 1 lixiaohui lixiaohui 0 Feb 1 22:50 file2
[lixiaohui@host1 ~]$
[lixiaohui@host1 ~]$ rm /tmp/folder1/file2
[lixiaohui@host1 ~]$ ll /tmp/folder1/file2
ls: cannot access '/tmp/folder1/file2': No such file or directory

[lixiaohui@host1 ~]$ touch /tmp/folder1/lxhtest
[lixiaohui@host1 ~]$ rm -i /tmp/folder1/lxhtest
rm: remove regular empty file '/tmp/folder1/lxhtest'? y

[lixiaohui@host1 ~]$ ls /tmp/folder1/
file1 file10 file2 file3 file4 file5 file6 file7 file8 file9 lxhtest
[lixiaohui@host1 ~]$ rm -rf /tmp/folder1/*
[lixiaohui@host1 ~]$ ll /tmp/folder1/
total 0

在 Linux 中,链接是一种特殊的文件类型,用于指向另一个文件。链接分为两种:硬链接(Hard Link)软链接(Symbolic Link)

硬链接(Hard Link)

📌 原理说明

  • 每个文件在文件系统中都有一个唯一的 inode 编号
  • 硬链接是对同一个 inode 的多个引用,不会复制数据,也不会额外占用空间
  • 所有硬链接都是“平等的”,没有“源文件”与“目标文件”之分
  • 删除其中一个链接,只是取消一个路径引用,数据仍然存在于其他链接中
  • 不能跨设备或分区创建硬链接,也不能对目录创建硬链接

以下例子中,所有的硬链接都具有相同的编号: 268964355

1
2
3
4
5
6
7
[lixiaohui@host1 ~]$ touch /tmp/folder1/lxhfile1
[lixiaohui@host1 ~]$ ls -i /tmp/folder1/lxhfile1
268964355 /tmp/folder1/lxhfile1
[lixiaohui@host1 ~]$ ln /tmp/folder1/lxhfile1 /home/lixiaohui/lxhtest
[lixiaohui@host1 ~]$ ls -li /home/lixiaohui/lxhtest /tmp/folder1/lxhfile1
268964355 -rw-r--r--. 2 lixiaohui lixiaohui 0 Feb 1 23:04 /home/lixiaohui/lxhtest
268964355 -rw-r--r--. 2 lixiaohui lixiaohui 0 Feb 1 23:04 /tmp/folder1/lxhfile1

📌 两个文件共享同一个 inode 编号,表示它们是同一个数据的多个路径引用

软链接(Symbolic Link)

📌 原理说明

  • 使用 ln -s 创建软链接
  • 类似于 Windows 的快捷方式,软链接是一个指向目标路径的文件
  • 可以跨设备、跨分区创建,也可以对目录创建软链接
  • 软链接依赖源文件,如果源文件被删除,链接将失效
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[lixiaohui@host1 ~]$ ll -i /tmp/folder1/lxhfile1
268964355 -rw-r--r--. 2 lixiaohui lixiaohui 0 Feb 1 23:04 /tmp/folder1/lxhfile1
[lixiaohui@host1 ~]$ echo source date > /tmp/folder1/lxhfile1

[lixiaohui@host1 ~]$ ln -s /tmp/folder1/lxhfile1 /home/lixiaohui/lxhsoft
[lixiaohui@host1 ~]$ ll -i /tmp/folder1/lxhfile1 /home/lixiaohui/lxhsoft
268965142 lrwxrwxrwx. 1 lixiaohui lixiaohui 21 Feb 1 23:11 /home/lixiaohui/lxhsoft -> /tmp/folder1/lxhfile1
268964355 -rw-r--r--. 2 lixiaohui lixiaohui 12 Feb 1 23:11 /tmp/folder1/lxhfile1

[lixiaohui@host1 ~]$ rm -rf /tmp/folder1/lxhfile1
[lixiaohui@host1 ~]$ ll -i /home/lixiaohui/lxhsoft
268965142 lrwxrwxrwx. 1 lixiaohui lixiaohui 21 Feb 1 23:11 /home/lixiaohui/lxhsoft -> /tmp/folder1/lxhfile1
[lixiaohui@host1 ~]$ cat /home/lixiaohui/lxhsoft
cat: /home/lixiaohui/lxhsoft: No such file or directory

📌 删除源文件后,软链接失效,无法访问原始内容

🔍 对比总结

特性硬链接软链接
是否占用额外空间❌ 不占用✅ 占用一个链接文件空间
是否依赖源文件❌ 不依赖✅ 严重依赖
是否可跨设备❌ 不可✅ 可跨设备
是否可链接目录❌ 不可✅ 可链接目录
是否共享 inode✅ 是❌ 否

使用 Shell 扩展匹配文件名

Bash Shell 提供多种扩展机制,帮助用户在命令行中动态生成、替换或匹配文本,是高效操作文件与路径的核心技巧。

🔧 Bash Shell 的五种主要扩展方式

扩展类型功能说明
🧩 大括号扩展生成多个字符串或路径组合
🏠 波形符扩展~ 扩展为当前用户主目录路径
💲 变量扩展$变量名 替换为变量的值
🔁 命令替换$(命令)`命令` 替换为命令输出
📁 路径名扩展使用通配符匹配多个文件名或路径(也称为通配)

元字符和匹配项表:

模式(Pattern)匹配说明
*匹配任意长度的任意字符(包括零个字符)
?匹配任意单个字符
[abc...]匹配方括号中任意一个字符
[!abc...]匹配不在方括号中的任意一个字符(感叹号表示排除)
[^abc...]匹配不在方括号中的任意一个字符(脱字符表示排除)
[[:alpha:]]匹配任意字母字符(A-Z 或 a-z)
[[:lower:]]匹配任意小写字母
[[:upper:]]匹配任意大写字母
[[:alnum:]]匹配任意字母或数字字符
[[:punct:]]匹配任意可打印的非空格非字母数字字符(如标点)
[[:digit:]]匹配任意数字(0 到 9)
[[:space:]]匹配任意空白字符(包括空格、制表符、换行等)

路径名扩展和模式匹配

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[lixiaohui@host1 ~]$ mkdir glob; cd glob
[lixiaohui@host1 glob]$ touch alfa bravo charlie delta echo able baker cast dog easy
[lixiaohui@host1 glob]$ ls
able alfa baker bravo cast charlie delta dog easy echo
[lixiaohui@host1 glob]$ ls a*
able alfa
[lixiaohui@host1 glob]$ ls *a*
able alfa baker bravo cast charlie delta easy
[lixiaohui@host1 glob]$ ls [ac]*
able alfa cast charlie
[lixiaohui@host1 glob]$ ls ????
able alfa cast easy echo
[lixiaohui@host1 glob]$ ls ?????
baker bravo delta

⼤括号扩展

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[lixiaohui@host1 glob]$ echo {Sunday,Monday,Tuesday,Wednesday}.log
Sunday.log Monday.log Tuesday.log Wednesday.log
[lixiaohui@host1 glob]$ echo file{1..3}.txt
file1.txt file2.txt file3.txt
[lixiaohui@host1 glob]$ echo file{a..c}.txt
filea.txt fileb.txt filec.txt
[lixiaohui@host1 glob]$ echo file{a,b}{1,2}.txt
filea1.txt filea2.txt fileb1.txt fileb2.txt
[lixiaohui@host1 glob]$ echo file{a{1,2},b,c}.txt
filea1.txt filea2.txt fileb.txt filec.txt
[lixiaohui@host1 glob]$ mkdir ../RHEL{7,8,9,10}
[lixiaohui@host1 glob]$ ls ../RHEL*
../RHEL7:

../RHEL8:

../RHEL9:

../RHEL10:

波形符扩展

1
2
3
4
5
6
7
8
9
[lixiaohui@host1 glob]$ echo ~root
/root
[lixiaohui@host1 glob]$ echo ~lixiaohui
/home/lixiaohui
[lixiaohui@host1 glob]$ echo ~nonexistinguser
~nonexistinguser
[lixiaohui@host1 glob]$ pwd
/home/lixiaohui/glob
[lixiaohui@host1 glob]$ cd ~/glob/

变量扩展

变量名称只能包含字⺟(⼤写和⼩写)、数字和下划线。变量名称区分⼤⼩写,不能以数字开头。

变量的赋值和引用

1
2
3
[lixiaohui@host1 glob]$ username=lixiaohui
[lixiaohui@host1 glob]$ echo $username
lixiaohui

要预防因其他 shell 扩展⽽引起的错误,可以将变量的名称放在⼤括号中

1
2
3
[lixiaohui@host1 glob]$ username=lixiaohui
[lixiaohui@host1 glob]$ echo ${username}
lixiaohui

命令替换

命令替换允许命令的输出替换命令⾏上的命令本⾝。当命令括在括号中并且前⾯有美元符号 $ 时,会发⽣命令替换。$(command) 形式可以互相嵌套多个命令扩展。

1
2
3
4
[lixiaohui@host1 glob]$  echo Today is $(date +%A).
Today is Thursday.
[lixiaohui@host1 glob]$ echo The time is $(date +%M) minutes past $(date +%l%p).
The time is 25 minutes past 11PM.

防⽌参数被扩展

在 Bash shell 中,许多字符具有特殊含义(如 $*?! 等),会触发变量扩展、通配符匹配、命令替换等行为。为了防止这些扩展,可以使用引号转义符进行保护。

🧱 反斜杠转义:\

  • 反斜杠是 Bash 中的转义字符
  • 它会取消紧随其后的字符的特殊含义,使其按字面值处理
  • 常用于保护特殊字符或在字符串中插入空格、引号等

🧾 引号机制

引号类型功能说明
'单引号'禁止所有扩展,完全按字面值处理
"双引号"禁止路径名扩展与通配符,但允许变量与命令替换
无引号所有扩展均可能发生(默认行为)
1
2
3
4
5
6
7
8
9
10
11
12
[lixiaohui@host1 glob]$ echo The value of $HOME is your home directory.
The value of /home/lixiaohui is your home directory.
[lixiaohui@host1 glob]$ echo The value of \$HOME is your home directory.
The value of $HOME is your home directory.
[lixiaohui@host1 glob]$ myhost=$(hostname -s); echo $myhost
host1
[lixiaohui@host1 glob]$ echo "***** hostname is ${myhost} *****"
***** hostname is host1 *****
[lixiaohui@host1 glob]$ echo "Will variable $myhost evaluate to $(hostname -s)?"
Will variable host1 evaluate to host1?
[lixiaohui@host1 glob]$ echo 'Will variable $myhost evaluate to $(hostname -s)?'
Will variable $myhost evaluate to $(hostname -s)?

第八章 使用 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
2
3
sudo dnf install vim-minimal
# 或安装完整版
sudo dnf install vim-enhanced

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)用于输入文本,按 iao 等进入
🟪 扩展命令模式(Command-line)用于执行保存、退出、搜索、替换等命令,按 : 进入
🟥 可视模式(Visual)用于选中文本块,按 vCtrl+v 进入

🧩 Vim 模式切换与功能概览

模式名称进入方式功能说明
🟦 命令模式默认启动用于导航、剪切、粘贴、删除等操作
🟨 插入模式iao用于输入文本内容
🟥 可视模式vShift+vCtrl+v用于选中文本块(字符、行、列)
🟪 扩展命令模式:用于执行保存、退出、搜索、替换等命令

📌 按 Esc 可随时返回命令模式,是最安全的操作起点

📌 扩展命令模式常用命令

1
2
3
4
5
6
:w        # 保存文件
:q # 退出 Vim
:wq # 保存并退出
:q! # 强制退出不保存
:/keyword # 搜索关键字
:%s/old/new/g # 全文替换

命令模式

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(粘贴)命令实现文本的拖拉与重排操作。

🧩 操作流程概览

  1. 将光标定位到要复制的起始位置
  2. 进入可视模式
    • v:选择字符块
    • Shift+v:选择整行
    • Ctrl+v:选择列块(矩形选择)
  3. 使用方向键扩展选择范围
  4. Y 复制选中内容到内存(寄存器)
  5. 将光标移动到目标位置
  6. P 将内容粘贴到光标后方

可视模式

🔁 可视模式细分

按键组合选择类型
v字符块选择
Shift+v行块选择
Ctrl+v列块选择(矩形)

📌 再次按下相同按键可退出可视模式

vim 基本命令

1
2
[lixiaohui@host1 ~]$ cp /etc/passwd /tmp/passwd
[lixiaohui@host1 ~]$ vim /tmp/passwd

先进入到具体有内容的文件中,执行以下命令:

  1. yy 复制光标所在行
  2. p 在光标所在行下方插入刚复制的内容
  3. x 删除光标所在的单个字符
  4. dd 删除光标所在行
  5. 3dd 删除包括光标所在行的向下3行
  6. 3,5y 复制第3到第5行
  7. 3,5d 删除第3到第5行
  8. /lixiaohui 快速搜索lixiaohui字符串
  9. nN,搜索到之后,向下或向上查找
  10. u 撤销你刚才修改的内容
  11. ctrl r 撤销你刚才撤销的动作,也就是说把刚才撤销的东西再找回来
  12. :w 只保存不退出
  13. :q! 只退出不保存
  14. set nu 显示行号
  15. set nonu 取消行号显示

Vim 配置文件详解

Vim 编辑器支持通过配置文件自定义行为,提升编辑效率与体验。配置文件分为系统级用户级两类:

📁 配置文件路径说明

配置文件路径作用范围
/etc/vimrc系统级配置,影响所有用户
~/.vimrc当前用户专属配置,仅影响该用户

🧠 可配置项示例

  • 默认制表符间距(如 ts=2
  • 是否显示行号(如 set number
  • 是否启用语法高亮、颜色方案
  • 针对特定文件类型的自动行为(如 YAML、Python)

🧾 示例:用户级配置文件 ~/.vimrc

以下配置适用于 YAML 文件编辑,并启用行号显示:

1
2
autocmd FileType yaml setlocal ts=2
set number

📌 配置说明:

指令功能
autocmd FileType yaml ...针对 YAML 文件类型设置行为
setlocal ts=2设置制表符宽度为 2 空格
set number启用行号显示,适用于所有文件类型

✅ YAML 对缩进非常敏感,设置合适的制表符宽度有助于避免语法错误

第九章 重定向 Shell 输⼊和输出

在 Linux 中,所有运行中的程序(进程)都通过称为**文件描述符(File Descriptor)**的编号通道进行输入与输出操作。理解这三种标准流是掌握 Shell 编程与调试的基础。

默认文件描述符

描述符编号名称功能说明
0标准输入(stdin)默认从键盘读取输入
1标准输出(stdout)将正常输出发送到终端
2标准错误(stderr)将错误信息发送到终端

📌 每个进程启动时都会自动拥有这三个通道

输入输出行为说明

  • 标准输入:程序等待用户输入,如 read 命令或交互式脚本
  • 标准输出:程序的正常结果,如 echols 输出
  • 标准错误:程序的错误信息,如命令失败、语法错误等
用法说明
> FILE重定向标准输出(stdout),覆盖目标文件内容。
>> FILE重定向标准输出,追加到目标文件末尾。
2> FILE重定向标准错误(stderr),覆盖目标文件内容。
2>> FILE重定向标准错误,追加到目标文件末尾。
2>/dev/null将标准错误重定向到 /dev/null,丢弃错误信息。
> FILE 2>&1同时重定向标准输出和标准错误,覆盖写入同一个文件。
>> FILE 2>&1同时重定向标准输出和标准错误,追加写入同一个文件。

重定向

从 shell 提⽰符运⾏命令时,通常会从键盘读取其输⼊,并将输出发送到终端窗⼝,通过重定向,可以将消息保存到⽂件或直接丢弃,⽽不在终端上显⽰输出

/dev/null是一个特殊设备,所有重定向到这里的内容,将不做保存和处理,直接丢弃

重定向将会清空文件原有内容,并插入新内容,文件不存在时,会创建出来

1
2
3
4
5
6
[lixiaohui@host1 ~]$ echo hello
hello
[lixiaohui@host1 ~]$ echo hello > file1
[lixiaohui@host1 ~]$ cat file1
hello
[lixiaohui@host1 ~]$ echo hello > /dev/null

追加

保留原有内容并在后方插入新内容

1
2
3
4
[lixiaohui@host1 ~]$ echo hello line2 >> file1
[lixiaohui@host1 ~]$ cat file1
hello
hello line2

处理错误输出

shell中的错误,在操作重定向时,将会把错误内容默认输出到屏幕,可以使用2>来单独重定向错误信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[lixiaohui@host1 ~]$ ls /home/lixiaohui/ /nolixiaohui > file1
ls: cannot access '/nolixiaohui': No such file or directory
[lixiaohui@host1 ~]$ cat file1
/home/lixiaohui/:
file1
glob
lxhsoft
lxhtest
RHEL7
RHEL8
RHEL9
[lixiaohui@host1 ~]$ ls /home/lixiaohui/ /nolixiaohui 2> file1
/home/lixiaohui/:
file1 glob lxhsoft lxhtest RHEL7 RHEL8 RHEL9
[lixiaohui@host1 ~]$ cat file1
ls: cannot access '/nolixiaohui': No such file or directory

分别保存正确和错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[lixiaohui@host1 ~]$ ls /home/lixiaohui/ /nolixiaohui > correct.txt 2> error.txt
[lixiaohui@host1 ~]$ cat correct.txt
/home/lixiaohui/:
correct.txt
error.txt
file1
glob
lxhsoft
lxhtest
RHEL7
RHEL8
RHEL9
[lixiaohui@host1 ~]$ cat error.txt
ls: cannot access '/nolixiaohui': No such file or directory

正确和错误合并处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[lixiaohui@host1 ~]$ ls /home/lixiaohui/ /nolixiaohui
ls: cannot access '/nolixiaohui': No such file or directory
/home/lixiaohui/:
file1 glob lxhsoft lxhtest RHEL7 RHEL8 RHEL9
[lixiaohui@host1 ~]$
[lixiaohui@host1 ~]$ ls /home/lixiaohui/ /nolixiaohui > correct.txt
ls: cannot access '/nolixiaohui': No such file or directory
[lixiaohui@host1 ~]$ cat correct.txt
/home/lixiaohui/:
correct.txt
file1
glob
lxhsoft
lxhtest
RHEL7
RHEL8
RHEL9
[lixiaohui@host1 ~]$ ls /home/lixiaohui/ /nolixiaohui 2> correct.txt
/home/lixiaohui/:
correct.txt file1 glob lxhsoft lxhtest RHEL7 RHEL8 RHEL9
[lixiaohui@host1 ~]$ cat correct.txt
ls: cannot access '/nolixiaohui': No such file or directory
[lixiaohui@host1 ~]$ ls /home/lixiaohui/ /nolixiaohui &> correct.txt
[lixiaohui@host1 ~]$ cat correct.txt
ls: cannot access '/nolixiaohui': No such file or directory
/home/lixiaohui/:
correct.txt
file1
glob
lxhsoft
lxhtest
RHEL7
RHEL8
RHEL9

管道(Pipe)机制详解

在 Linux Shell 中,管道是一种将多个命令连接起来的机制,使得一个命令的输出可以直接作为下一个命令的输入。

🧠 管道的基本原理

  • 使用竖线字符 | 将多个命令连接成一个命令序列
  • 管道将前一个命令的标准输出(stdout)连接到后一个命令的标准输入(stdin)
  • 每个命令只处理自己关心的部分,形成高效的数据处理链

计算文件一共有几行

wc -l 需要一系列内容才能计算内容一共有几行,wc 命令所需要的内容由管道将管道前命令的输出提供

1
2
[lixiaohui@host1 ~]$ cat /etc/passwd | wc -l
45

tee 命令

重定向和追加有一个被迫选择的问题,要不输出到屏幕,要不输出到文件,而tee可以做到同时输出到文件和屏幕

tee 命令用于读取标准输入并将其内容同时写入文件和标准输出。它常用于管道中,帮助你在不中断数据流的情况下保存中间结果。

1
2
3
4
5
6
7
8
[lixiaohui@host1 ~]$ echo hello > file1
[lixiaohui@host1 ~]$ echo hello | tee file1
hello
[lixiaohui@host1 ~]$ echo hello world | tee -a file1
hello world
[lixiaohui@host1 ~]$ cat file1
hello
hello world

第十章 管理本地⽤⼾和组

在 Linux 系统中,用户账户不仅用于身份识别,更是系统安全与资源访问控制的核心机制。

用户账户的作用

  • 提供人与程序之间的安全边界
  • 每个用户拥有唯一的 用户名用户 ID(UID)
  • 登录时通过密码验证身份
  • 每个进程都以某个用户身份运行
  • 每个文件都归属于某个用户,系统据此进行访问控制

用户类型分类

Linux 系统中的用户账户主要分为三类:

用户类型UID 范围功能说明
🛡️ 超级用户UID = 0用户名为 root,拥有系统全部权限
⚙️ 系统用户UID < 1000(或 < 200)用于运行服务进程(如守护进程),不可交互登录
👨‍💻 普通用户UID ≥ 1000(或 ≥ 200)用于日常操作,权限受限,可交互登录

📌 不同发行版对 UID 范围略有差异,RHEL 通常以 UID ≥ 1000 作为普通用户起点

文件和进程都属于某一用户,用来配合权限工作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[lixiaohui@host1 ~]$ id root
uid=0(root) gid=0(root) groups=0(root)
[lixiaohui@host1 ~]$ id lixiaohui
uid=1001(lixiaohui) gid=1001(lixiaohui) groups=1001(lixiaohui)
[lixiaohui@host1 ~]$
[lixiaohui@host1 ~]$ ll /readme.txt
-rw-r--r--. 1 root root 105 Nov 10 05:33 /readme.txt

[lixiaohui@host1 ~]$ ps aux | more
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 1.2 0.1 172312 16612 ? Ss 00:52 0:01 /usr/lib/systemd/systemd rhgb
root 2 0.0 0.0 0 0 ? S 00:52 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< 00:52 0:00 [rcu_gp]
root 4 0.0 0.0 0 0 ? I< 00:52 0:00 [rcu_par_gp]

查看当前用户信息

使用 id 命令可以查看当前登录用户的详细信息,id命令后面跟用户名,可以查询别的用户哦

1
id

输出示例:

1
uid=1000(lixiaohui) gid=1000(lixiaohui) groups=1000(lixiaohui),10(wheel)
  • uid:用户 ID
  • gid:主组 ID
  • groups:所属的所有组

用户信息文件 /etc/passwd

该文件包含所有本地用户的基本信息,每行一个用户,字段以冒号 : 分隔,共 7 个字段。

✅ 示例内容

1
lixiaohui:x:1001:1001:Lxh:/home/lixiaohui:/bin/bash
字段位置内容示例说明
1lixiaohui用户名
2x密码占位符(真实密码存储在 /etc/shadow
31001用户 UID
41001主组 GID
5Lxh用户描述或备注
6/home/lixiaohui用户主目录
7/bin/bash默认 shell 程序(如 /sbin/nologin 表示禁止登录)

组信息文件 /etc/group

该文件包含所有本地组的信息,每行一个组,字段以冒号 : 分隔,共 4 个字段。

✅ 示例内容

1
lixiaohui:x:1001:user01,user02,user03
字段位置内容示例说明
1lixiaohui组名
2x密码占位符(通常不使用)
31001组 GID
4user01,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 管理机制对比

操作系统管理账户名称推荐做法
Linuxroot使用 sudosu 提权,避免直接登录
WindowsAdministrator使用管理员组成员身份运行任务,避免直接登录

su 直接切换身份

使用su - USERNAME的方法切换到目标用户身份下,普通用户的切换需要提供目标密码,而root用户切换到其他用户时无需密码

如果su后面省略⽤⼾名,则默认情况下会尝试切换到 root

1
2
3
4
5
6
7
[lixiaohui@host1 ~]$ su - lxh
Password:
[root@host1 ~]# su - lxh
Last login: Mon Feb 5 01:12:31 CST 2026 on pts/0
[lxh@host1 ~]$ su - root
Password:
Last login: Mon Feb 5 00:53:52 CST 2026 from 172.25.254.1 on pts/0

su 与 su -

su命令后面也可以不写中横杠,区别如下:

  1. su 命令将启动⾮登录 shell,su 以该⽤⼾⾝份启动shell,但使⽤的是原始⽤⼾的环境设置

  2. su - 命令会启动登录 shell,会将 shell 环境设置为如同以该⽤⼾⾝份重新登录⼀样

一般来说,管理员应该运⾏ su - 以获得包含⽬标⽤⼾常规环境设置的 shell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[lxh@host1 ~]$ su root
Password:
[root@host1 lxh]# ls
[root@host1 lxh]# pwd
/home/lxh
[root@host1 lxh]# exit
exit

[lxh@host1 ~]$ su - root
Password:
Last login: Mon Feb 5 01:18:34 CST 2026 on pts/0
[root@host1 ~]# pwd
/root
[root@host1 ~]# ls
anaconda-ks.cfg

通过sudo 获得权限

在 RHEL 10 中,出于安全考虑,root 用户默认没有有效密码,无法直接登录或使用 su 命令切换到 root。推荐的做法是使用 sudo 命令以 root 身份运行命令。

🧠 sudosu 的区别

命令身份验证方式是否需要 root 密码推荐使用场景
su输入目标用户密码✅ 需要 root 密码不推荐,除非已设置 root 密码
sudo输入当前用户密码❌ 不需要 root 密码✅ 推荐,可审计、可配置、可限制

✅ 使用 sudo 的基本流程

  1. 普通用户登录系统
  2. 执行命令时前加 sudo
  3. 输入自己的密码进行身份验证
  4. 命令以 root 权限执行
1
sudo dnf install httpd

🔄 密码缓存机制

  • sudo 默认会缓存密码验证结果 5 分钟
  • 在此期间无需重复输入密码
  • 可使用以下命令清除缓存:
1
sudo -k

📦 sudo 的配置与审计优势

  • 可通过 /etc/sudoersvisudo 工具配置权限规则
  • 可限制某用户只能以某个身份运行特定命令
  • 所有 sudo 执行记录默认写入 /var/log/secure,便于审计与追踪

wheel 组机制(RHEL 7+)

  • RHEL 7 及更高版本中,wheel 组成员默认拥有 sudo 权限
  • 成员可使用自己的密码通过 sudo 以任何用户身份运行命令
  • 添加用户到 wheel 组:
1
usermod -aG wheel lixiaohui

⚠️ 注意:RHEL 6 及更早版本中,wheel 组默认不具备特权,需手动配置

su、su - 和 sudo 命令之间的区别

su-su--sudo

普通用户不具有用户创建权限

1
2
3
[lixiaohui@host1 ~]$ useradd zhangsan
useradd: Permission denied.
useradd: cannot lock /etc/passwd; try again later.

用root权限,授予lixiaohui用户可以创建用户和删除用户权限

先查询用户创建和删除的命令位置

1
2
3
4
[root@host1 ~]# which useradd
/usr/sbin/useradd
[root@host1 ~]# which userdel
/usr/sbin/userdel

sudo 授权

以下授权允许lixiaohui用户可以sudo运行useradd和userdel命令,但是不允许用sudo的方式运行ls命令

手工修改此文件有语法错误的可能性,可以使用 visudo 命令去自动打开此文件修改,保存时,会去验证是否正确

如果不想修改主配置文件,可以修改/etc/sudoers.d路径下的文件,新建一个文件放进来即可

1
2
3
[root@host1 ~]# vim /etc/sudoers
[root@host1 ~]# tail -n 1 /etc/sudoers
lixiaohui ALL=(ALL) /usr/sbin/useradd,/usr/sbin/userdel,!/bin/ls

以下授权允许lixiaohui用户可以sudo运行所有命令,且不需要密码

1
2
3
[root@host1 ~]# vim /etc/sudoers
[root@host1 ~]# tail -n 1 /etc/sudoers
lixiaohui ALL=(ALL) NOPASSWD: ALL

在配置了允许用户执行所有命令后,用户就可以执行 sudo -i来切换到超级用户身份执行命令了

以下授权允许lxhgroup 组可以sudo运行所有命令,且不需要密码

1
2
3
[root@host1 ~]# vim /etc/sudoers
[root@host1 ~]# tail -n 1 /etc/sudoers
@lxhgroup ALL=(ALL) NOPASSWD: ALL

测试权限

我们注意,在userdel时失败了一次,因为没有sudo命令开始,不经过我们的授权验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@host1 ~]# su - lixiaohui
Last login: Mon Feb 5 01:25:52 CST 2026 on pts/0
[lixiaohui@host1 ~]$ sudo useradd zhangsan
...
[sudo] password for lixiaohui:

[lixiaohui@host1 ~]$ tail -n 1 /etc/passwd
zhangsan:x:1003:1003::/home/zhangsan:/bin/bash

[lixiaohui@host1 ~]$ userdel -r zhangsan
userdel: Permission denied.
userdel: cannot lock /etc/passwd; try again later.

[lixiaohui@host1 ~]$ sudo userdel -r zhangsan
[lixiaohui@host1 ~]$ tail -n 1 /etc/passwd
lxh:x:1002:1002::/home/lxh:/bin/bash

[lixiaohui@host1 ~]$ sudo ls
Sorry, user lixiaohui is not allowed to execute '/bin/ls' as root on host1.

管理本地⽤⼾

创建⽤⼾

默认会创建用户的家目录,将/bin/bash设置为用户shell,UID和GID从/etc/login.defs中获取,默认创建的第一个用户UID是1000

  1. -u指定UID

  2. -s指定shell,其中/sbin/nologin未不允许用户登录,但程序可以本地使用此用户

  3. -G指定辅助组

  4. -g执行主要组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@host1 ~]# useradd lixiaohui
[root@host1 ~]# grep lixiaohui /etc/passwd
lixiaohui:x:1001:1001::/home/lixiaohui:/bin/bash
[root@host1 ~]# ls -d /home/lixiaohui/
/home/lixiaohui/

[root@host1 ~]# useradd -u 2000 lxh -s /sbin/nologin
[root@host1 ~]# grep lxh /etc/passwd
lxh:x:2000:2000::/home/lxh:/sbin/nologin
[root@host1 ~]# su - lxh
This account is currently not available.

[root@host1 ~]# useradd -G group1 laoli
[root@host1 ~]# id laoli
uid=2001(laoli) gid=2003(laoli) groups=2003(laoli),2001(group1)
[root@host1 ~]# useradd -g group2 laozhang
[root@host1 ~]# id laozhang
uid=2002(laozhang) gid=2002(group2) groups=2002(group2)

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 可以修改用户信息,其中

  1. -a和-G 组合使用可以将用户添加到辅助组,而不从现有组中踢出此用户

只使用-G,会将用户从其他组中踢出

选项用法说明
-a, --append-G 一起使用,将附加组添加到用户当前的组集合中,而不是替换组集合。
-c, --comment COMMENTCOMMENT 文本添加到用户的注释字段。
-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
2
3
4
5
[root@host1 ~]# id lixiaohui
uid=1001(lixiaohui) gid=1001(lixiaohui) groups=1001(lixiaohui),2004(group3)
[root@host1 ~]# usermod -G group1 lixiaohui
[root@host1 ~]# id lixiaohui
uid=1001(lixiaohui) gid=1001(lixiaohui) groups=1001(lixiaohui),2001(group1)

组合使用,可以叠加多个组

1
2
3
4
5
[root@host1 ~]# id lixiaohui
uid=1001(lixiaohui) gid=1001(lixiaohui) groups=1001(lixiaohui),2001(group1)
[root@host1 ~]# usermod -aG group2 lixiaohui
[root@host1 ~]# id lixiaohui
uid=1001(lixiaohui) gid=1001(lixiaohui) groups=1001(lixiaohui),2001(group1),2002(group2)
  1. -g 修改用户主要组
1
2
3
[root@host1 ~]# usermod -g group2 lixiaohui
[root@host1 ~]# id lixiaohui
uid=1001(lixiaohui) gid=2002(group2) groups=2002(group2),2001(group1)
  1. 锁定用户不允许登录
1
[root@host1 ~]# usermod -L lixiaohui
  1. 恢复用户登录
1
[root@host1 ~]# usermod -U lixiaohui
  1. -s 修改登录的登录shell

/sbin/nolgin和/bin/false都是拒绝用户交互式登录的shell,/sbin/nologin更友好,因为它会提示因为什么拒绝

1
[root@host1 ~]# usermod -s /sbin/nologin lixiaohui

删除用户

userdel 可以删除用户,以下是注意事项:

  1. 如果是暂时禁用用户,请使用usermod -L 锁定

  2. 如果确定要删除用户,而且不想删除用户的家目录资料,可以执行userdel USERNAME

  3. 如果确定要删除用户,而且连带用户家目录资料同步删除,可以执行userdel -r USERNAME

设置用户密码

passwd可以给用户设置密码

普通用户不允许在passwd后面加用户名,只能给自己设置,root用户可以在passwd后面加用户名给别人设置密码

1
2
3
[root@host1 ~]# passwd lixiaohui
[lixiaohui@host1 ~]$ passwd laoli
passwd: Only root can specify a user name.

管理本地组帐⼾

创建本地组

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
2
3
4
5
6
7
8
9
10
11
id
# 查看当前主要组

newgrp itgroup
# 将当前 shell 的主要组切换为 itgroup(前提是你属于该组)

touch test.txt
# 创建的文件将归属于 itgroup 组

exit
# 退出当前 shell,恢复原始主要组

📦 注意事项

特性说明详情
一次只能有一个主要组切换后,原主要组不再生效,直到恢复
仅限当前 shell 会话不影响其他终端或后台任务
需属于目标组否则切换失败,提示权限不足
可切换回默认组使用 newgrp 加原组名即可恢复

删除本地组

groupdel 命令可删除组

管理⽤⼾密码

/etc/shadow

Linux 使用 /etc/shadow 文件存储用户的加密密码与密码策略信息。该文件只能由 root 用户读取,每行对应一个用户账户,共包含 9 个以冒号分隔的字段

1
2
[root@host1 ~]# tail -n 1 /etc/shadow
lixiaohui:!$6$n.2VAv1m5Y6IL1nN$uYKLCz1acTzn6yyjrCzK5nbuu2viRuLWqZEgrP1QG8YyUICH6rzSg7qgobT.GFTfXUIfYd7FD9rgHslWRal9M1:19758:1:30:7:31:19773:

📊 字段说明表

字段位置内容示例字段说明
1lixiaohui用户名
2$6$...!加密后的哈希密码(! 表示账户被锁定)
319758上次更改密码的日期(自 1970-01-01 起的天数)
41密码最短更改间隔(天)
530密码最长有效期(天)
67密码过期前的警告天数
731密码过期后账户锁定前的宽限天数
819773密码到期日期(自 1970-01-01 起的天数)
9空字段预留字段,未来用途
  • 加密密码字段通常以 $id$salt$hash 格式表示:
    • $6$ 表示使用 SHA-512 加密算法
    • salt 是加密用的随机盐值
    • hash 是最终生成的密码摘要
  • 若密码字段为 !*,表示该账户已被锁定,无法登录
  • 可使用 chage 命令查看或修改这些字段对应的策略

加密哈希密码的格式

以 yescrypt 算法为例,密码字段格式如下:

1
$y$j9T$qybndwEWzHhr0uTGAwO4Q0$OuNgGC5Mx2RrCO4JOXtR2VJfTA8dLPxa7NV1tvhziHC

加密哈希密码字段中存储了三段信息:

  1. 所⽤的哈希算法,6 表⽰ SHA-512 哈希,这是 RHEL 9 的默认算法;1 表⽰ MD5,⽽ 5则表⽰ SHA-256
  2. salt,CSsXcYG1L/4ZfHr/
  3. 加密哈希值,2W6evvJahUfzfHpc9X.45Jc6H30E

salt 添加随机数据到加密哈希,以创建唯⼀哈希来增强加密哈希密码。每段信息由美元符号 ($) 字符分隔

📊 字段组成说明

字段位置内容示例说明
$yy哈希算法标识:y 表示 yescrypt,6 表示 SHA-512,5 表示 SHA-256
j9Tj9Tyescrypt 参数,用于调整算法行为(其他算法可能无此字段)
saltqybndwEWzHhr0uTGAwO4Q0加密用的随机盐值,用于抵御预计算攻击
hashOuNgGC5Mx2RrCO4JOXtR2VJfTA8dLPxa7NV1tvhziHC最终生成的密码哈希值

🧠 为什么要使用 salt?

  • salt 是随机生成的字符串,与明文密码一起参与加密过程
  • 有效防止使用预计算哈希表(如彩虹表)进行暴力破解
  • 增加攻击者破解成本,使每个密码哈希唯一,即使密码相同

Linux 密码验证机制详解

Linux 系统通过 /etc/shadow 文件中的加密哈希密码字段进行用户登录验证。该机制确保系统可以验证密码正确性,而无需存储明文密码。

🧠 验证流程原理

  1. 用户在登录界面输入用户名与密码
  2. 系统在 /etc/shadow 中查找对应用户名的条目
  3. 提取该用户的:
    • 加密算法标识(如 $6$ 表示 SHA-512)
    • salt(随机加密盐值)
    • 加密后的哈希密码
  4. 系统将用户输入的明文密码与 salt 组合
  5. 使用指定的哈希算法重新加密该组合
  6. 将结果与 /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[登录失败]

配置密码期限

chage

  1. 让用户于2026-03-01日过期
1
[root@host1 ~]# chage -E 2026-03-01 lixiaohui
  1. 用户下次登陆前必须改密码
1
[root@host1 ~]# chage -d 0 lixiaohui

看一个长一点的例子

1
chage -m 0 -M 90 -W 7 -I 14 lxhuser

📊 参数说明

参数含义
-m 0密码最短更改间隔为 0 天,用户可随时修改密码
-M 90密码最长有效期为 90 天,超过后必须更改
-W 7密码过期前 7 天开始提醒用户
-I 14密码过期后 14 天内未登录则账户自动锁定

限制用户访问的策略与命令

在用户离职、休假或临时停用账户的场景下,系统管理员可以使用 usermod 命令进行账户锁定与过期设置,从而防止用户继续访问系统。

✅ 锁定账户(禁止登录)

1
usermod -L sysadmin03
  • -L 表示 Lock,锁定账户
  • 被锁定的用户无法通过密码登录系统

🔓 解锁账户(恢复访问)

1
usermod -U sysadmin03
  • -U 表示 Unlock,解除账户锁定
  • 用户可重新登录系统(前提是密码有效)

什么是 nologin shell?

/sbin/nologin 是一种特殊的 shell,用于禁止用户进行交互式登录。当某个用户账户不需要直接登录系统时,将其登录 shell 设置为 nologin 是一种安全且标准的做法。

🧠 应用场景举例

  • 邮件服务器上的账户仅用于存储邮件或进行身份验证,不需要登录系统
  • 系统服务账户(如 postfixftpnginx)用于运行守护进程,但不应允许登录
  • 临时或自动化账户仅用于 API 或脚本调用,不应开放 shell 访问

✅ 设置方法

使用 usermod 命令修改用户的登录 shell:

1
usermod -s /sbin/nologin username
  • -s 表示设置 shell
  • /sbin/nologin 会在用户尝试登录时直接拒绝连接
  • 用户仍可用于服务验证(如 SMTP、POP3、FTP),但无法进入 shell

🔒 安全优势

  • 防止非授权登录尝试
  • 降低攻击面,尤其是服务型账户
  • 保留账户功能(如身份验证、文件归属)而不开放 shell 权限

第十一章 控制对⽂件的访问

Linux 使用三类权限(读、写、执行)和三类用户角色(用户、组、其他)来控制文件和目录的访问行为,实现灵活而强大的安全机制。

文件归属结构

每个文件或目录都具有:

  • 所属用户(Owner):通常是创建者
  • 所属组(Group):通常是创建者的主要组,也可更改
  • 其他用户(Others):系统中不属于该用户或组的其他用户

权限作用对象

类别说明
用户权限文件所有者的权限,优先级最高
组权限所属组成员的权限,次之
其他权限所有其他用户的权限,优先级最低

✅ 权限判断优先级:用户权限 > 组权限 > 其他权限

权限类型说明

权限类型对文件的作用对目录的作用
读取(r)查看文件内容列出目录内容(如 ls
写入(w)修改或删除文件内容创建、删除或重命名目录下文件
执行(x)执行脚本或程序文件进入目录(如 cd

权限类型对文件与目录的影响

权限对文件的影响对目录的影响
r可以读取文件内容可以列出目录中的文件名(如 ls
w可以修改文件内容可以在目录中创建、删除、重命名文件(需同时具备执行权限)
x可以执行该文件(如脚本或程序)可以进入该目录(如 cd),但需配合 r 权限才能列出目录内容

权限组合行为举例

  • 目录权限为 r-x:可以进入并列出内容,但不能创建或删除文件
  • 文件权限为 rw-:可以查看和编辑文件,但不能执行
  • 文件权限为 --x:无法查看内容,但可以执行(常用于二进制程序)

查看权限

看出不管是文件还是目录,都归当前用户以及当前用户组所有

1
2
3
4
5
6
[lixiaohui@host1 ~]$ touch lxhfile
[lixiaohui@host1 ~]$ mkdir lxhfolder
[lixiaohui@host1 ~]$ ll
total 0
-rw-r--r--. 1 lixiaohui lixiaohui 0 Feb 5 23:49 lxhfile
drwxr-xr-x. 2 lixiaohui lixiaohui 6 Feb 5 23:49 lxhfolder

文件类型

ll 命令是ls -l的缩写,以下命令输出中第一个字母d代表这次的输出是文件夹

1
2
[lixiaohui@host1 ~]$ ll -d lxhfolder
drwxr-xr-x. 2 lixiaohui lixiaohui 6 Feb 5 23:49 lxhfolder

第一个字母还可以是以下的字母:

字符类型说明
-普通文件
d目录
l符号链接
c字符设备文件
b块设备文件
p命名管道
s本地套接字

权限解释

九个字符代表⽂件权限。这些字符解释为三组,每组三个字符:第⼀组是适⽤于⽂件所有者的权限,第⼆组⽤于⽂件的组所有者,最后⼀组则适⽤于所有其他(全局)⽤⼾

1
2
[lixiaohui@host1 ~]$ ll -d lxhfolder
drwxr-xr-x. 2 lixiaohui lixiaohui 6 Feb 5 23:49 lxhfolder

🔍 字段逐项解析

字段位置内容示例含义说明
1d文件类型:目录(其他类型见下方)
2–4rwx所属用户权限:读、写、执行
5–7r-x所属组权限:读、执行
8–10r-x其他用户权限:读、执行
11.SELinux 安全上下文标记;. 表示无扩展 ACL,+ 表示存在 ACL
122链接数:目录至少为 2(自身 . 和上级 ..
13lixiaohui所属用户:文件拥有者
14lixiaohui所属组:文件所属的用户组
156文件大小(字节)
16–18Feb 5 23:49最后修改时间
19lxhfolder文件或目录名称

更改⽂件和⽬录权限

🛠️ chmod 命令概述

chmod 是 Linux 中用于更改文件或目录权限的命令,代表 “change mode”。它支持两种权限设置方式:

  • 符号表示法(Symbolic Mode)
  • 八进制表示法(Numeric Mode)

符号表示法(推荐初学者)

使⽤ chmod 命令修改⽂件和⽬录权限的格式如下:

1
chmod Who/What/Which file|directory

who 代表用户主体,可以是:

who主体
uuser
ggroup
oother
aall

what 代表从文件身上添加还是删除权限

what操作
+添加
-删除
=等于

which 代表具体的权限

which权限或模式备注
r-
w-
x执行对于目录而言,必须要有x权限,不然无法进入
X特殊的执行权限仅仅给这个目录添加执行权限,而不影响下级文件的执行权限
1
2
3
4
5
6
7
8
9
10
11
[lixiaohui@host1 ~]$ ll -d lxhfolder
drwxr-xr-x. 2 lixiaohui lixiaohui 6 Feb 5 23:49 lxhfolder
[lixiaohui@host1 ~]$ chmod go-rw lxhfile
[lixiaohui@host1 ~]$ ll lxhfile
-rw-------. 1 lixiaohui lixiaohui 0 Feb 5 23:49 lxhfile
[lixiaohui@host1 ~]$ chmod a+x lxhfile
[lixiaohui@host1 ~]$ ll lxhfile
-rwx--x--x. 1 lixiaohui lixiaohui 0 Feb 5 23:49 lxhfile
[lixiaohui@host1 ~]$ chmod a=rw lxhfile
[lixiaohui@host1 ~]$ ll lxhfile
-rw-rw-rw-. 1 lixiaohui lixiaohui 0 Feb 5 23:49 lxhfile

可以使⽤ chmod 命令 -R 选项,以递归⽅式对整个⽬录树中的⽂件设置权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@host1 ~]# mkdir folder1
[root@host1 ~]# touch folder1/file{1..10}
[root@host1 ~]# ll folder1
total 0
-rw-r--r--. 1 root root 0 Feb 6 00:15 file1
-rw-r--r--. 1 root root 0 Feb 6 00:15 file10
-rw-r--r--. 1 root root 0 Feb 6 00:15 file2
-rw-r--r--. 1 root root 0 Feb 6 00:15 file3
-rw-r--r--. 1 root root 0 Feb 6 00:15 file4
-rw-r--r--. 1 root root 0 Feb 6 00:15 file5
-rw-r--r--. 1 root root 0 Feb 6 00:15 file6
-rw-r--r--. 1 root root 0 Feb 6 00:15 file7
-rw-r--r--. 1 root root 0 Feb 6 00:15 file8
-rw-r--r--. 1 root root 0 Feb 6 00:15 file9
[root@host1 ~]# chmod -R a+wx folder1
[root@host1 ~]# ll folder1
total 0
-rwxrwxrwx. 1 root root 0 Feb 6 00:15 file1
-rwxrwxrwx. 1 root root 0 Feb 6 00:15 file10
-rwxrwxrwx. 1 root root 0 Feb 6 00:15 file2
-rwxrwxrwx. 1 root root 0 Feb 6 00:15 file3
-rwxrwxrwx. 1 root root 0 Feb 6 00:15 file4
-rwxrwxrwx. 1 root root 0 Feb 6 00:15 file5
-rwxrwxrwx. 1 root root 0 Feb 6 00:15 file6
-rwxrwxrwx. 1 root root 0 Feb 6 00:15 file7
-rwxrwxrwx. 1 root root 0 Feb 6 00:15 file8
-rwxrwxrwx. 1 root root 0 Feb 6 00:15 file9

八进制表示法(适合批量设置)

可以使⽤ 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)

具体来说:

数字权限组合
0无权限
1执行(x)
2写入(w)
4读取(r)

权限组合通过加法实现:

  • 7 = 4 + 2 + 1 = rwx
  • 6 = 4 + 2 = rw-
  • 5 = 4 + 1 = r-x

看案例

1
2
3
4
5
6
7
8
9
10
11
12
13
[lixiaohui@host1 ~]$ ll
total 0
-rw-rw-rw-. 1 lixiaohui lixiaohui 0 Feb 5 23:49 lxhfile
drw-rw-rw-. 2 lixiaohui lixiaohui 137 Feb 6 00:12 lxhfolder
[lixiaohui@host1 ~]$ chmod 123 lxhfile
[lixiaohui@host1 ~]$ ll lxhfile
---x-w--wx. 1 lixiaohui lixiaohui 0 Feb 5 23:49 lxhfile
[lixiaohui@host1 ~]$ chmod 456 lxhfile
[lixiaohui@host1 ~]$ ll lxhfile
-r--r-xrw-. 1 lixiaohui lixiaohui 0 Feb 5 23:49 lxhfile
[lixiaohui@host1 ~]$ chmod 777 lxhfile
[lixiaohui@host1 ~]$ ll lxhfile
-rwxrwxrwx. 1 lixiaohui lixiaohui 0 Feb 5 23:49 lxhfile

更改文件或目录所有权

🧾 文件与目录的所有权结构

在 Linux 中,每个文件或目录都具有:

  • 所属用户(Owner):通常是创建者
  • 所属组(Group):默认是创建者的主要组(通常是私有组)

这种归属关系决定了文件的访问权限控制基础。

🔄 为什么要更改所有权?

  • 为了让其他用户组成员访问或协作某个文件
  • 为了将文件归属转移给其他用户或服务账户
  • 为了实现更灵活的权限管理策略(如项目组共享)

🔐 权限限制说明

操作类型谁可以执行
更改文件的用户所有权仅限 root 用户
更改文件的组所有权文件所有者或 root 用户
普通用户更改组所有权前提是该用户属于目标组

✅ 普通用户不能将文件转移给其他用户,但可以将文件的组更改为自己所属的组

看案例:

只更改文件的拥有人

将lxhfile2的拥有人改为laoli

1
2
3
4
5
6
[root@host1 ~]# touch lxhfile2
[root@host1 ~]# ll lxhfile2
-rw-r--r--. 1 root root 0 Feb 6 00:24 lxhfile2
[root@host1 ~]# chown laoli lxhfile2
[root@host1 ~]# ll lxhfile2
-rw-r--r--. 1 laoli root 0 Feb 6 00:24 lxhfile2

只更改文件的所属组

1
2
3
4
5
6
7
8
9
10
[root@host1 ~]# chown :lixiaohui lxhfile2
[root@host1 ~]# ll lxhfile2
-rw-r--r--. 1 laoli lixiaohui 0 Feb 6 00:24 lxhfile2

[root@host1 ~]# ll lxhfile2
-rw-r--r--. 1 laoli lixiaohui 0 Feb 6 00:24 lxhfile2
[root@host1 ~]#
[root@host1 ~]# chgrp root lxhfile2
[root@host1 ~]# ll lxhfile2
-rw-r--r--. 1 laoli root 0 Feb 6 00:24 lxhfile2

同时更改文件的拥有人和所属组

1
2
3
4
5
[root@host1 ~]# ll lxhfile2
-rw-r--r--. 1 laoli root 0 Feb 6 00:24 lxhfile2
[root@host1 ~]# chown lixiaohui:group1 lxhfile2
[root@host1 ~]# ll lxhfile2
-rw-r--r--. 1 lixiaohui group1 0 Feb 6 00:24 lxhfile2

管理默认权限和文件访问

特殊权限

特殊权限是除了⽤⼾、组和其他类型之外的第四种权限类型,所有的特殊权限都要求相应的权限主体有执行权限,如果没有执行权限,所有的特殊权限都会以大写的方式警告此权限无法生效

  1. suid,chmod中的数字修改法中,用4表示
  2. sgid,chmod中的数字修改法中,用2表示
  3. sticky,,chmod中的数字修改法中,用1表示
1
[root@host1 ~]# chmod 1777 folder
权限对文件的影响对⽬录的影响
u+s (suid)以拥有⽂件的⽤⼾⾝份,⽽不是以运⾏⽂件的⽤⼾⾝份执⾏⽂件⽆影响
g+s (sgid)以拥有⽂件的组⾝份执⾏⽂件⽬录中创建的⽂件的组所有者与⽬录的组所有者相匹配
o+t (sticky)⽆影响对⽬录具有写⼊访问权限的⽤⼾仅可以删除其所拥有的⽂件,⽽⽆法删除或强制保存到其他⽤⼾所拥有的⽂件

1️⃣ setuid(u+s)

  • 作用对象:可执行文件
  • 效果:运行该文件时,进程将以文件所有者的身份执行,而不是当前用户
  • 典型用途:如 /usr/bin/passwd,允许普通用户修改自己的密码,但实际操作由 root 完成
1
chmod u+s filename

我们发现所有人对密码文件都没有修改权限,而root由于是特殊的超级管理员,只有root用户可以修改

1
2
[root@host1 ~]# ll /etc/shadow
----------. 1 root root 1433 Feb 6 00:23 /etc/shadow

/bin/passwd是用来改密码的,此程序已经被执行了chmod u+s /bin/passwd,所以用户权限上有一个小写的s,这就意味着所有人执行/bin/passwd时,都以root用户身份和权限修改/etc/shadow,所以才能改密码

1
2
[root@host1 ~]# ll /bin/passwd
-rwsr-xr-x. 1 root root 32648 Aug 10 2021 /bin/passwd

2️⃣ setgid(g+s)

  • 作用对象:可执行文件或目录
  • 效果
    • 文件:以文件所属组的身份运行
    • 目录:目录中创建的文件将自动继承该目录的组所有权(而不是创建者的主组)
1
chmod g+s dirname
  • 典型用途:项目协作目录,确保所有成员创建的文件都归属于同一组

这出现在文件夹的场景下,我们要求不管谁向特定的文件夹写入文件,新产生的文件要自动归属于特定的组拥有,例如root用户写的代码必须自动归属于group1这个组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@host1 ~]# mkdir /lxh-sgid-folder
[root@host1 ~]# ll -d /lxh-sgid-folder
drwxr-xr-x. 2 root root 6 Feb 6 00:37 /lxh-sgid-folder
[root@host1 ~]# chmod a+w /lxh-sgid-folder
[root@host1 ~]# ll -d /lxh-sgid-folder
drwxrwxrwx. 2 root root 6 Feb 6 00:37 /lxh-sgid-folder
[root@host1 ~]# chgrp group1 /lxh-sgid-folder
[root@host1 ~]# ll -d /lxh-sgid-folder
drwxrwxrwx. 2 root group1 6 Feb 6 00:37 /lxh-sgid-folder

[root@host1 ~]# chmod g+s /lxh-sgid-folder/
[root@host1 ~]# ll -d /lxh-sgid-folder/
drwxrwsrwx. 2 root group1 6 Feb 6 00:38 /lxh-sgid-folder/
[root@host1 ~]# touch /lxh-sgid-folder/rootwrite
[root@host1 ~]# ll /lxh-sgid-folder/rootwrite
-rw-r--r--. 1 root group1 0 Feb 6 00:38 /lxh-sgid-folder/rootwrite

3️⃣ sticky bit(o+t)

  • 作用对象:目录
  • 效果:目录中的文件只能被文件所有者删除,而不是目录所有者
  • 典型用途:如 /tmp 目录,多个用户共享但不能互相删除文件
1
chmod o+t dirname

这出现在公共目录使用场景,要求人们只能管理和删除自己的文件,删除别人的文件会报告Operation not permitted

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@host1 ~]# mkdir /lxh-sticky
[root@host1 ~]# chmod 777 /lxh-sticky
[root@host1 ~]# ll -d /lxh-sticky
drwxrwxrwx. 2 root root 6 Feb 6 00:44 /lxh-sticky
[root@host1 ~]# chmod o+t /lxh-sticky
[root@host1 ~]# ll -d /lxh-sticky
drwxrwxrwt. 2 root root 6 Feb 6 00:44 /lxh-sticky
[root@host1 ~]# touch /lxh-sticky/rootfile
[root@host1 ~]# su - lixiaohui
Last login: Tue Feb 6 00:23:40 CST 2026 on pts/0
[lixiaohui@host1 ~]$ touch /lxh-sticky/lixiaohuifile
[lixiaohui@host1 ~]$ ll /lxh-sticky/
total 0
-rw-r--r--. 1 lixiaohui lixiaohui 0 Feb 6 00:45 lixiaohuifile
-rw-r--r--. 1 root root 0 Feb 6 00:44 rootfile
[lixiaohui@host1 ~]$ rm -rf /lxh-sticky/*
rm: cannot remove '/lxh-sticky/rootfile': Operation not permitted
[lixiaohui@host1 ~]$ ll /lxh-sticky/
total 0
-rw-r--r--. 1 root root 0 Feb 6 00:44 rootfile

默认⽂件权限

umask 是用户文件创建时的默认权限屏蔽值,用于从系统默认权限中减去不希望赋予的权限。它影响新创建文件或目录的权限设置。

📊 默认初始权限(未减去 umask 前)

类型初始八进制权限符号表示法
文件0666rw-rw-rw-
目录0777rwxrwxrwx

✅ 文件默认不含执行权限(x),即使 umask不屏蔽也不会自动赋予

🔢 umask 的作用机制

  • umask 是一个三位八进制数(如 0022
  • 它从默认权限中减去对应位,得到最终权限
  • 示例:umask 0022 对文件的影响如下:
1
2
3
默认文件权限:0666
减去 umask:0022
最终权限:0644 → rw-r--r--

在创建时,⽂件被分配初始权限。有两个因素会影响这些初始权限。其⼀是你要创建常规⽂件还是⽬录。其⼆是当前的 umask,它代表⽤⼾⽂件创建掩码

如果创建⽬录,则其初始⼋进制权限为 0777 (drwxrwxrwx)。如果你创建常规⽂件,则其初始⼋进制权限为 0666 (-rw-rw-rw-),umask是从以上权限数字中,减去特定的数字,最终得到权限

如果umask是0022,那么文件夹默认权限是0755,文件权限是0644

1
2
3
4
5
6
7
8
9
10
11
[root@host1 ~]# umask
0022
[root@host1 ~]# umask -p
umask 0022
[root@host1 ~]# umask -S
u=rwx,g=rx,o=rx
[root@host1 ~]# mkdir foldertest
[root@host1 ~]# touch filetest
[root@host1 ~]# ll -d foldertest/ filetest
-rw-r--r--. 1 root root 0 Feb 6 00:49 filetest
drwxr-xr-x. 2 root root 6 Feb 6 00:49 foldertest/

修改umask值

你可以在命令行中输入umask xxxx回车,但是这只有临时生效,你可以放入家目录中的.bashrc只影响自己一个人,也可以把umask xxxx这个内容放入/etc/bashrc或/etc/profile影响整个系统

第十二章 使⽤ RPM 安装和更新软件

什么是 RPM?

RPM(Red Hat Package Manager)是由红帽开发的标准化软件包管理工具,用于在 Linux 系统中打包、安装、升级、验证和卸载软件

相比传统的解压安装方式,RPM 提供了:

  • 安装文件追踪与验证机制
  • 依赖关系检查与管理
  • 卸载时自动清理相关文件
  • 本地数据库记录所有已安装软件包信息

RPM 文件命名结构

RPM 软件包文件名由以下四个部分组成,后缀为 .rpm

1
name-version-release.architecture.rpm

示例:

1
httpd-2.4.57-1.el9.x86_64.rpm
部分含义说明
name软件名称(如 httpd)
version软件版本号(如 2.4.57)
release构建版本或打包次数(如 1.el9)
architecture架构类型(如 x86_64、aarch64)

RPM 常用命令分类整理

软件包查询类

命令功能说明
rpm -qa列出系统中所有已安装的软件包
rpm -q coreutils查询指定软件包是否安装,并显示版本
rpm -qi coreutils查看软件包详细信息(描述、版本、发行者等)
rpm -ql coreutils列出软件包安装的所有文件路径
rpm -qc coreutils列出软件包安装的配置文件
rpm -qd coreutils列出软件包安装的文档文件
rpm -qf /bin/ls查询某个文件属于哪个软件包
rpm -q --scripts coreutils查看安装/卸载时执行的脚本
rpm -q --changelog coreutils查看软件包的变更日志

本地软件包分析类

命令功能说明
rpm -qlp package.rpm查看本地 RPM 包将安装的文件列表
rpm -qip package.rpm查看本地 RPM 包的详细信息
rpm -qc package.rpm查看本地 RPM 包的配置文件(需加 -p

安装与卸载类

命令功能说明
rpm -ivh package.rpm安装本地 RPM 包(i=install,v=verbose,h=hash进度)
rpm -Uvh package.rpm升级已安装的软件包
rpm -e package卸载软件包(不带 .rpm 后缀)

提取 RPM 内容(无需安装)

1
rpm2cpio package.rpm | cpio -idv
  • rpm2cpio:将 RPM 转换为 cpio 归档格式
  • cpio -idv:从归档中提取文件(i=extract,d=创建目录,v=显示过程)
  • 适用于分析 RPM 包内容或提取单个文件而不安装整个包

DNF 管理软件包

在新版本的Linux上,DNF命令取代了以前的YUM命令,但YUM依旧可以使用,但会自动链接到DNF并执行

🧱 RPM vs DNF:功能对比

功能点RPM(低级)DNF(高级)
安装本地包✅ 支持✅ 支持
自动依赖解析❌ 不支持✅ 自动解析并安装依赖
支持软件仓库❌ 不支持✅ 支持多个仓库(Red Hat、第三方)
查询包信息✅ 支持✅ 支持
升级软件包✅ 支持✅ 支持
事务历史记录❌ 无✅ 可查看安装/删除历史
安全性与签名验证✅ 支持✅ 支持
推荐使用场景本地包分析与提取日常安装、更新、维护软件环境

DNF 仓库配置

和RPM不同,DNF依赖于仓库的存在,DNF并不要求你指定软件包的具体位置,你只需要指定名称,就可以通过DNF命令来完成安装、更新、卸载等操作,DNF会自动从你配置的仓库中,搜索下载软件包

📦 软件仓库支持

DNF 支持从多个来源安装软件:

  • Red Hat 官方仓库(如 BaseOS、AppStream)
  • 第三方仓库(如 EPEL、Remi)
  • 本地仓库(通过 createrepo 构建)

✅ DNF 会自动处理依赖关系、版本冲突,并提供事务回滚能力,是企业级系统推荐的包管理方式。

Red Hat Enterprise Linux 10(RHEL 10)将系统内容分为两个主要软件仓库:

1️⃣ BaseOS 仓库

  • 提供 核心操作系统组件,包括内核、系统工具、基本命令集等
  • 所有内容以 RPM 软件包形式分发
  • 生命周期与 RHEL 主版本保持一致(长期支持)
  • 适用于系统稳定性与基础运行环境保障

2️⃣ AppStream 仓库(应用流)

  • 提供 附加应用程序与模块化内容,如数据库、开发工具、语言运行时等
  • 包含以前属于 Red Hat Software Collections 的内容
  • 每个应用流可能具有 独立的生命周期,可与 RHEL 主版本不同步
  • 支持 模块化版本选择(如 Python 3.11 vs 3.9)

🔄 二者协同关系

特性BaseOSAppStream
内容类型操作系统核心组件应用程序与模块化内容
生命周期与 RHEL 主版本一致可短于 RHEL 主版本
包格式RPMRPM + 模块元数据
安装方式通过 DNF 自动解析依赖支持模块流选择与启用
示例组件systemd、bash、kernelPostgreSQL、Node.js、Python

🛠️ DNF 常用命令

命令功能说明
dnf install package安装软件包及其依赖
dnf remove package卸载软件包
dnf update更新所有软件包
dnf upgrade升级所有软件包(与 update 类似)
dnf info package查看软件包详细信息
dnf list installed列出已安装软件包
dnf history查看事务历史记录
dnf search keyword搜索软件包名称或描述
dnf clean all清理缓存与元数据
dnf repolist查看启用的软件仓库列表

列出本地仓库

1
2
3
4
[root@lixiaohui ~]# dnf repolist all
repo id repo name status
rhel-9.3-for-x86_64-appstream-rpms Red Hat Enterprise Linux 9.3 AppStream (dvd) enabled
rhel-9.3-for-x86_64-baseos-rpms Red Hat Enterprise Linux 9.3 BaseOS (dvd) enabled

所有的仓库将以文件的方式存在于/etc/yum.repos.d/中,此路径中包括在系统中可用的仓库文件,文件名要求以repo结尾,具体格式如下:

1
2
3
4
5
6
7
8
9
10
11
[root@lixiaohui ~]# cat /etc/yum.repos.d/rhel_dvd.repo
[rhel-9.3-for-x86_64-baseos-rpms]
baseurl = http://content.example.com/rhel9.3/x86_64/dvd/BaseOS
enabled = 1
gpgcheck = false
name = Red Hat Enterprise Linux 9.3 BaseOS (dvd)
[rhel-9.3-for-x86_64-appstream-rpms]
baseurl = http://content.example.com/rhel9.3/x86_64/dvd/AppStream
enabled = true
gpgcheck = false
name = Red Hat Enterprise Linux 9.3 AppStream (dvd)

禁用和启用仓库

1
2
3
4
5
[root@lixiaohui ~]# dnf config-manager --disable rhel-9.3-for-x86_64-baseos-rpms
[root@lixiaohui ~]# dnf repolist all
repo id repo name status
rhel-9.3-for-x86_64-appstream-rpms Red Hat Enterprise Linux 9.3 AppStream (dvd) enabled
rhel-9.3-for-x86_64-baseos-rpms Red Hat Enterprise Linux 9.3 BaseOS (dvd) disabled
1
2
3
4
5
[root@lixiaohui ~]# dnf config-manager --enable rhel-9.3-for-x86_64-baseos-rpms
[root@lixiaohui ~]# dnf repolist all
repo id repo name status
rhel-9.3-for-x86_64-appstream-rpms Red Hat Enterprise Linux 9.3 AppStream (dvd) enabled
rhel-9.3-for-x86_64-baseos-rpms Red Hat Enterprise Linux 9.3 BaseOS (dvd) enabled

添加 DNF 仓库

1
2
3
4
5
6
7
8
[root@lixiaohui ~]# dnf config-manager --add-repo="https://dl.fedoraproject.org/pub/epel/9/Everything/x86_64/"
Adding repo from: https://dl.fedoraproject.org/pub/epel/9/Everything/x86_64/

[root@lixiaohui ~]# cat /etc/yum.repos.d/dl.fedoraproject.org_pub_epel_9_Everything_x86_64_.repo
[dl.fedoraproject.org_pub_epel_9_Everything_x86_64_]
name=created by dnf config-manager from https://dl.fedoraproject.org/pub/epel/9/Everything/x86_64/
baseurl=https://dl.fedoraproject.org/pub/epel/9/Everything/x86_64/
enabled=1

默认情况下,命令添加仓库时,没有GPG公钥,这个需要自己手工下载到系统中,并在repo文件中添加,添加好之后的样例如下:

1
2
3
4
5
6
[EPEL]
name=EPEL 9
baseurl=https://dl.fedoraproject.org/pub/epel/9/Everything/x86_64/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-9

DNF 安装软件

1
2
3
[root@lixiaohui ~]# dnf install httpd -y
...
Complete!

列出已安装的软件包

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
2
3
4
5
6
7
8
[root@lixiaohui ~]# dnf list kernel
Last metadata expiration check: 0:05:40 ago on Sun 18 Feb 2026 08:20:06 AM EST.
Installed Packages
kernel.x86_64 5.14.0-70.13.1.el9_0 @System
[root@lixiaohui ~]# uname -r
5.14.0-70.13.1.el9_0.x86_64
[root@lixiaohui ~]# uname -a
Linux lixiaohui 5.14.0-70.13.1.el9_0.x86_64 #1 SMP PREEMPT Thu Apr 14 12:42:38 EDT 2022 x86_64 x86_64 x86_64 GNU/Linux

只更新特定软件包:

1
[root@lixiaohui ~]# dnf update httpd

列出软件包组

dnf 命令也具有组的概念,即⼀起安装的相关软件集合。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@lixiaohui ~]# dnf group list
Last metadata expiration check: 0:07:56 ago on Sun 18 Feb 2026 08:20:06 AM EST.
Available Environment Groups:
Server with GUI
Server
Minimal Install
Workstation
Custom Operating System
Virtualization Host
Available Groups:
Legacy UNIX Compatibility
Console Internet Tools
Container Management
Development Tools
.NET Development
Graphical Administration Tools
Headless Management
Network Servers
RPM Development Tools
Scientific Support
Security Tools
Smart Card Support
System Tools

查询软件包组信息

这些集合提供的软件包或组可以列为 mandatory(安装该组时必须予以安装)、default(安装该组时通常会安装),或 optional(安装该组时不予安装,除⾮特别要求)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[root@lixiaohui ~]# dnf group info "System Tools"
Last metadata expiration check: 0:08:56 ago on Sun 18 Feb 2026 08:20:06 AM EST.
Group: System Tools
Description: This group is a collection of various tools for the system, such as the client for connecting to SMB shares and tools to monitor network traffic.
Default Packages:
NetworkManager-libreswan
chrony
cifs-utils
libreswan
nmap
openldap-clients
samba-client
setserial
tigervnc
tmux
zsh
Optional Packages:
PackageKit-command-not-found
aide
autofs
bacula-client
chrpath
convmv
createrepo_c
environment-modules
freerdp
fuse
gpm

安装软件包组

1
[root@lixiaohui ~]#  dnf group install "RPM Development Tools" -y

DNF 事务

所有安装和删除事务的⽇志都记录在 /var/log/dnf.rpm.log 中。

1
2
3
4
5
6
7
8
9
10
11
[root@lixiaohui ~]# tail /var/log/dnf.rpm.log
2026-02-18T08:32:46-0500 SUBDEBUG Installed: gdb-minimal-10.2-9.el9.x86_64
2026-02-18T08:32:47-0500 SUBDEBUG Installed: efi-srpm-macros-6-2.el9_0.noarch
2026-02-18T08:32:47-0500 SUBDEBUG Installed: dwz-0.14-3.el9.x86_64
2026-02-18T08:32:47-0500 SUBDEBUG Installed: fonts-srpm-macros-1:2.0.5-7.el9.1.noarch
2026-02-18T08:32:47-0500 SUBDEBUG Installed: go-srpm-macros-3.0.9-9.el9.noarch
2026-02-18T08:32:47-0500 SUBDEBUG Installed: python-srpm-macros-3.9-52.el9.noarch
2026-02-18T08:32:47-0500 SUBDEBUG Installed: redhat-rpm-config-194-1.el9.noarch
2026-02-18T08:32:47-0500 SUBDEBUG Installed: elfutils-0.186-1.el9.x86_64
2026-02-18T08:32:47-0500 SUBDEBUG Installed: rpm-build-4.16.1.3-12.el9_0.x86_64
2026-02-18T08:32:47-0500 SUBDEBUG Installed: rpmdevtools-9.5-1.el9.noarch

查询DNF 历史

1
2
3
4
5
6
[root@lixiaohui ~]# dnf history
ID | Command line | Date and time | Action(s) | Altered
------------------------------------------------------------------------------------------------------------
3 | group install RPM Development Tools -y | 2026-02-18 08:32 | Install | 78
2 | install httpd -y | 2026-02-18 08:20 | Install | 10 EE
1 | -y install @base firewalld vim-enhanced gpm xkeyboard | 2022-05-18 07:12 | D, I | 163 EE

撤销DNF事务

从上面的查询来看,ID为2是安装了httpd软件包,撤销就是卸载的意思

1
[root@lixiaohui ~]# dnf history undo 2

重做DNF事务

刚卸载了httpd,现在可以redo重做事务来再安装

1
[root@lixiaohui ~]# dnf history redo 2

第十三章 使⽤ Flatpak 安装和更新应⽤

Flatpak 的发展背景与初衷

在传统 Linux 桌面环境中,应用打包与分发长期依赖于发行版特定的包管理系统(如 RPM、DEB)。这导致:

  • 开发者需为每个发行版单独打包和测试
  • 用户安装非原生应用时常遇到依赖冲突或版本不兼容
  • 应用更新周期受限于发行版的更新策略
  • 安全性依赖于系统级权限控制,缺乏细粒度隔离

为了解决这些问题,Flatpak 应运而生。它由 GNOME 项目主导开发,旨在为 Linux 桌面应用提供一种统一、隔离、安全、可持续的打包与运行机制

Flatpak 的核心架构与技术理念

Flatpak 结合了容器技术与 Linux 内核特性,构建出一个适用于桌面应用的现代运行环境:

沙盒机制(Sandbox)

  • 每个应用在独立的运行空间中执行
  • 默认无法访问主机文件系统、网络、设备等资源
  • 通过权限声明机制(如 flatpak override)精细控制访问能力
  • 提高系统安全性,防止应用间干扰或恶意行为

运行时(Runtime)

  • Flatpak 应用依赖于共享的运行时环境(如 GNOME、KDE、Freedesktop)
  • 应用与运行时分离,便于统一维护与更新
  • 减少重复打包,提高系统资源利用率

镜像分发与版本控制

  • 应用以 Flatpak 镜像形式分发,包含所有依赖项
  • 支持版本回滚与多版本并存
  • 用户可从 Flathub 或私有仓库获取应用,统一更新管理

Flathub:Flatpak 的主流分发平台

Flathub 是 Flatpak 官方推荐的应用仓库,提供数百款主流桌面应用:

  • 开发工具:VS Code、IntelliJ IDEA
  • 图像处理:GIMP、Inkscape
  • 通讯工具:Slack、Telegram
  • 浏览器与媒体:Firefox、Spotify

Flathub 支持自动更新、版本选择、权限预览等功能,适合企业与个人用户统一部署与管理。

Flatpak 与其他技术的对比

特性FlatpakRPM/DEBAppImageSnap
兼容性跨发行版发行版特定跨发行版跨发行版
沙盒隔离✅ 支持❌ 无隔离❌ 无隔离✅ 支持
依赖管理镜像内打包 + 运行时系统依赖镜像内打包镜像内打包 + 运行时
更新机制支持自动更新依赖系统更新手动替换自动更新
应用来源Flathub/私有仓库官方仓库独立分发Snap Store

常用命令示例

1
2
3
4
5
flatpak install flathub org.gimp.GIMP     # 从 Flathub 安装 GIMP 应用
flatpak run org.gimp.GIMP # 启动 GIMP
flatpak list # 查看已安装的 Flatpak 应用
flatpak info org.gimp.GIMP # 查看应用详细信息
flatpak uninstall org.gimp.GIMP # 卸载应用

安装 Flatpak

1
2
3
[root@lxhhost1 ~]# dnf install flatpak -y
[root@lxhhost1 ~]# flatpak --version
Flatpak 1.16.0

Flatpak 远程存储库

RHEL 10 引入了基于 Flatpak 技术的远程对象存储库,作为红帽生态系统目录的一部分。该仓库用于:

  • 分发 Flatpak 格式的桌面应用与组件
  • 支持跨版本、跨平台的应用部署
  • 提供容器化的运行环境与依赖隔离机制

🔐 访问权限要求

访问该远程仓库需要身份认证,支持以下两种方式:

  1. 红帽客户门户账号凭据

    • 使用注册的 Red Hat 登录名与密码
    • 适用于个人或企业订阅用户
  2. 镜像仓库服务令牌(Registry Service Token)

    • 可在红帽客户门户中生成
    • 适用于自动化部署、CI/CD、脚本化访问

🛠️ 使用 podman login 进行认证

Podman 是 RHEL 默认的容器管理工具,支持无守护进程的容器操作。使用以下命令登录红帽容器目录:

1
podman login registry.redhat.io

看看本地都有哪些仓库?

1
2
3
4
5
6
[root@lxhhost1 ~]# flatpak remotes
名称 选项
rhel system,oci,no-gpg-verify
[root@lxhhost1 ~]# flatpak remotes -d
名称 标题 网址 集合标识 子集 筛选器 优先级 选项 … … 主页 图标
rhel Red Hat Enterprise Linux oci+https://flatpaks.redhat.io/rhel/ com.redhat.Stable - - 1 system,oci,no-gpg-verify … … https://catalog.redhat.com/software/containers/explore https://www.redhat.com/misc/favicon.ico

列出远程存储库中的应⽤

1
2
3
4
[root@lxhhost1 ~]# flatpak remote-ls --app
名称 应用程序 ID 版本 分支 架构
Thunderbird org.mozilla.Thunderbird stable x86_64
Firefox org.mozilla.firefox 140.4.0 stable x86_64

添加 Flatpak 远程存储库

1
2
3
4
5
[root@lxhhost1 ~]# flatpak remote-add --if-not-exists fedora oci+https://registry.fedoraproject.org
[root@lxhhost1 ~]# flatpak remotes
名称 选项
fedora system,oci
rhel system,oci,no-gpg-verify

添加 –user 选项以在⽤⼾安装模式下配置存储库。 在该模式下, Flatpak 对象仅供运⾏此命令的⽤⼾使⽤

1
[root@lxhhost1 ~]# flatpak remote-add --if-not-exists --user fedora oci+https://registry.fedoraproject.org

看看仓库配置文件

1
2
3
4
[root@lxhhost1 ~]# tree /etc/flatpak/
/etc/flatpak/
└── remotes.d
└── rhel.flatpakrepo
1
2
3
4
5
6
7
8
9
10
[root@lxhhost1 ~]# cat /etc/flatpak/remotes.d/rhel.flatpakrepo
[Flatpak Repo]
Title=Red Hat Enterprise Linux
Url=oci+https://flatpaks.redhat.io/rhel/
AuthenticatorName=org.flatpak.Authenticator.Oci
Homepage=https://catalog.redhat.com/software/containers/explore
Comment=Red Hat Enterprise Linux Flatpak applications and runtimes
Description=This repository contains Flatpaks of applications built for Red Hat Enterprise Linux, along with the Red Hat Flatpak Runtime and SDK.
Icon=https://www.redhat.com/misc/favicon.ico
CollectionID=com.redhat.Stable

删除 Flatpak 远程存储库

删除某个远程存储库之前, 必须先卸载从该存储库安装的所有软件

1
[root@lxhhost1 ~]# flatpak remote-delete fedora

如果你觉得卸载所有不合理,你可以用disable把他关了

1
[root@lxhhost1 ~]# flatpak remote-modify --disable fedora

Flatpak CLI 管理应用概览

Flatpak 提供强大的命令行工具,用于管理应用及其运行时环境。你可以通过 CLI 实现:

  • ✅ 安装、更新、卸载应用
  • ✅ 查询元数据与版本信息
  • ✅ 搜索远程仓库中的可用对象
  • ✅ 管理运行时依赖与分支版本

常用命令速查表

操作命令示例
安装应用flatpak install flathub org.gimp.GIMP
运行应用flatpak run org.gimp.GIMP
卸载应用flatpak uninstall org.gimp.GIMP
更新所有应用flatpak update
查看已安装应用flatpak list
查看应用信息flatpak info org.gimp.GIMP
搜索远程仓库flatpak search gimp
添加远程仓库flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

Flatpak 标识符机制

Flatpak 使用结构化标识符来唯一标识应用与运行时:

🔹 标准格式

1
domain.organization.App

例如:

  • org.gnome.Gedit
  • com.spotify.Client
  • org.kde.Kdenlive

🔹 三元组格式(用于架构与分支)

1
ID/architecture/branch

例如:

  • org.gnome.Gedit/x86_64/stable
  • org.kde.Kdenlive//beta
  • org.mozilla.Firefox/x86_64//

✅ 分支(branch)用于区分版本,如 stablebetanightly

使用 flatpak search 查询远程仓库

1
2
3
4
5
6
7
8
[root@lxhhost1 ~]# flatpak -v search firefox
F: No installations directory in /etc/flatpak/installations.d. Skipping
F: Opening system flatpak installation at path /var/lib/flatpak
F: Opening user flatpak installation at path /root/.local/share/flatpak
F: rhel:x86_64 appstream age 4432 is less than ttl 86400
F: Opening system flatpak installation at path /var/lib/flatpak
F: Opening user flatpak installation at path /root/.local/share/flatpak
Firefox Web Browser org.mozilla.firefox 140.4.0 stable rhel

该命令会:

  • 搜索所有已启用远程仓库中的匹配对象
  • 使用缓存元数据(自动更新超过一天的缓存)
  • 匹配字段包括:
    • 应用名称
    • 描述
    • 标识符
    • 开发者定义的关键字(不区分大小写)

⚠️ 红帽支持范围说明

  • ✅ 支持来自红帽官方 Flatpak 仓库的应用与运行时
  • ❌ 不支持来自第三方远程仓库(如 Flathub)的内容
  • 建议在企业环境中使用红帽认证的 Flatpak 镜像与仓库

安装flatpak软件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@lxhhost1 ~]# flatpak install firefox
寻找匹配项…
在远程仓库“rhel”(system)中找到引用“app/org.mozilla.firefox/x86_64/stable”。
使用该引用吗? [Y/n]: y
在远程仓库 rhel 中找到 org.mozilla.firefox/x86_64/stable(runtime/com.redhat.Platform/x86_64/el10)需要的运行时
您想要安装它吗? [Y/n]: y

org.mozilla.firefox 权限:
ipc network pcsc pulseaudio wayland
x11 devices file access [1] dbus access [2] bus ownership [3]
system dbus access [4]

[1] /run/.heim_org.h5l.kcm-socket, home:ro, xdg-download, xdg-run/gvfs, xdg-run/gvfsd, xdg-run/pipewire-0,
~/.cache/firefox:create, ~/.mozilla:create
[2] org.a11y.Bus, org.freedesktop.FileManager1, org.freedesktop.Notifications, org.freedesktop.ScreenSaver,
org.gnome.SessionManager, org.gtk.vfs.*
[3] org.mozilla.firefox.*, org.mpris.MediaPlayer2.firefox.*
[4] org.freedesktop.NetworkManager


ID 分支 操作 远程 下载
1. com.redhat.Platform el10 i rhel < 395.1 MB
2. org.mozilla.firefox stable i rhel < 145.3 MB

继续对系统安装进行这些更改吗? [Y/n]: y

从特定分⽀安装 Flatpak 对象

1
2
3
4
5
6
7
8
9
10
[root@lxhhost1 ~]# flatpak remote-info rhel com.redhat.Platform
错误: com.redhat.Platform 有多个可用分支,您必须指定一个:com.redhat.Platform/x86_64/el10, com.redhat.Platform/x86_64/el9, com.redhat.Platform/x86_64/el8
[root@lxhhost1 ~]# flatpak install com.redhat.Platform/x86_64/el8
寻找匹配项…


ID 分支 操作 远程 下载
1. com.redhat.Platform el8 i rhel < 362.5 MB

继续对系统安装进行这些更改吗? [Y/n]: y

如果要更新就执行:

1
flatpak update com.redhat.Platform

防⽌对某些对象进⾏不必要的升级

1
flatpak mask com.redhat.Platform

列出已经安装好的应用

1
flatpak list

卸载应用

卸载某个应⽤后, 该应⽤的数据⽬录将保留在系统的 ~/.var/app ⽬录中。 为避免陈旧数据占⽤存储空间, 可以使⽤ –delete-data 选项。

1
flatpak uninstall --delete-data thunderbird

常用选项说明与应用场景

选项说明应用场景
--runtime仅安装运行时安装依赖环境而非具体应用
--app仅安装应用安装应用本体,跳过运行时
--or-update已安装则更新自动保持最新版本,适合脚本部署
--system安装到系统级位置所有用户可用,适合多用户环境
--user安装到当前用户位置仅当前用户可用,适合个人桌面
--assumeyes自动回答“是”自动化安装,无需人工确认
--no-deploy不部署本地缓存跳过部署阶段,用于调试或预处理
--no-pull不拉取远程内容仅使用本地缓存,适合离线环境
--noninteractive最小输出 + 自动确认静默安装,适合脚本或 CI/CD 场景

第十四章 访问可移动介质

红帽企业 Linux(RHEL)在文件系统与存储管理方面提供了强大的支持,涵盖本地磁盘、可移动介质、挂载机制与块设备识别。

支持的文件系统类型

文件系统说明适用场景
XFS默认文件系统,支持高性能与大文件RHEL 7+ 默认,适合服务器与生产环境
ext4扩展文件系统,稳定可靠兼容性好,适合通用场景
exFAT微软开发的可扩展文件分配表RHEL 10 起支持,用于 USB、SD 卡等可移动介质

✅ exFAT 适用于跨平台数据交换,尤其在 Windows 与 Linux 间传输文件时非常有用。

文件系统挂载机制

  • 挂载是将文件系统连接到某个目录(挂载点)以访问其内容
  • 挂载点是一个空目录,如 /mnt/usb/media/data
  • 挂载后可使用 ls 命令查看内容:
1
2
sudo mount /dev/sdb1 /mnt/usb
ls /mnt/usb

启动时自动挂载的文件系统通常由 /etc/fstab 配置控制

挂载点 vs Windows 驱动器盘符

系统表现方式特点
Linux挂载点目录(如 /mnt/data多个文件系统可整合进单一目录树
Windows盘符(如 C:\, D:\每个文件系统独立挂载为一个驱动器

✅ Linux 的挂载点更灵活,支持将多个设备挂载到任意目录结构中。

块设备与分区管理

  • 块设备是 Linux 中表示存储硬件的文件,位于 /dev 目录下
  • 常见设备命名规则:
设备类型示例路径说明
第一个硬盘/dev/sda整个磁盘设备
第二个硬盘/dev/sdb第二块磁盘
分区/dev/sda1, /dev/sdb2磁盘上的逻辑分区
  • 分区需先格式化为文件系统(如 XFS、ext4)后才能挂载:
1
2
sudo mkfs.xfs /dev/sdb1
sudo mount /dev/sdb1 /mnt/data

逻辑卷

LVM 是一种灵活的磁盘管理机制,允许将多个物理存储设备聚合为一个逻辑结构,并动态分配、调整存储空间。相比传统分区方式,LVM 更适合企业级环境中的动态扩容与存储优化。

🧩 LVM 的核心结构

组件说明示例
PV(物理卷)格式化后的块设备,如硬盘分区/dev/sdb1
VG(卷组)由一个或多个 PV 组成的逻辑存储池myvg
LV(逻辑卷)从 VG 中分配的逻辑分区,类似传统分区mylv

✅ LVM 将底层硬件抽象为逻辑结构,便于扩展与管理。

📂 LVM 的挂载路径

创建逻辑卷后,系统会在 /dev 目录下生成如下路径:

1
/dev/<卷组名>/<逻辑卷名>

文件系统查询

  1. 使⽤ df 命令可显⽰本地和远程⽂件系统设备的概览,其中包括总磁盘空间、已⽤磁盘空间、可⽤
    磁盘空间,以及占整个磁盘空间的百分⽐

df 命令的 -h 或 -H 选项是⼈类可读选项,可以改善输出⼤⼩的可读性。-h 选项的报告单位是 KiB(1024进制),⽽ -H 选项的报告单位是 SI 单位(1000进制)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@lixiaohui ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 844M 0 844M 0% /dev
tmpfs 888M 0 888M 0% /dev/shm
tmpfs 355M 9.5M 346M 3% /run
/dev/vda4 9.4G 1.8G 7.6G 19% /
/dev/vda3 495M 160M 335M 33% /boot
/dev/vda2 200M 7.0M 193M 4% /boot/efi
tmpfs 178M 0 178M 0% /run/user/0
[root@lixiaohui ~]# df -H
Filesystem Size Used Avail Use% Mounted on
devtmpfs 885M 0 885M 0% /dev
tmpfs 931M 0 931M 0% /dev/shm
tmpfs 373M 10M 363M 3% /run
/dev/vda4 10G 1.9G 8.2G 19% /
/dev/vda3 519M 168M 351M 33% /boot
/dev/vda2 210M 7.4M 203M 4% /boot/efi
tmpfs 187M 0 187M 0% /run/user/0
  1. du 命令的 -h 和 -H 选项可以将输出转换为⼈类可读格式。du 命令以递归⽅式显⽰当前⽬录树中所有⽂件的⼤⼩。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@lixiaohui ~]# du /boot
6132 /boot/efi/EFI/redhat
1012 /boot/efi/EFI/BOOT
7148 /boot/efi/EFI
7164 /boot/efi
4 /boot/loader/entries
4 /boot/loader
2340 /boot/grub2/fonts
3344 /boot/grub2/i386-pc
5692 /boot/grub2
141348 /boot
[root@lixiaohui ~]# du -h /boot
6.0M /boot/efi/EFI/redhat
1012K /boot/efi/EFI/BOOT
7.0M /boot/efi/EFI
7.0M /boot/efi
4.0K /boot/loader/entries
4.0K /boot/loader
2.3M /boot/grub2/fonts
3.3M /boot/grub2/i386-pc
5.6M /boot/grub2
139M /boot
[root@lixiaohui ~]# du -s /boot
141348 /boot
[root@lixiaohui ~]# du -sh /boot
139M /boot

挂载和卸载⽂件系统

⼿动挂载⽂件系统

通过 mount 命令,root ⽤⼾可以⼿动挂载⽂件系统。mount 命令的第⼀个参数指定要挂载的⽂件系统。第⼆个参数指定在⽂件系统层次结构中⽤作挂载点的⽬录。

可以使⽤ mount 命令,以下列⽅式之⼀挂载⽂件系统:

  1. 使⽤ /dev ⽬录中的设备⽂件名。
  2. 使⽤ UUID,即设备的通⽤唯⼀标识符。

注意 如果使⽤ mount 命令挂载⽂件系统,之后⼜重新了启动系统,该⽂件系统不会⾃动重新挂载,需要手工挂载,在RH134课程中,我们将介绍如何处理此情况,其实就是/etc/fstab

识别块设备

使⽤ lsblk 命令可列出指定块设备或所有可⽤设备的详细信息

1
2
3
4
5
6
7
8
9
10
11
[root@lixiaohui ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
vda 252:0 0 10G 0 disk
├─vda1 252:1 0 1M 0 part
├─vda2 252:2 0 200M 0 part /boot/efi
├─vda3 252:3 0 500M 0 part /boot
└─vda4 252:4 0 9.3G 0 part /
vdb 252:16 0 5G 0 disk
└─vdb1 252:17 0 5G 0 part
vdc 252:32 0 5G 0 disk
vdd 252:48 0 5G 0 disk

使⽤分区名称挂载⽂件系统

1
2
3
[root@lixiaohui ~]# mount /dev/vdb1 /mnt
[root@lixiaohui ~]# df -h | grep mnt
/dev/vdb1 5.0G 68M 5.0G 2% /mnt

使⽤分区 UUID 挂载⽂件系统

1
2
3
[root@lixiaohui ~]# mount UUID="8599ac53-e0cc-4ca0-a3eb-233ccbcff9bd" /opt
[root@lixiaohui ~]# df -h | grep opt
/dev/vdb1 5.0G 68M 5.0G 2% /opt

卸载⽂件系统

umount 命令使⽤挂载点作为参数,以卸载⽂件系统。

1
[root@lixiaohui ~]# umount /mnt

如果挂载的⽂件系统在使⽤之中,则⽆法卸载。要成功执⾏ umount 命令,所有进程必须停⽌访问挂载点下的数据。lsof 命令可列出所有打开的⽂件,以及访问该⽂件系统的进程。此列表可以帮助识别哪些进程正在阻⽌⽂件系统被成功卸载

1
2
3
4
5
6
[root@lixiaohui opt]# lsof | grep /opt
bash 5883 root cwd DIR 252,17 6 128 /opt
lsof 32373 root cwd DIR 252,17 6 128 /opt
grep 32374 root cwd DIR 252,17 6 128 /opt
lsof 32375 root cwd DIR 252,17 6 128 /opt
[root@lixiaohui opt]# kill -9 5883

文件搜索工具概览

在 Linux 系统中,系统管理员常用以下两种命令来搜索文件:

命令搜索方式优势适用场景
locate基于预生成索引数据库快速、资源消耗低搜索文件名或路径,适合频繁查询
find实时遍历文件系统层级精确、灵活按条件搜索文件,适合复杂筛选

locate 命令详解

✅ 特点

  • 使用 /var/lib/mlocate/mlocate.db 数据库进行搜索
  • 数据库由 updatedb 命令定期更新
  • 搜索速度极快,但结果可能不是最新的

🛠️ 示例

1
2
3
4
5
[root@lixiaohui ~]# locate passwd
/etc/passwd
/etc/passwd
/etc/pam.d/passwd
...

🔄 更新数据库(需 root 权限)

1
sudo updatedb

find 命令详解

✅ 特点

  • 实时遍历指定目录及其子目录
  • 支持多种搜索条件(名称、大小、时间、权限等)
  • 可执行后续操作(如删除、移动、修改权限)

🛠️ 常用示例

基于名称的查询

1
2
3
4
find / -name sshd_config
find / -name '*.txt'
find /etc -name '*pass*'
find / -iname '*messages*'

基于用户或组的查询

1
2
3
4
5
find -user developer
find -group developer
find -uid 1000
find -gid 1000
find / -user root -group mail

基于特定权限的查询,权限前⾯带有 / 或 - 符号,以控制搜索结果

  1. 带有 / 符号将匹配权限集中为⽤⼾、组或其他⼈设置了⾄少⼀个权限的⽂件。具有r–r–r– 权限的⽂件与 /222 权限不匹配,但与 rw-r–r– 权限匹配。

  2. 权限前带有 - 符号表⽰权限的所有三个部分都必须匹配。对于上⼀⽰例,具有 rw-rw-rw- 权限的⽂件将符合条件

1
2
3
4
5
6
7
8
9
10
11
find /home -perm 764
find /home -perm u=rwx,g=rw,o=r
find /home -perm 764 -ls
find /home -perm -324
find /home -perm -u=wx,g=w,o=r
find /home -perm /442
find /home -perm /u=r,g=r,o=w
find -perm -004
find -perm -o=r
find -perm -002
find -perm -o=w

基于文件大小的查询

1
2
3
find -size 10M
find -size +10G
find -size -10k

基于时间的查询

1
2
3
find / -mmin 120
find / -mmin +200
find / -mmin -150

基于文件类型的查询

1
2
3
4
find /etc -type d
find / -type l
find /dev -type b
find / -type f -links +1

locate vs find 对比总结

特性locatefind
搜索速度极快(基于索引)较慢(实时遍历)
数据实时性依赖数据库更新实时
搜索条件仅支持路径/文件名匹配支持多种条件组合
系统资源占用极低较高
后续操作不支持支持执行命令(如删除、修改)

第十五章 监控和管理 Linux 进程

什么是进程(Process)

在 Linux 中,进程是一个正在运行的程序实例,它是系统资源调度与管理的基本单位。

进程的组成结构

每个进程从创建那一刻起,包含以下核心元素:

组成部分说明
地址空间已分配的内存区域,用于存储代码、数据、堆栈等
安全属性包括 UID/GID、权限、SELinux 上下文等
执行线程至少一个主线程,可能包含多个并发线程
进程状态包括运行、睡眠、停止、僵尸等状态信息

PS 查询进程

进程有多个状态,要警惕僵尸状态的进程,查询状态的命令如下:

  1. ps

ps 通常是一次性的输出,可以用于配合grep来筛选特定进程是否存在

1
2
3
4
5
6
7
8
[root@host1 ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1314 0.0 0.0 16064 9380 ? Ss 21:55 0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
root 2660 0.0 0.0 19444 12360 ? Ss 21:58 0:00 sshd: root [priv]
root 2667 0.0 0.0 19444 12176 ? Ss 21:58 0:00 sshd: root [priv]
root 2696 0.0 0.0 19712 7336 ? S 21:58 0:00 sshd: root@pts/0
root 2718 0.0 0.0 19444 6496 ? S 21:58 0:00 sshd: root@notty
root 2793 0.0 0.0 221800 2356 pts/0 S+ 22:04 0:00 grep --color=auto sshd

在查询中,注意–color=auto这一行,这一行是ps命令回车产生的命令本身进程,并不算查询结果中的一个

1
2
3
4
5
6
7
[root@host1 ~]# ps aux | grep sshd
root 1314 0.0 0.0 16064 9380 ? Ss 21:55 0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
root 2660 0.0 0.0 19444 12360 ? Ss 21:58 0:00 sshd: root [priv]
root 2667 0.0 0.0 19444 12176 ? Ss 21:58 0:00 sshd: root [priv]
root 2696 0.0 0.0 19712 7336 ? S 21:58 0:00 sshd: root@pts/0
root 2718 0.0 0.0 19444 6496 ? S 21:58 0:00 sshd: root@notty
root 2797 0.0 0.0 221800 2192 pts/0 S+ 22:05 0:00 grep --color=auto sshd

查询进程之间的依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@host1 ~]# pstree
systemd─┬─ModemManager───3*[{ModemManager}]
├─NetworkManager───2*[{NetworkManager}]
├─VGAuthService
├─accounts-daemon───3*[{accounts-daemon}]
├─anacron
├─atd
├─auditd─┬─sedispatch
│ └─2*[{auditd}]
├─avahi-daemon───avahi-daemon
├─chronyd
├─colord───3*[{colord}]
├─crond
├─dbus-broker-lau───dbus-broker
├─dhcpd
├─2*[dnsmasq───dnsmasq]
├─dnsmasq
├─firewalld───{firewalld}
├─fwupd───4*[{fwupd}]
├─gdm─┬─gdm-session-wor─┬─gdm-wayland-ses─┬─gnome-session-b───3*[{gnome-session-b}]
│ │ │ └─2*[{gdm-wayland-ses}]
│ │ └─2*[{gdm-session-wor}]
│ └─2*[{gdm}]

树形格式查询进程

1
2
3
4
[root@host1 ~]# ps --forest
PID TTY TIME CMD
2710 pts/0 00:00:00 bash
2817 pts/0 00:00:00 \_ ps

top 查询进程

  1. top

top 通常用于动态观察系统的压力情况,和Windows 任务管理器相似

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@host1 ~]# top
top - 22:07:00 up 11 min, 2 users, load average: 0.00, 0.03, 0.04
Tasks: 427 total, 1 running, 426 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 15966.9 total, 14038.1 free, 1339.8 used, 589.0 buff/cache
MiB Swap: 65536.0 total, 65536.0 free, 0.0 used. 14328.7 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2804 root 20 0 226316 4392 3512 R 6.2 0.0 0:00.01 top
1 root 20 0 172500 16788 10384 S 0.0 0.1 0:01.67 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.06 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp

我们注意到top命令右上角有一个 load average,这是系统的平均负载,表⽰⼀段时间内感知的系统负载,三个数字是最近 1 分钟、5 分钟和 15 分钟内的平均值

负载平均值代表⼀段时间内感知的系统负载。通过报告 CPU 上准备运⾏的进程数以及等待磁盘或⽹络 I/O 完成的进程数,Linux 可以确定负载平均值

还可以通过以下命令显示这三个数字:

1
2
[root@host1 ~]# uptime
22:12:50 up 17 min, 2 users, load average: 0.00, 0.00, 0.01

这个数字和你的CPU核心数有关系,有一个核心,那每个数字最好都不好接近或超过1,趋近于1就说明CPU可能处于100%,两个核心,那就是不要趋近于2

查询CPU信息

可以看出,我的电脑有4个CPU,每个cpu插槽里有4个核心,每个核心是一个超线程,那就是我有16核心

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@host1 ~]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Address sizes: 45 bits physical, 48 bits virtual
Byte Order: Little Endian
CPU(s): 16
On-line CPU(s) list: 0-15
Vendor ID: GenuineIntel
BIOS Vendor ID: GenuineIntel
Model name: 11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz
BIOS Model name: 11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz
CPU family: 6
Model: 141
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@host1 ~]# grep "model name" /proc/cpuinfo | wc -l
16
[root@host1 ~]# grep "model name" /proc/cpuinfo
model name : 11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz
model name : 11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz
model name : 11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz
model name : 11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz
model name : 11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz
model name : 11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz
model name : 11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz
model name : 11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz
model name : 11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz
model name : 11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz
model name : 11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz
model name : 11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz
model name : 11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz
model name : 11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz
model name : 11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz
model name : 11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz

TOP 快捷键

快捷键效果
u过滤⽤⼾名称
M按照内存使⽤率,以降序⽅式对进程列表排序
P按照处理器使⽤率,以降序⽅式对进程列表排序
k中止特定进程
r调整nice值
h查询top命令其他快捷键或帮助

进程或作业管理

每一次的shell命令回车,系统都会创建一个作业或进程

安排后台作业

任何命令或管道都可以在后台启动,只需在命令上附加⼀个 & 符号即可

我们在后台安排了一个任务,并看到作业编号为1,进程编号为2875

1
2
3
4
[lixiaohui@host1 ~]$ sleep 1000 &
[1] 2875
[lixiaohui@host1 ~]$ jobs
[1]+ Running sleep 1000 &

如果将包含竖线 (|) 的命令⾏发送到后台,将显⽰管道中最后⼀个命令的 PID

将后台作业调度到前台

使⽤ fg 命令将后台作业置于前台。使⽤ (%jobNumber) 格式将进程指定到前台

+ 符号表⽰此作业是当前的默认作业。如果不带 %jobNumber 参数使⽤作业控制命令,则对默认作业执⾏操作。- 符号表⽰在当前默认作业完成时将成为默认作业的上⼀作业。

1
2
3
4
5
[lixiaohui@host1 ~]$ jobs
[1]+ Running sleep 1000 &
[lixiaohui@host1 ~]$
[lixiaohui@host1 ~]$ fg %1
sleep 1000

将前台作业调度到后台

要将前台进程发送到后台,在终端中按键盘⽣成的暂停请求 (Ctrl+z)。该作业将被置于后台并暂停,然后执行bg %NUMBER继续后台运行

1
2
3
4
5
6
7
8
9
10
11
12
13
[lixiaohui@host1 ~]$ jobs
[1]+ Running sleep 1000 &
[lixiaohui@host1 ~]$
[lixiaohui@host1 ~]$ fg %1
sleep 1000
^Z
[1]+ Stopped sleep 1000
[lixiaohui@host1 ~]$ jobs
[1]+ Stopped sleep 1000
[lixiaohui@host1 ~]$ bg %1
[1]+ sleep 1000 &
[lixiaohui@host1 ~]$ jobs
[1]+ Running sleep 1000 &

查询特定所用的所有进程

1
2
3
[lixiaohui@host1 ~]$ pgrep -u lixiaohui
2849
2875

杀死特定用户的所有进程

有时候我们可能会怀疑被人非法入侵,我们需要知道有谁登录了系统,如果异常,要把用户踢下去

1
2
3
4
5
6
7
8
9
10
[root@host1 ~]# w
22:46:55 up 51 min, 2 users, load average: 0.00, 0.00, 0.00
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
laoli tty2 21:55 51:15 0.06s 0.06s /usr/libexec/gnome-session-binary
root pts/0 21:58 6.00s 0.03s 0.00s w
[root@host1 ~]# pkill -u laoli
[root@host1 ~]# w
22:47:02 up 51 min, 1 user, load average: 0.00, 0.00, 0.00
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 21:58 5.00s 0.05s 0.01s w

还有一些杀死进程的方法:

  1. kill PID # 这种是温柔的杀死进程,进程会正常退出

  2. kill -9 #这种是暴力杀死进程,进程数据可能会异常,但是有时候可能也没办法

  3. pgrep和pkill # 查询和杀死特定用户的进程

  4. killall programName #基于名称的杀死进程

第十六章 控制服务和守护进程

systemd 守护进程管理 Linux 的启动过程,⼀般包括服务启动和服务管理,在红帽企业 Linux 中,第⼀个启动的进程 (PID 1) 是 systemd 守护进程

服务单元介绍

单元通过称为单元⽂件的配置⽂件表⽰,其中封装了关于系统服务、侦听套接字以及与 systemd init 系统相关的其他对象的信息。单元具有名称和单元类型。名称为单元提供唯⼀标识。通过单元类型,可以将单元与其他类似的单元类型分组到⼀起

列出服务单元

使⽤ systemctl 命令来探索系统的当前状态

1
2
3
4
5
6
7
[root@host1 ~]# systemctl list-units --type=service
UNIT LOAD ACTIVE SUB DESCRIPTION >
accounts-daemon.service loaded active running Accounts Service
atd.service loaded active running Deferred execution scheduler
auditd.service loaded active running Security Auditing Service
avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack
chronyd.service loaded active running NTP client/server

systemctl list-units –type=service 命令仅列出激活状态为 active 的服务单元。systemctl list-units –all 选项可列出所有服务单元,不论激活状态如何

1
2
3
4
5
6
7
8
9
10
11
12
[root@host1 ~]# systemctl list-units --type=service --all
UNIT LOAD ACTIVE SUB DESCRIPTION >
accounts-daemon.service loaded active running Accounts Service
● alsa-restore.service not-found inactive dead alsa-restore.service
● alsa-state.service not-found inactive dead alsa-state.service
● apparmor.service not-found inactive dead apparmor.service
atd.service loaded active running Deferred execution scheduler
auditd.service loaded active running Security Auditing Service
auth-rpcgss-module.service loaded inactive dead Kernel Module supporting RPCSEC_GSS
● auto-cpufreq.service not-found inactive dead auto-cpufreq.service
autofs.service loaded inactive dead Automounts filesystems on demand
avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack

systemctl 命令 list-units 选项可显⽰ systemd 服务尝试解析并加载到内存中的单元。此选项不显⽰已安装但未启⽤的服务,可以使⽤ systemctl 命令 list-unit-files 选项来查看所有已安装的单元⽂件的状态

1
2
3
4
5
6
7
8
9
10
[root@host1 ~]# systemctl list-unit-files --type=service
UNIT FILE STATE VENDOR PRESET
accounts-daemon.service enabled enabled
arp-ethers.service disabled disabled
atd.service enabled enabled
auditd.service enabled enabled
auth-rpcgss-module.service static -
autofs.service disabled disabled
autovt@.service alias -
avahi-daemon.service enabled enabled

查看服务状态

使⽤ systemctl status name.type 命令来查看单元的状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@host1 ~]# systemctl status sshd.service
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2026-02-06 21:55:43 CST; 1h 37min ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 1314 (sshd)
Tasks: 1 (limit: 101924)
Memory: 8.4M
CPU: 111ms
CGroup: /system.slice/sshd.service
└─1314 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"

Feb 06 21:55:43 host1 systemd[1]: Starting OpenSSH server daemon...
Feb 06 21:55:43 host1 sshd[1314]: Server listening on 0.0.0.0 port 22.
Feb 06 21:55:43 host1 sshd[1314]: Server listening on :: port 22.
Feb 06 21:55:43 host1 systemd[1]: Started OpenSSH server daemon.

验证服务的状态

使⽤ systemctl 命令 is-active 选项来验证服务单元是否处于活动状态(正在运⾏)

运⾏ systemctl 命令 is-enabled 选项可验证服务单元是否已启⽤为在系统引导期间⾃动启动

验证单元是否在启动过程中失败,请运⾏ systemctl 命令 is-failed 选项

要列出所有失败的单元,请运⾏ systemctl –failed –type=service 命令

1
2
3
4
5
6
7
8
9
[root@host1 ~]# systemctl is-active sshd.service
active
[root@host1 ~]# systemctl is-enabled sshd.service
enabled
[root@host1 ~]# systemctl is-failed sshd.service
active
[root@host1 ~]# systemctl --failed --type=service
UNIT LOAD ACTIVE SUB DESCRIPTION
0 loaded units listed.

管理服务状态

启动服务

1
[root@host1 ~]# systemctl start psacct.service

停止服务

1
[root@host1 ~]# systemctl stop psacct.service

启用服务

启用服务使得服务器重启时, 此服务会自动启动,可以加--now来立刻影响服务状态

1
2
[root@host1 ~]# systemctl enable psacct.service
Created symlink /etc/systemd/system/multi-user.target.wants/psacct.service → /usr/lib/systemd/system/psacct.service.

禁用服务

禁用服务使得服务器重启时, 此服务会不自动启动,可以加--now来立刻影响服务状态

1
2
[root@host1 ~]# systemctl disable psacct.service
Removed /etc/systemd/system/multi-user.target.wants/psacct.service.

重启服务

1
[root@host1 ~]# systemctl restart psacct.service

重新加载服务

修改了配置文件的参数时,不一定要重启服务,因为重启服务会结束进程,重新启动,而reload是在现有进程基础上重新加载新参数

1
[root@host1 ~]# systemctl reload psacct.service

如果不确定服务是否具有重新加载配置⽂件更改的功能,试试这个命令,如果重新加载功能可⽤, 该命令就会重新加载配置更改。 否则, 该命令将重新启动服务

1
[root@host1 ~]# systemctl reload-or-restart psacct.service

列出服务的依赖项

1
2
3
4
5
6
7
8
9
[root@host1 ~]# systemctl list-dependencies sshd.service
sshd.service
● ├─system.slice
● ├─sshd-keygen.target
○ │ ├─sshd-keygen@ecdsa.service
○ │ ├─sshd-keygen@ed25519.service
○ │ └─sshd-keygen@rsa.service
● └─sysinit.target
● ├─dev-hugepages.mount

屏蔽服务

部分服务之间可能彼此冲突,或者你不需要停止a服务后,a服务又被其他管理员启动或被b服务唤醒

1
2
3
4
5
6
7
8
9
[root@host1 ~]# systemctl mask psacct.service
Created symlink /etc/systemd/system/psacct.service → /dev/null.
[root@host1 ~]# systemctl restart psacct
Failed to restart psacct.service: Unit psacct.service is masked.
[root@host1 ~]# systemctl unmask psacct.service
Removed /etc/systemd/system/psacct.service.
[root@host1 ~]# systemctl restart psacct
[root@host1 ~]# systemctl is-active psacct
active

第十七章 ⽹络简介

TCP/IP 网络模型概览

TCP/IP 模型是互联网通信的基础架构,由 四个层级协议栈组成,定义了数据在网络中如何被打包、寻址、传输、路由和接收。

该模型由 RFC 1122 规范定义,广泛应用于 Linux、Windows、Unix 等操作系统。

TCP/IP 四层结构与功能

层级功能示例协议
应用层提供用户接口与应用服务HTTP, FTP, SSH, DNS, SMTP
传输层提供端到端的数据传输与可靠性TCP, UDP
互联网层实现主机间的寻址与路由IP, ICMP, ARP
链路层控制物理传输与数据帧封装Ethernet, Wi-Fi, PPP, Frame Relay

与 OSI 七层模型的对比

虽然 TCP/IP 模型只有四层,但它与 OSI 七层模型可以对应如下:

TCP/IP 层对应 OSI 层
应用层应用层、表示层、会话层
传输层传输层
互联网层网络层
链路层数据链路层、物理层

✅ TCP/IP 更贴近实际实现,OSI 更偏理论参考

数据封装流程(简化)

  1. 应用层生成数据(如 HTTP 请求)
  2. 传输层封装为 TCP/UDP 段,添加端口号
  3. 互联网层封装为 IP 包,添加源/目标 IP 地址
  4. 链路层封装为帧,添加 MAC 地址并通过物理介质发送

网络接口命名规则(RHEL 7+)

类型前缀说明
en以太网接口
wlWLAN 无线接口
wwWWAN 移动网络接口
后缀结构示例说明
oNeno1板载设备
sNens3PCI 热插拔插槽
pMsNwlp4s0PCI 总线 + 插槽位置

IP 地址基础

IPv4

  • 格式:32 位十进制地址,如 192.168.1.1
  • 子网计算:192.168.1.0/24 → 可用地址数 = 2^(32-24) - 2 = 254

IPv6

  • 格式:128 位十六进制地址,如 2001:db8:0:10::1
  • 简化规则:
    • 去前导零:0001 → 1
    • 连续零用 :: 表示(仅一次)
    • 加端口:[2001:db8::1]:80

IPv6地址中的字母是A-F

主机名解析与 DNS

文件作用
/etc/hosts静态主机名映射(仅本机)
/etc/resolv.confDNS 服务器配置列表

网络接口与地址查询

1
ip addr show

示例解析:

  • 接口:lo(环回)与 ens160(以太网)
  • IPv4 地址:172.25.254.250/24
  • MAC 地址:00:0c:29:6a:16:13
  • IPv6 地址:fe80::20c:29ff:fe6a:1613/64

网络连通性测试

IPv4

1
2
ping 127.0.0.1
ping -c 2 192.168.1.1

IPv6

1
ping6 fe80::c38a:ac39:36a1:a43c

识别⽹络设备

ip link 命令将列出系统上可⽤的所有⽹络接⼝

1
2
3
4
5
6
7
[root@lxhhost1 ~]# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 00:0c:29:77:70:12 brd ff:ff:ff:ff:ff:ff
altname enp3s0
altname enx000c29777012

路由与路径追踪

查看路由表

1
2
ip route
ip -6 route

路由追踪

1
2
tracepath classroom
traceroute -6 ipv6.example.com

mtr(My Traceroute)是一个结合了 pingtraceroute 功能的网络诊断工具,用于实时追踪数据包从本地主机到目标主机的路径,并统计每一跳的延迟与丢包率。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@lxhhost1 ~]# mtr -r www.linuxcenter.cn
Start: 2026-1-05T15:46:35+0800
HOST: lxhhost1 Loss% Snt Last Avg Best Wrst StDev
1.|-- _gateway 0.0% 10 0.4 0.3 0.2 0.5 0.1
2.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
3.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
4.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
5.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
6.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
7.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
8.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
9.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
10.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
11.|-- 182.84.202.85 0.0% 10 15.7 15.1 14.7 15.8 0.4

端口与服务故障排查

查看端口监听状态

1
ss -tunlpa
参数说明
-tTCP 套接字
-uUDP 套接字
-n显示端口号而非名称
-l仅显示监听状态
-a显示所有套接字
-p显示进程信息

标准端口参考

1
cat /etc/services

第十八章 管理⽹络配置

核心概念

概念说明
Device(设备)物理或虚拟网络接口,如 ens160, wlp2s0
Connection(连接)网络配置集,定义设备的 IP、网关、DNS 等参数
NetworkManager管理设备与连接的服务,支持图形与命令行操作

✅ 每个连接配置集必须有唯一名称,与设备绑定,同一设备可配置多个连接,但一次只能激活一个。

配置文件位置与格式

项目说明
配置目录/etc/NetworkManager/system-connections/
文件格式INI 样式的键值对结构(如 [ipv4], [connection]
文件权限需设置为 600,否则 NetworkManager 不会加载配置文件

❌ RHEL 10 已完全移除对旧式 ifcfg-* 文件和 /etc/sysconfig/network-scripts/ 的支持。

查看⽹络信息

以下信息中,eth0这个网络是类型是Ethernet,并已经连接到lxh-connection的链接,eno2的state部分显示disconnected,表示此接口此时不用于网络通信

1
2
3
4
5
[root@lixiaohui ~]# nmcli device status
DEVICE TYPE STATE CONNECTION
eth0 ethernet connected lxh-connection
lo loopback unmanaged --
eno2 ethernet disconnected --

查询所有链接

nmcli connection show 命令可显⽰所有连接的列表。使⽤ --active 选项可仅列出活动的连接

1
2
3
4
5
6
7
8
9
[root@lixiaohui ~]# nmcli con show
NAME UUID TYPE DEVICE
eno2 ff9f7d69-db83-4fed-9f32-939f8b5f81cd 802-3-ethernet -
static-ens3 72ca57a2-f780-40da-b146-99f71c431e2b 802-3-ethernet ens3
eno1 87b53c56-1f5d-4a29-a869-8a7bdaf56dfa 802-3-ethernet eno1
[root@lixiaohui ~]# nmcli con show --active
NAME UUID TYPE DEVICE
static-ens3 72ca57a2-f780-40da-b146-99f71c431e2b 802-3-ethernet ens3
eno1 87b53c56-1f5d-4a29-a869-8a7bdaf56dfa 802-3-ethernet eno1

查询具体的网络连接详情

1
2
3
4
5
6
7
8
9
10
[root@lixiaohui system-connections]# nmcli connection show lxh-con2
connection.id: lxh-con2
connection.uuid: f2af0cda-b25c-4688-9df3-2b4f8428f407
connection.stable-id: --
connection.type: 802-3-ethernet
connection.interface-name: eth0
connection.autoconnect: yes
connection.autoconnect-priority: 0
connection.autoconnect-retries: -1 (default)
connection.multi-connect: 0 (default)

添加⽹络连接

使⽤ 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
2
3
4
5
6
[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
Connection 'lxh-con2' (f2af0cda-b25c-4688-9df3-2b4f8428f407) successfully added.
[root@lixiaohui ~]# nmcli con show
NAME UUID TYPE DEVICE
Wired connection 1 ec3a15fb-2e26-3254-9433-90c66981e924 ethernet eth0
lxh-con2 f2af0cda-b25c-4688-9df3-2b4f8428f407 ethernet --

以下命令将lxh-con3添加到eth0设备上,并将IPV6设置为2000::1/64,网关设置为2000::2,DNS设置为2000::3,需要特别注意ipv6.method参数设置为manual,只有设置为manual,你手工设置的网络信息才会优先生效,autoconnect yes为服务器重启时,自动激活`此链接

1
2
3
4
5
6
7
[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
Connection 'lxh-con3' (9f7c282c-9254-45cf-a020-24acac1639b1) successfully added.
[root@lixiaohui ~]# nmcli connection show
NAME UUID TYPE DEVICE
Wired connection 1 ec3a15fb-2e26-3254-9433-90c66981e924 ethernet eth0
lxh-con2 f2af0cda-b25c-4688-9df3-2b4f8428f407 ethernet --
lxh-con3 9f7c282c-9254-45cf-a020-24acac1639b1 ethernet --

查看具体的网络配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@lixiaohui system-connections]# cat /etc/NetworkManager/system-connections/lxh-con2.nmconnection
[connection]
id=lxh-con2
uuid=f2af0cda-b25c-4688-9df3-2b4f8428f407
type=ethernet
interface-name=eth0

[ethernet]

[ipv4]
address1=1.1.1.1/24,1.1.1.12
dns=1.1.1.3;
method=manual

[ipv6]
addr-gen-mode=stable-privacy
method=auto

[proxy]

修改网络连接

lxh-con2的连接IP改为2.2.2.2/24,并添加另一个IP地址3.3.3.3/24到此连接上

+号可以用在ip地址、dns等信息上,用于添加辅助网络信息

1
2
3
4
5
6
7
8
9
[root@lixiaohui ~]# nmcli connection modify lxh-con2 ipv4.addresses 2.2.2.2/24 +ipv4.addresses 3.3.3.3/24
[root@lixiaohui ~]# nmcli connection show lxh-con2 | grep ipv4
ipv4.method: manual
ipv4.dns: 1.1.1.3
ipv4.dns-search: --
ipv4.dns-options: --
ipv4.dns-priority: 0
ipv4.addresses: 2.2.2.2/24, 3.3.3.3/24
ipv4.gateway: 1.1.1.12

激活网络连接

需要注意的是,一个设备同时只能激活一个连接

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

文件手动编辑配置文件

📁 配置文件位置与格式

项目说明
配置目录/etc/NetworkManager/system-connections/
文件扩展名.nmconnection
文件格式INI 样式的键值对结构
权限要求600(否则 NetworkManager 不加载)

✅ 每个连接配置文件对应一个网络连接配置集,支持复制到多台服务器使用。

🧩 INI 样式结构示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[connection]
id=office-eth
type=ethernet
interface-name=ens160
autoconnect=true

[ipv4]
method=manual
addresses=192.168.1.100/24;192.168.1.1;
dns=8.8.8.8;
ignore-auto-dns=true

[ipv6]
method=ignore

✅ 说明:

  • [connection]:连接基本信息
  • [ipv4]:IPv4 配置(地址、网关、DNS)
  • [ipv6]:IPv6 配置(可禁用)
  • addresses 格式:IP/掩码;网关
  • dns 可指定多个,用分号隔开

重新加载配置

1
nmcli connection reload

激活连接

1
nmcli connection up office-eth

配置主机名和名称解析

配置主机名

hostnamehostnamectl命令可以显示主机名,hostnamectl命令可以设置主机名,主机名将放入到/etc/hostname

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@lixiaohui ~]# hostnamectl
Static hostname: lixiaohui
Icon name: computer-vm
Chassis: vm 🖴
Machine ID: ace63d6701c2489ab9c0960c0f1afe1d
Boot ID: d845959153e74e6fb3e9d157c18b851f
Virtualization: kvm
Operating System: Red Hat Enterprise Linux 9.0 (Plow)
CPE OS Name: cpe:/o:redhat:enterprise_linux:9::baseos
Kernel: Linux 5.14.0-70.13.1.el9_0.x86_64
Architecture: x86-64
Hardware Vendor: Red Hat
Hardware Model: KVM

[root@lixiaohui ~]# hostnamectl hostname test
[root@lixiaohui ~]# cat /etc/hostname
test
[root@lixiaohui ~]# sudo -i
[root@test ~]#

配置名称解析

  1. /etc/hosts ⽂件中为每个主机名创建静态条⽬,但是需要管理员手工更新,且只影响此机器,影响不到别的机器

  2. /etc/resolv.conf ⽂件中列出了所有使用中的DNS服务器地址

测试一下DNS名称解析

getent将先查询/etc/hosts,如果没找到,才找dns服务器,所以此命令可以帮助测试hosts文件

host、dig不会查看/etc/hosts

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[root@lixiaohui ~]# host servera
servera.lab.example.com has address 172.25.250.10

[root@lixiaohui ~]# getent hosts servera
172.25.250.10 servera.lab.example.com

[root@lixiaohui ~]# dig servera.lab.example.com

; <<>> DiG 9.16.23-RH <<>> servera.lab.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4557
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 8265a3a3071b4061ba7ea74165d1ef6e76e9842339bf54cf (good)
;; QUESTION SECTION:
;servera.lab.example.com. IN A

;; ANSWER SECTION:
servera.lab.example.com. 86400 IN A 172.25.250.10

;; AUTHORITY SECTION:
lab.example.com. 86400 IN NS utility.lab.example.com.

;; ADDITIONAL SECTION:
utility.lab.example.com. 86400 IN A 172.25.250.220

;; Query time: 4 msec
;; SERVER: 172.25.250.220#53(172.25.250.220)
;; WHEN: Sun Feb 18 06:52:14 EST 2026
;; MSG SIZE rcvd: 134

第十九章 配置和保护 SSH

OpenSSH 软件包提供了Secure Shell 或 SSH 协议。借助 SSH 协议,系统能够通过不安全的⽹络在加密和安全的通道中进⾏通信

什么是 SSH 主机密钥?

  • 主机密钥(Host Key) 是 SSH 服务器的身份标识
  • 是一对公钥/私钥,用于在连接初期向客户端证明“我就是你要连接的服务器”

SSH 连接流程中的主机密钥验证

  1. 客户端发起连接(如 ssh user@server

  2. 服务器发送主机公钥

  3. 客户端验证主机身份

    • 查找本地已知主机文件:
      • 用户级:~/.ssh/known_hosts
      • 系统级:/etc/ssh/ssh_known_hosts
    • 如果已有记录 → 比对公钥是否一致
    • 如果首次连接 → 提示用户是否接受该主机密钥
  4. 验证通过后 → 进入密钥交换阶段

主机密钥不匹配的风险

  • 如果服务器返回的主机密钥与本地记录不一致,SSH 客户端会拒绝连接
  • 可能原因:
    • 服务器重装或更换密钥(合法变更)
    • 中间人攻击(MITM):攻击者伪装成目标服务器

✅ 这是 SSH 安全模型的核心机制,防止连接到伪造或被劫持的主机

密钥交换与会话加密

  • 验证主机身份后,客户端与服务器通过 Diffie-Hellman 等算法协商生成临时会话密钥
  • 会话密钥用于后续通信的 对称加密,确保数据保密性与完整性
  • 这种机制兼顾了:
    • 身份验证(主机密钥)
    • 数据加密(会话密钥)
    • 防止重放与篡改(完整性校验)

SSH 命令的基本使用

远程登录系统,不加用户名就是当前用户

1
2
3
4
[root@host1 ~]# ssh lxh-host2
root@hosta's password: redhat
[root@lxh-host2 ~]# exit
[root@host1 ~]#
1
2
3
[root@host1 ~]# ssh lixiaohui@lxh-host2
lixiaohui@lxh-host2's password: redhat
[lixiaohui@lxh-host2 ~]$

查询系统中登录的用户

1
2
3
4
5
6
7
8
[lixiaohui@lxh-host2 ~]$ w
11:03:15 up 10 min, 1 user, load average: 0.04, 0.08, 0.08
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
lixiaohu pts/0 11:03 1.00s 0.06s 0.02s w
[lixiaohui@lxh-host2 ~]$ w -f
11:03:19 up 10 min, 1 user, load average: 0.03, 0.08, 0.08
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
lixiaohu pts/0 172.25.250.250 11:03 5.00s 0.04s 0.00s w -f

不以交互式方式登录对方,但是用对方的shell环境执行命令

1
2
3
[root@host1 ~]# ssh lixiaohui@lxh-host2 hostname
lixiaohui@lxh-host2's password: redhat
lxh-host2

主机密钥检查

默认情况下,第一次去连接对方时,对方会给出他的公钥信息,客户端会比比对/etc/ssh/ssh_known_hosts或 ~/.ssh/known_hosts ⽂件中是否已经记录了相关信息,如果没有会问你是否连接对方,接受新密钥,则公钥的副本将保存在 ~/.ssh/known_hosts ⽂件中

1
2
3
4
5
[root@host1 ~]# ssh root@servera
The authenticity of host 'lxh-host2 (192.168.1.18)' can't be established.
ED25519 key fingerprint is SHA256:peUGgfxFNw6Jt6WK4CB2rs+jql1/LhA32M1+8zBawLI.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?

禁用密钥检查

交互式输入yes会打断自动化,所以可以在必要时禁用这个检查

StrictHostKeyChecking 参数在⽤⼾特定的 ~/.ssh/config ⽂件或系统范围的 /etc/ssh/ssh_config ⽂件中设置,或者通过指定 ssh 命令的 -o StrictHostKeyChecking= 选项来设置。

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@host1 ~]# cat .ssh/config
Host *.ilt.example.com f* g*
StrictHostKeyChecking no
PreferredAuthentications publickey
User kiosk
Host classroom.example.com classroom c
StrictHostKeyChecking no
PreferredAuthentications publickey
User instructor
Host *.example.com *
StrictHostKeyChecking no
PreferredAuthentications publickey
User student
1
2
3
4
5
6
[root@serverb ~]# ssh -o StrictHostKeyChecking=yes root@servera
No ED25519 host key is known for servera and you have requested strict checking.
Host key verification failed.
[root@serverb ~]# ssh -o StrictHostKeyChecking=no root@servera
Warning: Permanently added 'servera' (ED25519) to the list of known hosts.
root@servera's password:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
## 为什么要重新生成主机密钥?

| 场景 | 原因 |
|------|------|
| 密钥泄露风险 | 防止被中间人伪造或重放攻击 |
| 创建新镜像 | 每台服务器应有唯一身份标识 |
| 安全策略更新 | 更换加密算法或密钥长度 |
| 主机迁移或重构 | 避免旧密钥被误识别为新主机

📁 主机密钥存储位置

所有主机密钥文件位于:

```bash
/etc/ssh/

默认包含三种算法的密钥对:

类型私钥文件公钥文件
RSAssh_host_rsa_keyssh_host_rsa_key.pub
ECDSAssh_host_ecdsa_keyssh_host_ecdsa_key.pub
ED25519ssh_host_ed25519_keyssh_host_ed25519_key.pub

再生成主机密钥的操作流程

✅ 步骤 1:删除旧密钥

1
rm -f /etc/ssh/ssh_host_*

⚠️ 请确保你已备份旧密钥(如用于信任传递或跳板机),否则客户端连接将提示密钥变更警告。

✅ 步骤 2:重启 SSH 服务

1
systemctl restart sshd.service

sshd 会自动检测缺失的主机密钥并重新生成三组新密钥。

🔍 验证新密钥是否生成

1
ls -l /etc/ssh/ssh_host_*

你将看到新的 .key.pub 文件,时间戳为刚刚生成。

⚠️ 客户端连接注意事项

  • 客户端首次连接新密钥时会提示:
1
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
  • 原因是本地 known_hosts 文件中记录的旧密钥与新密钥不一致
  • 解决方法:手动删除旧记录或使用 ssh-keygen -R <hostname>

主机密钥变更后的客户端行为

当服务器重新生成主机密钥后,之前连接过该服务器的客户端会在下一次连接时收到如下警告:

1
2
3
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

这是 SSH 客户端检测到服务器身份发生变化,可能存在**中间人攻击(MITM)**风险。

📁 客户端主机密钥存储位置

文件路径说明
/etc/ssh/ssh_known_hosts系统范围的已知主机文件(需管理员手动创建)
~/.ssh/known_hosts用户级已知主机文件(默认自动维护)

🛠️ 解决方法:删除旧主机密钥

✅ 方法 1:使用 ssh-keygen -R(推荐)

1
ssh-keygen -R hostb
  • 自动从 ~/.ssh/known_hosts 中删除与 hostb 匹配的条目
  • 更安全、避免误删其他主机记录

✅ 方法 2:手动编辑 known_hosts 文件

1
vi ~/.ssh/known_hosts
  • 找到与目标主机对应的那一行(通常以 IP 或主机名开头)
  • 删除该行并保存退出

🔄 再次连接时的行为

  • SSH 会提示你接受新的主机密钥:
1
2
3
The authenticity of host 'hostb (192.168.1.100)' can't be established.
ED25519 key fingerprint is SHA256:abc123...
Are you sure you want to continue connecting (yes/no)?
  • 输入 yes 后,新密钥将被添加到 ~/.ssh/known_hosts

使用 ssh-keyscan 填充已知主机文件

🧠 为什么使用 ssh-keyscan

  • 快速收集远程服务器的主机公钥
  • 自动填充 known_hostsssh_known_hosts 文件
  • 避免首次连接时的交互式信任确认
  • 适合自动化部署、脚本化连接、批量配置环境

✅ 添加到用户级 known_hosts

1
ssh-keyscan hostb >> ~/.ssh/known_hosts
  • 默认收集所有支持的密钥类型(RSA、ECDSA、ED25519)
  • 可用于个人 SSH 客户端的信任初始化

✅ 添加到系统级 ssh_known_hosts

1
ssh-keyscan -q -t ed25519 hostb >> /etc/ssh/ssh_known_hosts
  • -q:静默模式,不显示提示信息
  • -t:指定密钥类型(如 rsa, ecdsa, ed25519

📦 验证主机密钥指纹

1
ssh-keygen -l -f ~/.ssh/known_hosts

输出示例:

1
2
3
3072 SHA256:1PpHYtWyiygoQh548NRXxRn6GCMvHSzljrtbAaHKqPc hostb (RSA)
256 SHA256:rMXtr4eS4bCSE6Si81a3v7hNb9RXdMCv8ngjFs7Yj1s hostb (ECDSA)
256 SHA256:89iCusliyLGcq5m0JOnvoTUaa9xkjaKaOGODgbXiTmk hostb (ED25519)

✅ 指纹是验证主机身份的关键,应与管理员提供的可信指纹进行比对

🌐 批量扫描网络段主机密钥

1
ssh-keyscan -q -t rsa 172.25.250.0/24 >> /etc/ssh/ssh_known_hosts
  • 可用于受控环境中批量收集主机密钥
  • 建议结合脚本与指纹验证机制使用

⚠️ 安全警告

  • ssh-keyscan 不验证主机身份,仅收集当前返回的密钥
  • 在不受信任网络中使用时,可能遭遇中间人攻击(MITM)
  • 建议使用 指纹比对、控制台验证或预共享机制确保安全性

基于 SSH 密钥的⾝份验证

每次生成新密钥,都会覆盖原有密钥,导致无法用以前的密钥登录

交互式生成密钥文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@serverb ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:rYI63NZpSyOrdieyUii4FiJn1hpisFay2MDMJpjVuJQ root@serverb.lab.example.com
The key's randomart image is:
+---[RSA 3072]----+
| + |
| E . |
|=+ . |
|**.. . |
|*=+. S . |
|X=B .. . |
|*O.+o.+.. |
|o.*.=+=o |
|.o+B.+.. |
+----[SHA256]-----+

非交互式生成密钥文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@serverb ~]# ssh-keygen -N '' -f ~/.ssh/id_rsa
Generating public/private rsa key pair.
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:oAnis4J88dovDwoe8iLe6RqYC4xtsEfJybiRNlo14J4 root@serverb.lab.example.com
The key's randomart image is:
+---[RSA 3072]----+
| . |
| . . |
|. o o . |
|.B * + . |
|==E.o S |
|OX+ o |
|%B+. o |
|B=* =.. |
|+=+* .+o |
+----[SHA256]-----+

分发密钥

分发公钥给所有需要被登录的机器,需要需要分发的公钥不在默认的位置,可以用-i参数来指定文件路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[root@serverb ~]# ssh-copy-id student@servera
...
student@servera's password:

Number of key(s) added: 1

Now try logging into the machine, with: "ssh 'student@servera'"
and check to make sure that only the key(s) you wanted were added.

[root@serverb ~]# ssh student@servera
[student@servera ~]$

## ssh 密钥管理器

如果在生成密钥的时候指定了使用密钥时的单独密码,每次使用私钥都会问你密码,这个非常不方便也不安全,可以将密钥缓存到ssh-agent程序中

```bash
[root@serverb ~]# ssh student@servera
Enter passphrase for key '/root/.ssh/id_rsa':

[root@serverb ~]#
[root@serverb ~]# eval $(ssh-agent)
Agent pid 1606
[root@serverb ~]# ssh-add
Enter passphrase for /root/.ssh/id_rsa:
Identity added: /root/.ssh/id_rsa (root@serverb.lab.example.com)
[root@serverb ~]# ssh student@servera
Activate the web console with: systemctl enable --now cockpit.socket

Register this system with Red Hat Insights: insights-client --register
Create an account or view all your systems at https://red.ht/insights-dashboard
Last login: Tue Feb 6 11:27:55 2026 from 172.25.250.11
[student@servera ~]$

⾃定义 OpenSSH 服务配置

sshd 守护进程提供 OpenSSH 服务。你可以通过编辑 /etc/ssh/sshd_config ⽂件来配置该服务

禁⽌超级⽤⼾进⾏登录

OpenSSH 服务器使⽤ /etc/ssh/sshd_config ⽂件中的 PermitRootLogin 配置设置,以允许或禁⽌⽤⼾以 root ⽤⼾⾝份登录系统

设置为without-password后,只允许root用密钥登录,不允许密码登录

设置后,需要重启sshd服务

1
2
3
[root@host1 ~]# grep PermitRootLogin /etc/ssh/sshd_config
PermitRootLogin yes
# the setting of "PermitRootLogin without-password".

禁⽌基于密码的⾝份验证

一般来说,默认是启用的

1
2
[root@host1 ~]# grep PasswordAuthentication /etc/ssh/sshd_config
#PasswordAuthentication yes