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

1️⃣ 开源驱动创新

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

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

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

2️⃣ 强大的命令行接口(CLI)

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

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

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

3️⃣ 模块化设计,灵活可控

Linux 采用模块化架构,具备以下优势:

  • 系统组件可按需替换、删除或升级
  • 支持轻量化部署与定制化构建
  • 易于维护与扩展,适合容器化与云原生场景

🔧 模块化是构建高可用系统的基础

🧩 什么是开源软件?

开源软件(Open Source Software)是指任何人都可以使用、研究、修改和共享其源代码的软件。

🔍 源代码是什么?

  • 源代码是一组人类可读的指令,用于编写程序
  • 可被解释为脚本,或编译为计算机可执行的二进制文件
  • 创建后受版权保护,使用需遵循软件许可协议

🔐 开源 vs 闭源:许可机制对比

类型权限范围源代码访问修改与分发商业用途
闭源软件受限不公开或有限禁止或受限受限
开源软件开放完全公开允许修改与再分发可商业化

📜 开源许可证(如 GPL、MIT、Apache)赋予用户运行、查看、修改和免版税分发的权利

🚀 开源的价值与优势

开源软件不仅适用于个人开发者,也广泛服务于企业级应用:

  • 促进协作与创新:全球开发者共同改进与分享成果
  • 支持商业运作:如红帽等企业提供开源产品的商业支持与解决方案
  • 可嵌入专有产品:部分许可证允许在商业产品中复用开源代码

🎁 用户收益:为什么选择开源?

维度收益说明
🧭 控制权查看并改进代码,掌握软件运行机制
🎓 培训性从真实代码中学习,提升实战能力
🔐 安全性自主检查与修复敏感代码,无需依赖原作者
🧱 稳定性即使原作者退出,代码仍可持续发展

📜 开源许可证的主要类型

开源软件的开发者可以通过不同的许可证方式授权其源代码的使用与分发。要被视为“开源”,许可证必须允许用户:

  • 自由使用程序
  • 查看源代码
  • 修改与编译代码
  • 分发原始或修改后的代码

开源许可证主要分为两大类:

🛡️ 公共版权许可证(Copyleft License)

核心理念:鼓励代码保持开源,确保衍生作品也必须开源。

  • ✅ 修改后的代码必须继续以开源形式发布
  • ✅ 有助于扩大可用的开源代码库
  • 📌 常见示例:
    • GNU 通用公共许可证(GPL)
    • GNU 宽通用公共许可证(LGPL)

📢 适合希望推动社区共享与协作的项目

🧩 宽松式许可证(Permissive License)

核心理念:最大化代码的重用性,允许在专有项目中使用。

  • ✅ 只需保留原始版权与许可声明
  • ✅ 可用于任何用途,包括专有软件
  • ⚠️ 风险:可能鼓励仅专有增强功能,减少社区回馈
  • 📌 常见示例:
    • MIT/X11 许可证
    • 简化 BSD 许可证
    • Apache 软件许可证 2.0

💼 适合商业项目或希望快速集成的技术栈

📊 开源许可证类型对比表

类别核心理念修改后代码要求商业使用常见示例适用场景
🛡️ 公共版权许可证保持代码开源,促进共享必须继续开源并遵循原许可✅ 支持GNU GPL、GNU LGPL社区项目、共享驱动型开发
🧩 宽松式许可证提高代码可重用性,灵活集成可用于专有项目,只需保留声明✅ 支持MIT、BSD、Apache 2.0商业项目、快速集成、企业开发

👥 开源软件由谁开发?

现代开源开发已高度专业化,不再仅依赖志愿者:

🏢 企业主导,专业驱动

  • 多数开源开发者由企业雇佣,专职参与项目开发
  • 企业通过开源项目构建自身产品所需的增强功能
  • 开源成为企业技术战略的重要组成部分

💼 如 Red Hat、Google、Microsoft 等均积极参与开源社区

🤝 志愿者与学术团体仍具影响力

  • 在新兴技术领域,志愿者与高校研究者贡献突出
  • 正式与非正式开发者共同构建一个高效、动态的协作生态

🌱 开源社区融合多元角色,推动技术持续演进

🐧 什么是 Linux 发行版?

Linux 发行版是一个可安装的完整操作系统,由 Linux 内核与用户空间程序组成。

🧠 Linux 内核的起源与演进

  • 1991 年,Linus Torvalds 开发了类 Unix 内核 Linux
  • 采用 GPL 开源协议,允许自由使用与修改
  • 内核负责硬件管理、内存调度与程序运行

🔧 Linux 内核 + GNU 工具 + 图形平台 = 完整操作系统

🧩 发行版的构成与功能

  • 包含 Linux 内核与支持程序(如 Shell、图形界面、网络服务)
  • 可小型化用于嵌入式设备,也可包含数千个开源组件
  • 提供统一的安装、更新与管理机制
  • 发行版厂商通常也参与社区开发并提供技术支持

📦 常见发行版包括 Ubuntu、CentOS、Debian、Fedora、Red Hat Enterprise Linux 等

⚙️ 发行版的诞生背景

  • 早期用户需手动组装各组件,部署复杂
  • 发行版解决了集成难题,提供预构建、测试好的系统包
  • 降低了 Linux 的使用门槛,推动其广泛普及

📌 Linux 发行版的共同特征

特征维度说明
核心组成包含 Linux 内核与用户空间程序
规模灵活可为单一用途定制,也可包含大量组件
软件管理方式提供统一的安装与更新机制
社区参与发行版厂商通常参与开发并提供支持

🏗️ 红帽企业 Linux 生态系统概览

红帽企业 Linux(RHEL)生态系统由多个关键组件构成,形成了从社区开发到企业级发布的完整链路:

红帽生态系统结构图

🧪 Fedora:创新孵化器

  • 由社区驱动,免费、完整的 Linux 操作系统
  • 用于测试和验证新技术与功能
  • 不提供商业支持,Bug 较多,适合开发者尝鲜

🔬 Fedora 是新技术的实验平台,为 RHEL 提供源头创新

📦 EPEL:企业扩展包仓库

  • 由 Fedora 特别兴趣小组(SIG)维护
  • 名为 Extra Packages for Enterprise Linux
  • 提供 RHEL 默认未包含的额外软件包

🧰 EPEL 是 RHEL 用户获取社区软件的桥梁

🔄 CentOS Stream:RHEL 的上游预览

  • 介于 Fedora 与 RHEL 之间的中间层
  • Fedora 测试通过的软件提交至 CentOS Stream
  • CentOS Stream 稳定后再进入 RHEL
  • 不提供商业支持,适合开发者提前适配 RHEL 变更

🧬 CentOS Stream 是 RHEL 的“开发快照”,用于预览与反馈

🏢 RHEL:企业级生产环境首选

  • 红帽官方发布的稳定、受支持的 Linux 发行版
  • 提供硬件与软件认证、技术支持、培训与维护保障
  • 拥有庞大的合作伙伴生态系统,适用于关键业务场景

🛡️ RHEL 是企业部署 Linux 的标准选择,支持长期维护与安全保障

所以RHEL的由来关系是: fedora—> CentOS Stream—> RHEL

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

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 登录最常见的远程文本登录方式,适用于大多数运维场景

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

🌐 登录远程系统:通过 SSH 获取 Shell 访问权限

在现代计算环境中,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 中获取帮助

掌握获取帮助的方式是 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 权限

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

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

控制对⽂件的访问

Linux ⽂件系统权限概述

⽂件具有三个应⽤权限的⽤⼾类别。⽂件归某个⽤⼾所有,通常是⽂件的创建者。⽂件还归单个组所有,通常是创建该⽂件的⽤⼾的主要组,但是可以进⾏更改。

权限承载的主体有:

  1. 所属⽤⼾(⽤⼾权限)

  2. 所属组(组权限)系统上

  3. ⾮所属⽤⼾和⾮所属组成员的所有其他⽤⼾(其他权限)

最具体的权限具有优先权。用户权限覆盖组权限,后者⼜覆盖其他权限

权限对⽂件和⽬录的影响

permission-rwx

查看权限

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

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
  1. d ,代表文件类型
  2. rwx,第一组三位字符是指此文件所属用户的权限为读、写、执行
  3. r-x,第二组三位字符是指此文件所属组的权限为读、执行
  4. r-x,第三组三位字符是指非所属用户和所属组的其他所有人的权限为读、执行
  5. .,这代表常规已经显示完毕,如果写的是+,代表还有额外的acl权限
  6. 2,这代表文件的链接数量,每个目录的链接数最起码是2,指向自身(.)或上级(..)
  7. lixiaohui,第一个lixiaohui是指此文件夹被lixiaohui用户所拥有
  8. lixiaohui,第二个lixiaohui是指此文件夹被lixiaohui组所拥有

更改⽂件和⽬录权限

通过符号法更改权限

chmod 命令具有以下特性:可从命令⾏更改⽂件和⽬录权限。这可以解释为“更改模式”,因为⽂件的模式是⽂件权限的另⼀个名称

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

更改文件或目录所有权

⽤⼾以及用户的私有组拥有其创建的⽂件,但是也可以用chown或chgrp来更改,这两个命令都可以用-R参数对文件夹进行递归修改,也就是对文件夹里的文件同步生效的意思

只更改文件的拥有人

将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)⽆影响对⽬录具有写⼊访问权限的⽤⼾仅可以删除其所拥有的⽂件,⽽⽆法删除或强制保存到其他⽤⼾所拥有的⽂件

SUID

这出现在程序或脚本场景中,不管谁执行程序,都以程序文件所属的用户身份和权限执行,而不是执行人的身份和权限

我们发现所有人对密码文件都没有修改权限,而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

SGID

这出现在文件夹的场景下,我们要求不管谁向特定的文件夹写入文件,新产生的文件要自动归属于特定的组拥有,例如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

sticky 权限

这出现在公共目录使用场景,要求人们只能管理和删除自己的文件,删除别人的文件会报告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,它代表⽤⼾⽂件创建掩码

如果创建⽬录,则其初始⼋进制权限为 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影响整个系统

第八章 监控和管理 Linux 进程

了解进程

进程:进程是已启动的可执⾏程序的运⾏中实例

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

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
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

第十章 配置和保护 SSH

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

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:

基于 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
[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程序中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[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

第十一章 管理网络

网络接口名称的变化

在RHEL 7之后,不再用eth0、eth1来标记网络接口,系统将基于固件信息、PCI 总线拓扑及⽹络设备的类型来分配⽹络接⼝名称

⽹络接⼝名称以接⼝类型开头:

  • 以太⽹接⼝以 en 开头
  • WLAN 接⼝以 wl 开头
  • WWAN 接⼝以 ww 开头

在类型之后,接⼝名称的其余部分将基于服务器固件所提供的信息,或由 PCI 拓扑中设备的位置确定。

  • oN 表⽰板载设备,其唯⼀索引为 N,来⾃服务器的固件。eno1 名称是板载以太⽹设备 1。
  • sN 表⽰这是⼀个位于 PCI 热插拔插槽 N 中的设备。例如,ens3 代表 PCI 热插拔插槽 3 中的以太
    ⽹卡。
  • pMsN 表⽰这是⼀个位于插槽 N 中总线 M 上的 PCI 设备。wlp4s0 接⼝是位于插槽 0 中 PCI 总线 4
    上的 WLAN 卡。

IPV4和IPV6

IPV4概述

IPv4 地址是⼀个 32 位数字,使⽤点号分隔的四个⼗进制⼋位字节(取值范围从 0 到 255)来表⽰。

此类地址分为两个部分,即⽹络前缀和主机编号。⽹络前缀标识唯⼀的物理或虚拟⼦⽹。主机号标识⼦⽹上的特定主机。同一子网中的主机可以无需网关互相通信,⽹络⽹关连接不同的⽹络,⽹络路由器通常充当⼦⽹的⽹关

IPV4 地址计算公式

192.168.1.0/24中一共有多少个地址可用?

1
2^(32-24)  //2的32-24次方

对于/24子网,子网掩码是255.255.255.0,这意味着前24位是网络地址,最后8位是主机地址。因此,我们有2^8 = 256个可能的地址组合。

但是,我们需要减去两个地址:

  1. 网络地址(Network Address):它是子网的第一个地址,用于标识整个子网。例如,在192.168.1.0/24子网中,网络地址是192.168.1.0。

  2. 广播地址(Broadcast Address):它是子网的最后一个地址,用于向子网内的所有设备发送广播消息。在192.168.1.0/24子网中,广播地址是192.168.1.255。

因此,对于/24子网,实际可用的主机地址是256(总地址数) - 2(网络地址和广播地址) = 254个。

IPV6概述

IPv6 地址是⼀个 128 位数字,通常表⽰为⼋组以分号分隔的四个⼗六进制半字节。每个半字节均表⽰ 4 位的 IPv6 地址,因此每个组表⽰ 16 位的 IPv6 地址,在IPV6中的字母只能时A-F

1
2001:0db8:0000:0010:0000:0000:0000:0001

简化IPV6写法

  1. 去掉前导零
1
2001:db8:0:10:0:0:0:1
  1. 去掉连续零

连续都是0时,用::表示,但是一个地址中只能出现一次

1
2001:db8:0:10::1
  1. 加端口的写法

如果在 IPv6 地址后⾯包括 TCP 或 UDP ⽹络端⼝,请始终将 IPv6 地址括在⽅括号中,以便端⼝不会被误认为是地址的⼀部分。

1
[2001:db8:0:10::1]:80

主机名解析和 IP 地址映射

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

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

查询网络接口和IP

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@lixiaohui ~]# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 00:0c:29:6a:16:13 brd ff:ff:ff:ff:ff:ff
inet 172.25.254.250/24 brd 172.25.254.255 scope global noprefixroute br0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe6a:1613/64 scope link noprefixroute
valid_lft forever preferred_lft forever
  1. 网络接口有2个,lo和ens160,其中lo为连接到服务器本⾝的环回设备,不能用于网络互通
  2. ens160接口上的IPV4地址是:172.25.254.250/24
  3. ens160接口上的MAC地址是:00:0c:29:6a:16:13
  4. ens160接口上的IPV6地址是:fe80::20c:29ff:fe6a:1613/64

测试网络通畅

ping 命令可以测试连接。该命令将持续运⾏,直到按下 Ctrl+c 为⽌,或者指定-c参数

ping6命令可以测试ipv6连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@lixiaohui ~]# ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.062 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.130 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.079 ms
^C
--- 127.0.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2314ms
rtt min/avg/max/mdev = 0.062/0.090/0.130/0.028 ms

[root@lixiaohui ~]# ping -c 2 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.064 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.083 ms

--- 127.0.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1166ms
rtt min/avg/max/mdev = 0.064/0.073/0.083/0.009 ms

[root@lixiaohui ~]# ping6 fe80::c38a:ac39:36a1:a43c
PING fe80::c38a:ac39:36a1:a43c(fe80::c38a:ac39:36a1:a43c) 56 data bytes

查询路由

1
2
3
4
5
6
[root@lixiaohui ~]# ip route
default via 172.25.250.254 dev eth0 proto static metric 100
172.25.250.0/24 dev eth0 proto kernel scope link src 172.25.250.10 metric 100
[root@lixiaohui ~]# ip -6 route
::1 dev lo proto kernel metric 256 pref medium
fe80::/64 dev eth0 proto kernel metric 1024 pref medium

追踪流量路由

可使⽤ traceroute 或tracepath 命令来完成追踪流量路由,通常,默认情况下系统不安装 traceroute 命令。

tracepath6traceroute -6 命令等效于 IPv6 版本的 tracepathtraceroute 命令。

1
2
3
4
5
6
[root@lixiaohui ~]# tracepath classroom
1?: [LOCALHOST] pmtu 1500
1: bastion.lab.example.com 0.901ms
1: bastion.lab.example.com 0.355ms
2: 172.25.254.254 1.561ms reached
Resume: pmtu 1500 hops 2 back 2

端⼝和服务故障排除

/etc/services ⽂件中列出了标准端⼝的常⽤名称

ss 命令可⽤于显⽰套接字统计信息。ss 命令取代了 net-tools 软件包中所含的较早的⼯具netstat

1
2
3
4
5
6
7
8
9
10
11
[root@lixiaohui ~]# ss -tunlpa
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
udp UNCONN 0 0 0.0.0.0:111 0.0.0.0:* users:(("rpcbind",pid=741,fd=5),("systemd",pid=1,fd=42))
udp UNCONN 0 0 127.0.0.1:323 0.0.0.0:* users:(("chronyd",pid=786,fd=5))
udp UNCONN 0 0 [::]:111 [::]:* users:(("rpcbind",pid=741,fd=7),("systemd",pid=1,fd=46))
udp UNCONN 0 0 [::1]:323 [::]:* users:(("chronyd",pid=786,fd=6))
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=808,fd=3))
tcp LISTEN 0 4096 0.0.0.0:111 0.0.0.0:* users:(("rpcbind",pid=741,fd=4),("systemd",pid=1,fd=41))
tcp ESTAB 0 0 172.25.250.10:22 172.25.250.250:35520 users:(("sshd",pid=1082,fd=4),("sshd",pid=1069,fd=4))
tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=808,fd=4))
tcp LISTEN 0 4096 [::]:111 [::]:* users:(("rpcbind",pid=741,fd=6),("systemd",pid=1,fd=43))
  1. -n 显⽰接⼝和端⼝的编号,⽽不显⽰名称
  2. -t 显⽰ TCP 套接字
  3. -u 显⽰ UDP 套接字
  4. -l 仅显⽰侦听中的套接字
  5. -a 显⽰所有(侦听中和已建⽴的)套接字
  6. -p 显⽰使⽤套接字的进程

NetworkManager

可以通过命令⾏或图形⼯具与 NetworkManager 服务交互。服务配置⽂件存储在 /etc/NetworkManager/system-connections/ ⽬录中。

NetworkManager 服务⽤于管理⽹络设备和⽹络连接。

  1. 设备是提供⽹络流量的物理或虚拟⽹络接⼝。
  2. 连接拥有单个⽹络设备的相关配置设置。连接也可称为⽹络配置集。每个连接必须具有唯⼀的名称或 ID,可以与其配置的设备名称匹配,单个设备可以有多个连接配置并在它们之间切换,但每个设备只能有⼀个连接处于活跃状态

查看⽹络信息

以下信息中,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

更新系统主机名

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

第十二章 安装和更新软件包

系统订阅与注册

Linux 系统需要以安装软件包的方式丰富服务器功能,而红帽提供了在线的增值服务,给我们提供高质量的软件包仓库,我们从仓库中可以安装软件,这要求我们将系统注册到红帽网络,这个会涉及到购买服务,作为开发者,可以用以下连接完成注册为开发者,临时获得此服务

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

以下命令完成了系统注册

1
2
3
4
5
[root@lixiaohui ~]# subscription-manager register --username 939958092@qq.com
Registering to: subscription.rhsm.redhat.com:443/subscription
Password:
The system has been registered with ID: 4aa93fdb-8d29-4e72-b97b-b5ab5421ea8e
The registered system name is: lixiaohui

以下命令取消了系统注册

1
2
3
[root@lixiaohui ~]# subscription-manager unregister
Unregistering from: subscription.rhsm.redhat.com:443/subscription
System has been unregistered.

不过需要注意的是在RHEL8.8以上的版本中,注册管理的命令改为了rhc

注册系统

1
rhc connect -u <_username_> -p <_password_>

取消注册

1
rhc disconnect

RPM 软件包描述

RPM 软件包管理器最初是由红帽开发的,提供了⼀种标准的⽅式来打包软件进⾏分发,借助 RPM 软件包,管理员可以跟踪软件包会安装哪些⽂件,卸载软件包时将删除哪些⽂件,并且在安装时验证是否存在⽀持软件包

RPM 软件包⽂件名由四个元素组成(再加上 .rpm 后缀):name-version-release.architecture:

coreutils-8.32-21.el9.x86_64.rpm

  1. coreutils是名字

  2. 8.32是版本

  3. 21.el9是发行版本号以及平台名称,此处是适用于el9的21此发行版本

  4. x86_64是CPU指令集,这代表64位

  • rpm -qa :列出所有已安装的软件包
  • rpm -qf FILENAME :确定提供 FILENAME 的软件包
  • rpm -q coreutils:列出当前安装的软件包版本
  • rpm -qi coreutils:获取软件包的详细信息。
  • rpm -ql coreutils:列出软件包安装的⽂件
  • rpm -qc coreutils:仅列出软件包安装的配置⽂件
  • rpm -qd coreutils:仅列出软件包安装的⽂档⽂件
  • rpm -q –scripts :列出在安装或删除软件包之前或之后运⾏的 shell 脚本
  • rpm -q –changelog :列出软件包的更改⽇志信息
  • rpm -qlp coreutils-8.32-21.el9.x86_64.rpm:列出本地软件包安装的⽂件。
  • rpm -ivh podman-4.0.0-6.el9.x86_64.rpm。使⽤ rpm 命令来安装已下载到本地⽬录的 RPM 软件包
  • rpm2cpio httpd-2.4.51-7.el9_0.x86_64.rpm | cpio -idv rpm2cpio 命令将 RPM 软件包转换为 cpio 归档。将 RPM 软件包转换为 cpio 归档后,可以使⽤cpio 命令提取⽂件列表

DNF 管理软件包

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

DNF 仓库配置

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

列出本地仓库

1
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 grouplist
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 groupinfo "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

第十三章 访问 Linux ⽂件系统

识别⽂件系统和设备

从RHEL 7开始默认的文件系统为XFS

挂载点

通过将⽂件系统挂载到空⽬录来访问⽂件系统的内容。该⽬录被称为挂载点,⽬录挂载后,使⽤ ls 命令列出该⽬录的内容。许多⽂件系统系统启动时⾃动挂载。

块设备

块设备是提供存储设备低级别访问权限的⽂件。必须对块设备进⾏可选分区,并创建⽂件系统,然后才能挂载该设备。

/dev ⽬录存储 RHEL ⾃动为所有设备创建的块设备⽂件。在 RHEL 9 中,检测到的第⼀个SATA、SAS、SCSI 或 USB 硬盘驱动器被称为 /dev/sda 设备,第⼆个被称为 /dev/sdb 设备,以此类推。这些名称代表整个硬盘驱动器。

磁盘分区

分区本⾝就是块设备。例如,在第⼀ SATA 附加存储中,第⼀分区是 /dev/sda1 磁盘。同⼀存储的第⼆分区是 /dev/sda2 磁盘。

逻辑卷

整理磁盘和分区的另⼀种⽅式是利⽤逻辑卷管理 (LVM)。借助 LVM,可以将多个块设备聚合到⼀个卷组中。卷组中的磁盘空间分割成若⼲逻辑卷,它们的功能等同于物理磁盘上的分区。

LVM 系统在创建时为卷组和逻辑卷分配名称。LVM 在 /dev ⽬录中创建⼀个名称与组名匹配的⽬录,然后在该新⽬录中创建⼀个与逻辑卷同名的符号链接。之后,可以挂载该逻辑卷⽂件。例如,如果存在⼀个 myvg 卷组和 mylv 逻辑卷,那么其逻辑卷的完整路径名是 /dev/myvg/mylv。

文件系统查询

  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课程中,我们将介绍如何处理此情况

识别块设备

使⽤ 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

查找系统中的⽂件

  1. locate 命令搜索预⽣成索引中的⽂件名或⽂件路径,并即时返回结果。此命令速度较快,因为它是从 mlocate 数据库中
    查找这些信息的。但是,此数据库不会实时更新,需要频繁更新才能获得准确结果。

先更新数据库

1
[root@lixiaohui ~]# updatedb

再查询

-i 忽略大小写

-n 限制返回的搜索结果数

1
2
3
4
5
[root@lixiaohui ~]# locate passwd
/etc/passwd
/etc/passwd
/etc/pam.d/passwd
...
  1. find 命令通过解析整个⽂件系统层次结构来实时搜索⽂件,此命令速度⽐ locate 命令慢,但更加准确。此外,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

第十四章 分析服务器和获取支持

分析和管理远程服务器

Web 控制台

⾃红帽企业 Linux 7 起,除了最⼩安装外,所有安装中都默认安装 Web 控制台,直接启用即可

1
[root@lixiaohui ~]# systemctl enable --now cockpit

也可以用以下方式来安装

1
[root@lixiaohui ~]# dnf install cockpit

想要被外部访问到,需要在防火墙开通cockpit或者9090端口号

1
2
[root@lixiaohui ~]# firewall-cmd --add-service=cockpit --permanent
[root@lixiaohui ~]# firewall-cmd --reload

访问控制台可以用http://IP:9090来访问

如果root用户无法登录,可按照以下方式解除root用户限制,在编辑文件后,去掉root字样即可

1
2
[root@lixiaohui ~]# vim /etc/cockpit/disallowed-users
[root@lixiaohui ~]# systemctl restart cockpit

创建sosreport

sos 报告通常是红帽技术⽀持调查所报告问题的起点,⽤于收集红帽技术⽀持调查所报告问题所需的诊断信息。

创建报告

1
2
3
[root@lixiaohui ~]# sos report
Press ENTER to continue, or CTRL-C to quit.
`ENTER`

如果你想限制一些隐私,可以尝试sos clean

1
[root@lixiaohui ~]# sos clean /var/tmp/sosreport-lixiaohui-2026-02-18-ectivgc.tar.xz

红帽智能分析insights-client

1
2
3
[root@lixiaohui ~]# dnf install insights-client
[root@lixiaohui ~]# subscription-manager register --auto-attach
[root@lixiaohui ~]# insights-client --register

使⽤ insights-client 命令可以刷新客⼾端的元数据

注册完成后,打开:https://console.redhat.com/insights在 Web UI 的 Inventory 部分下可以看到系统。

在同样的这个页面中,点击左侧的按钮,查看系统的分析和诊断信息