大家好,我是云计算磊哥,从业20年的IT老鸟。运维培训15年,总结了一套从入门到精通的全运维开发宝典手册。准备用300天时间写一套博文,手把手从安装软件讲起,从linux系统管理,shell脚本编程,mysql运维架构备份核心技术,Apache/nginx/tomcatWEB服务器管理,ansible自动化运维,redis集群哨兵,LVM/HAproxy/keepalived集群架构,rabbitMQ消息队列,docker&K8S集群资源管理,K8S自愈,K8S自动扩容,PYTHON编程,PYTHON自动化运维,从行业到产品,从过去到未来,从理论到操作,从视频到文档工具,100+篇系列文章一站式发布。从零基础入门到30k运维开发工程师岗位诸多就业问题。多方位全方面的给你讲清楚云计算这个行业该如何做。关注我。后续AI大模型开发课程更精彩。

Shell脚本模块化巡检系统并生成HTML报告

学习目标

  1. 掌握Shell模块化编程思想,学会将系统巡检脚本拆分为独立功能模块,整合各模块输出完整巡检报表。

  2. 熟练运用Shell命令自动采集服务器各类基础信息,包括操作系统版本、内存、磁盘资源状态等。

  3. 掌握Shell输出内容转HTML页面的实现方式,制作样式整洁、便于传阅的可视化巡检报表。

  4. 具备脚本二次开发与定制能力,可根据实际业务需求新增、修改巡检检测项。

脚本整体介绍与使用

​ 整套脚本集成多项系统巡检与自动化配置能力,可全自动采集服务器信息、监控硬件资源、核查安全状态,并最终输出HTML格式巡检报表。脚本全程采用模块化架构,各项功能独立拆分,方便后期维护、迭代与拓展。下面为大家详细讲解脚本功能与实操步骤。

1. 脚本介绍

为什么要编写这套脚本?

在日常运维工作中,手动逐台排查服务器运行状态、资源负载与安全配置,不仅流程繁琐,还极易出现人为疏漏。为提升运维效率、降低操作失误,我们采用Shell脚本实现自动化巡检。本套脚本依托模块化思路,自动采集系统数据、检测资源与安全状态,并生成HTML可视化报表,帮助运维人员快速掌握服务器运行情况,简化日常运维流程,保障服务稳定、安全运行。

这套脚本具备哪些功能?

脚本主要划分多个独立功能模块,覆盖服务器巡检常用场景,具体能力如下:

  1. 系统信息采集模块:自动抓取操作系统版本、内核版本、系统架构等服务器基础资料。

  2. 内存资源检测模块:统计整机内存总量、已使用内存、空闲内存等数据,监控内存负载。

  3. 磁盘资源检测模块:识别磁盘挂载目录、统计磁盘使用率与剩余容量,提前预警磁盘空间不足问题。

  4. 网络状态检测模块:获取网卡信息、IP地址、路由规则及系统监听端口,梳理全网网络状态。

  5. SSH密钥安全检测模块:核查SSH公私钥文件状态,排查密钥相关安全隐患。

  6. 防火墙配置模块:自动化部署Firewalld防火墙策略,实现端口与IP访问权限管控(可选功能)。

  7. HTML报表生成模块:汇总所有巡检数据,渲染生成HTML格式报表,支持跨设备查看与分享。

  8. 主调度脚本:统一调用所有功能子模块,串联完整巡检流程,最终输出完整巡检报表。

脚本基础运行说明
  1. 为所有脚本文件赋予执行权限:
    执行以下命令批量添加执行权限:
chmod +x *.sh
  1. 运行主调度脚本 main.sh
    启动整体巡检流程:
./main.sh

主脚本会按顺序调用各个子模块,依次完成系统信息采集、内存磁盘检测、网络与安全核查等操作,最后自动生成巡检报表。

  1. 查看巡检报表:
    脚本执行结束后,HTML格式巡检报表会保存至路径 /tmp/system_audit_report.html,可直接使用浏览器打开查阅详情。
开发流程说明
  1. 阶段1:需求梳理与架构设计(2天)
    结合企业实际运维场景,明确脚本功能范围与报表展示样式,完成整体架构设计。

  2. 阶段2:功能模块开发(3天)
    逐个编写独立功能模块,并完成单元测试,保证单个模块运行正常、数据采集准确。

  3. 阶段3:模块整合与性能调优(5天)
    将所有子模块整合至主脚本,完成全流程联调,并对脚本执行效率进行优化。

  4. 阶段4:上线部署与长期维护(持续进行)
    将脚本部署至生产服务器,根据业务变化持续迭代功能、修复问题。

2. 脚本功能模块概述

[root@server ~]# tree
.
├── configure_firewalld.sh
├── disk_info.sh
├── firewalld_rules.conf
├── generate_html_report.sh
├── main.sh
├── memory_info.sh
├── network_info.sh
├── ssh_keys_check.sh
└── system_info.sh

0 directories, 9 files

2.1 系统信息采集模块 (system_info.sh)

本模块负责获取服务器基础属性,包含操作系统版本、内核版本、系统架构等内容,帮助运维人员快速了解服务器基础环境。

2.2 内存资源检测模块 (memory_info.sh)

专门统计服务器内存使用状态,展示总内存、已占用内存、空闲内存等数据,实时监控内存资源负载情况。

2.3 磁盘资源检测模块 (disk_info.sh)

负责检测服务器磁盘分区状态,展示磁盘挂载点位、空间使用率与剩余存储空间,实现磁盘空间常态化监控。

2.4 网络状态检测模块 (network_info.sh)

采集服务器网卡配置、IP地址、路由条目以及系统监听端口,全面核查网络配置与网络安全状态。

2.5 SSH密钥安全检测模块 (ssh_keys_check.sh)

扫描系统内SSH公私钥文件,检测文件状态与权限,识别潜在的密钥安全风险。

2.6 防火墙配置模块 (configure_firewalld.sh)

自动化配置Firewalld防火墙规则,依托配置文件定义放行端口、允许访问的IP地址,为服务器提供基础网络安全防护。

2.7 HTML报表生成模块 (generate_html_report.sh)

汇总所有模块采集的巡检数据,统一转换为HTML页面格式,生成标准化报表,方便团队查阅、归档与分享。

2.8 主调度脚本 (main.sh)

作为整套巡检脚本的核心入口,负责加载并调用所有子功能模块,驱动全流程巡检工作,最终生成完整巡检报表。

3. 脚本使用步骤

3.1 为脚本添加执行权限

首先为每一个脚本文件配置执行权限,可执行以下命令逐个授权:

chmod +x system_info.sh
chmod +x memory_info.sh
chmod +x disk_info.sh
chmod +x network_info.sh
chmod +x ssh_keys_check.sh
chmod +x generate_html_report.sh
chmod +x configure_firewalld.sh
chmod +x main.sh

3.2 执行主调度脚本

运行主脚本 main.sh,启动全自动巡检与防火墙配置流程:

./main.sh

脚本会自动依次执行信息采集、资源检测、安全核查、防火墙配置等操作,最终生成完整HTML巡检报表。

3.3 查看巡检报表

脚本运行完毕后,会在 /tmp/ 目录下生成HTML格式巡检文件,文件路径为 /tmp/system_audit_report.html,使用浏览器打开即可查看全部巡检内容。

4. 模块化设计理念

整套脚本采用分模块设计思想,将不同巡检功能拆分为相互独立的子脚本,每个子脚本仅负责一项专项任务。该设计让整体代码结构清晰直观,大幅降低后期维护难度;若后续需要新增巡检项目,只需单独开发对应子模块,再在主脚本中调用即可,拓展性极强。

5. 防火墙配置模块(进阶功能)

脚本内置进阶防火墙配置功能,通过 configure_firewalld.sh 可自动化批量部署Firewalld规则。运维人员仅需编辑配置文件 firewalld_rules.conf,自定义需要放行的端口、IP地址等规则,脚本便可自动完成防火墙策略配置。

6. HTML报表生成说明

所有巡检采集的数据,最终会整合为一份独立HTML报表,报表涵盖内容如下:

  • 服务器基础系统信息(系统版本、内核版本等)

  • 整机内存资源使用统计

  • 磁盘分区与空间使用状态

  • 网络配置与端口监听信息

  • SSH公私钥安全检测结果

  • Firewalld防火墙配置详情

报表内容通过 <pre> 标签完成格式排版,展示规整、阅读体验良好。

7. 拓展与自定义能力

本套脚本预留充足拓展空间,支持根据现场环境灵活修改与二次开发。运维人员可按需调整原有巡检规则、修改防火墙策略,也可新增独立子模块,实现磁盘IO监控、CPU负载检测等更多巡检功能,同时还可自主调整HTML报表样式与展示内容,适配不同运维场景需求。

8. 整体总结

借助这套模块化Shell巡检脚本,运维人员可实现服务器信息全自动采集、硬件资源实时监控、安全状态自动核查,并输出标准化HTML巡检报表。脚本具备三大核心优势:

  • 模块化架构:功能独立封装,代码可读性强,维护与迭代便捷;

  • 可视化报表:巡检结果以HTML页面呈现,支持跨设备查看、归档与分享;

  • 高拓展性:架构灵活,可按需新增功能模块,适配各类运维场景。

无论是日常服务器例行巡检,还是定期安全审计工作,该脚本都能有效简化操作流程,提升运维工作效率与数据准确性。

9. 核心模块讲解与实战演示

9.1 系统信息收集模块 (system_info.sh)

该模块用于收集系统的基础信息,如操作系统版本、内核版本、系统架构等。

编辑脚本:

vim system_info.sh

模块代码:

#!/bin/bash

# 系统信息模块
collect_system_info() {
    echo "系统版本:"
    cat /etc/os-release 2>/dev/null || cat /etc/redhat-release 2>/dev/null || echo '未知系统'
    
    echo "内核版本: $(uname -r)"
    echo "系统架构: $(uname -m)"
    uptime -s | xargs -I {} echo "启动时间: {}"
    uptime -p | xargs -I {} echo "运行时间: {}"
    
    # 打印巡检结果
    echo "系统信息收集完毕!"
}

9.2 磁盘使用情况检查模块 (disk_info.sh)

该模块检查系统的磁盘使用情况。

编辑脚本:

vim disk_info.sh

模块代码:

#!/bin/bash

# 磁盘使用情况模块
collect_disk_info() {
    echo "磁盘使用情况:"
    df -hT
    
    # 打印巡检结果
    echo "磁盘使用情况收集完毕!"
}

9.3 HTML报告生成模块 (generate_html_report.sh)

该模块将所有检查结果整合为HTML报告。

编辑脚本:

vim generate_html_report.sh

模块代码:

#!/bin/bash

# HTML报告生成模块
generate_html_report() {
    local output_file="$1"
    echo "<html><head><meta charset='utf-8'><title>系统巡检报告</title>" > "$output_file"
    echo "<style>body{font-family:'Arial';background:#f4f4f4;color:#333;margin:20px;}</style>" >> "$output_file"
    echo "</head><body>" >> "$output_file"
    echo "<h1>系统巡检报告</h1>" >> "$output_file"
    echo "<h2>系统信息</h2><pre>$(cat /tmp/system_info.txt)</pre>" >> "$output_file"
    echo "<h2>磁盘使用情况</h2><pre>$(cat /tmp/disk_info.txt)</pre>" >> "$output_file"
    echo "</body></html>" >> "$output_file"
    
    # 打印巡检结果
    echo "HTML报告生成完毕!"
}

9.4 主脚本 (main.sh)

主脚本将调用各个功能模块,并生成最终的HTML报告。

编辑脚本:

vim main.sh

主脚本代码:

#!/bin/bash

# 加载各个功能模块
source ./system_info.sh
source ./disk_info.sh
source ./generate_html_report.sh

# 执行系统巡检
echo "开始系统巡检..."

# 收集系统信息
collect_system_info > /tmp/system_info.txt
sleep 1

# 收集磁盘信息
collect_disk_info > /tmp/disk_info.txt
sleep 1

# 生成HTML报告
generate_html_report "/tmp/system_audit_report.html"

echo "系统巡检完成!报告路径:/tmp/system_audit_report.html"

9.5 实战演示

9.5.1.1 给脚本添加执行权限

首先,为每个脚本文件添加执行权限:

chmod +x system_info.sh
chmod +x disk_info.sh
chmod +x generate_html_report.sh
chmod +x main.sh
9.5.1.2 执行主脚本

执行主脚本 main.sh 来开始系统巡检:

./main.sh

([root@server ~]#./main.sh
开始系统巡检.
HTML报告生成完毕!
系统巡检完成!报告路径:/tmp/system_audit_report.html
[root@server~]#)

9.5.2 查看报告

脚本执行后,会生成 HTML 格式的巡检报告。可以通过浏览器查看:

/tmp/system_audit_report.html

(系统巡检报告
系统信息
系统版本:
NAME="CentOS Stream
VERSION=“9”
ID=“centos”
ID_LIKE=“rhel fedora”
VERSION_ID=“9”
PLATFORM_ID=“platform:e19”
PRETTY_NAME=“CentOS Stream 9”
ANSI_COLOR="0;31
LOGO=“fedora-logo-icon”
CPE_NAME=“cpe:/o:centos:centos:9”
HOME_URL="https://centos. org/
BUG_REPORT_URL=“https://issues.redhat.com/”
REDHAT_SUPPORT_PRODUCT-“Red Hat Enterprise Linux 9”
REDHAT_SUPPORT_PRODUCT_VERSION="CentOS Stream
内核版本:5.14.0-511.e19.x86_64
系统架构:x86_64
启动时间:2025-11-0514:26:51
运行时间:up 6 hours
系统信息收集完毕!
磁盘使用情况
磁盘使用情况:
Filesystem
Type
Size Used Avai1 Use% Mounted on
devtmpfs
devtmpfs
4.0M 0 4.OM 0%/dev
1.8G0 1.8G 0%/dev/shm
tmpfs
tmpfs
726M 9.1M 717M 2%/run
tmpfs
tmpfs
/dev/mapper/cs-root xfs
17G 3.6G 14G 21%/
960M 308M 653M 33%/boot
/dev/nvme0nlp1
xfs
363M 0 363M 0%/run/user/0
tmpfs
tmpfs
磁盘使用情况收集完毕!)

10. 编写或测试过程中可能遇到的重大问题

问题 1:数据格式不一致或信息缺失
  • 问题描述:不同版本的Linux系统,部分系统文件输出格式存在差异,例如部分系统不存在 /etc/os-release 文件,导致系统版本信息采集失败。

  • 排查方式:在多版本服务器中交叉测试脚本,即可发现部分环境下系统信息采集异常、内容缺失。

  • 解决方案:在脚本中增加异常捕获与兼容判断,依次读取多个系统文件作为备选,保证信息正常采集。

cat /etc/os-release 2>/dev/null || cat /etc/redhat-release 2>/dev/null || uname -o
问题 2:模块间数据传递问题
  • 问题描述:子模块输出内容未正常写入临时文件,导致报表读取数据失败,最终出现巡检内容缺失。

  • 排查方式:执行脚本后打开HTML报表,发现部分检测板块无数据展示。

  • 解决方案:规范每个子模块的输出逻辑,统一将执行结果重定向至对应临时文件,确保报表模块可正常读取数据。

脚本结构与模块化设计

将脚本拆分为多个独立模块,并通过主脚本将这些模块组合起来:

1. 系统信息收集模块 (system_info.sh)

该模块用于收集系统的基础信息,如操作系统版本、内核版本、系统架构等。

编辑脚本:

vim system_info.sh

模块代码:

#!/bin/bash

# 系统信息模块
collect_system_info() {
    echo "系统版本:"
    cat /etc/os-release 2>/dev/null || cat /etc/redhat-release 2>/dev/null || echo '未知系统'
    
    echo "内核版本: $(uname -r)"
    echo "系统架构: $(uname -m)"
    uptime -s | xargs -I {} echo "启动时间: {}"
    uptime -p | xargs -I {} echo "运行时间: {}"
    
    # 打印巡检结果
    echo "系统信息收集完毕!"
}

2. 内存使用情况检查模块 (memory_info.sh)

该模块检查系统的内存使用情况,包括总内存、已用内存和交换空间。

编辑脚本:

vim memory_info.sh

模块代码:

#!/bin/bash

# 内存使用情况模块
collect_memory_info() {
    echo "内存使用情况:"
    free -h
    
    # 打印巡检结果
    echo "内存使用情况收集完毕!"
}

3. 磁盘使用情况检查模块 (disk_info.sh)

该模块检查系统的磁盘使用情况。

编辑脚本:

vim disk_info.sh

模块代码:

#!/bin/bash

# 磁盘使用情况模块
collect_disk_info() {
    echo "磁盘使用情况:"
    df -hT
    
    # 打印巡检结果
    echo "磁盘使用情况收集完毕!"
}

4. 网络配置检查模块 (network_info.sh)

该模块检查系统的网络配置信息。

编辑脚本:

vim network_info.sh

模块代码:

#!/bin/bash

# 网络配置模块
collect_network_info() {
    echo "网络配置:"
    ip -4 -o addr show
    ip route show
    ss -tulpen
    
    # 打印巡检结果
    echo "网络配置收集完毕!"
}

5. SSH公私钥检查模块 (ssh_keys_check.sh)

该模块检查SSH公私钥的安全性。

编辑脚本:

vim ssh_keys_check.sh

模块代码:

#!/bin/bash

# SSH公私钥检查模块
check_ssh_keys() {
    SSH_DIR="$HOME/.ssh"
    
    if [ -d "$SSH_DIR" ]; then
        echo "SSH 目录存在: $SSH_DIR"
        ls -l "$SSH_DIR"
        if [ -f "$SSH_DIR/id_rsa" ]; then
            echo "检测到私钥: $SSH_DIR/id_rsa"
            stat -c '权限: %A  大小: %s bytes  修改时间: %y' "$SSH_DIR/id_rsa"
        fi
    else
        echo "SSH 目录不存在: $SSH_DIR"
    fi
    
    # 打印巡检结果
    echo "SSH密钥检查完毕!"
}

6. HTML报告生成模块 (generate_html_report.sh)

该模块将所有检查结果整合为HTML报告。

编辑脚本:

vim generate_html_report.sh

模块代码:

#!/bin/bash

# HTML报告生成模块
generate_html_report() {
    local output_file="$1"
    echo "<html><head><meta charset='utf-8'><title>系统巡检报告</title>" > "$output_file"
    echo "<style>body{font-family:'Arial';background:#f4f4f4;color:#333;margin:20px;}</style>" >> "$output_file"
    echo "</head><body>" >> "$output_file"
    echo "<h1>系统巡检报告</h1>" >> "$output_file"
    echo "<h2>系统信息</h2><pre>$(cat /tmp/system_info.txt)</pre>" >> "$output_file"
    echo "<h2>内存使用情况</h2><pre>$(cat /tmp/memory_info.txt)</pre>" >> "$output_file"
    echo "<h2>磁盘使用情况</h2><pre>$(cat /tmp/disk_info.txt)</pre>" >> "$output_file"
    echo "<h2>网络配置</h2><pre>$(cat /tmp/network_info.txt)</pre>" >> "$output_file"
    echo "<h2>SSH公私钥检查</h2><pre>$(cat /tmp/ssh_keys_check.txt)</pre>" >> "$output_file"
    echo "</body></html>" >> "$output_file"
    
    # 打印巡检结果
    echo "HTML报告生成完毕!"
}

7. 主脚本 (main.sh)

主脚本将调用各个功能模块,并生成最终的HTML报告。

编辑脚本:

vim main.sh

主脚本代码:

#!/bin/bash

# 加载各个功能模块
source ./system_info.sh
source ./memory_info.sh
source ./disk_info.sh
source ./network_info.sh
source ./ssh_keys_check.sh
source ./generate_html_report.sh

# 执行系统巡检
echo "开始系统巡检..."

# 收集系统信息
collect_system_info > /tmp/system_info.txt
sleep 1

# 收集内存信息
collect_memory_info > /tmp/memory_info.txt
sleep 1

# 收集磁盘信息
collect_disk_info > /tmp/disk_info.txt
sleep 1

# 收集网络信息
collect_network_info > /tmp/network_info.txt
sleep 1

# 检查SSH密钥
check_ssh_keys > /tmp/ssh_keys_check.txt
sleep 1

# 生成HTML报告
generate_html_report "/tmp/system_audit_report.html"

echo "系统巡检完成!报告路径:/tmp/system_audit_report.html"

脚本使用步骤

1. 给脚本添加执行权限

首先,为每个脚本文件添加执行权限:

chmod +x system_info.sh
chmod +x memory_info.sh
chmod +x disk_info.sh
chmod +x network_info.sh
chmod +x ssh_keys_check.sh
chmod +x generate_html_report.sh
chmod +x main.sh

2. 执行主脚本

执行主脚本 main.sh 来开始系统巡检:

./main.sh

3. 查看报告

脚本执行后,会生成 HTML 格式的巡检报告。可以通过浏览器查看:

/tmp/system_audit_report.html

([root@server~]#./main.sh
开始系统巡检...
HTML报告生成完毕
系统巡检完成!报告路径:/tmp/system_audit_report.htm2
[rootaserver~]#)

用浏览器打开system_audit_report.html查看系统巡检报告:

(内存使用情况
内存使用情况:
total
used
free
shared buff/cache
available
580Mi
2.9Gi
Mem:
3.5Gi
10Mi
335Mi
3.0Gi
0B
Swap:
2.0Gi
2.0Gi
内存使用情况收集完毕!
磁盘使用情况
磁盘使用情况:
Filesystem
Type
Size Used Avail Use% ounted on
4.OM
04.0M 0%/dev
devtmpfs
devtmpfs
1.8G01.8G 0%/dev/shm
tmpfs
tmpfs
726M 11M715M 2%/run
tmpfs
tmpfs
17G2.0G16G 12%/
/dev/mapper/csroot xfs
960M 308M 653M33%/boot
/dev/nvme0Onlp1
xfs
363M
0363M0%/run/user/0
tmpfs
tmpfs
磁盘使用情况收集完毕!)

(网络配置
网络配置:
1:1o
inet 127.0.0.1/8 scope host lo
valid 1ft forever preferred lft forever
2:ens160
inet 192.168.88.100/24 brd 192.168.88.255 scope global noprefixroute ens160
valid_lft forever preferred_1ft forever
3:ens224
inet 172.20.10.10/24 brd 172.20.10.255 scope global noprefixroute ens224
valid_lft forever preferred_1ft forever
default via 192.168.88.2 dev ens160 proto static metric 100
172.20.10.0/24 dev ens224 proto kernel scope link src 172.20.10.10 metric 101
192.168.88.0/24 dev ens160 proto kernel scope link src 192.168.88. 100metric 100
Netid State Recv-Q Send-Q Local Address:Port Peer Address: PportProcess
udp
UNCONN 0
0
127.0.0.1:323
0.0.0.0:*
users:((“chronyd”,pid=865,fd=5))ino:25040 sk:1 cgroup:/system.slice/chronyd. service<
udp
UNCONN 0
0
[::1]:323
[::]😗
users:((“chronyd”,pid=865,fd=6)) ino:25041 sk:2 cgroup:/system.slice/chronyd.service v6only:1<>
tcp
LISTEN 0
128
0.0.0.0:22
0.0.0.0:*
users:((“sshd”,pid=955,fd=3))ino:25651 sk:3 cgroup:/system.slice/sshd.service<->
tcp
LISTEN 0
128
[::1]:22
[::]😗
users:((“sshd”,pid=955,fd=4)) ino:25653 sk:4 cgroup:/system.slice/sshd. service v6only:1<一>
网络配置收集完毕!
SSH公私钥检查
SSH目录存在:/root/.ssh
total 8
--.1 root root 2535 Nov117:02 known_ hosts
1W
1 root root 1781 Nov 1 17:00 known_hosts.old
-rw---
SSH密钥检查完毕!)

Firewald防火墙配置模块(进阶)

1. 主脚本:main.sh

这个脚本是主要的执行脚本,加载并调用每个模块。

vim main.sh

#!/bin/bash

# 加载各个功能模块
source ./system_info.sh
source ./memory_info.sh
source ./disk_info.sh
source ./network_info.sh
source ./ssh_keys_check.sh
source ./generate_html_report.sh
source ./configure_firewalld.sh  # 新增 Firewalld 防火墙配置模块

# 执行系统巡检
echo "开始系统巡检..."

# 收集系统信息
collect_system_info > /tmp/system_info.txt
sleep 1

# 收集内存信息
collect_memory_info > /tmp/memory_info.txt
sleep 1

# 收集磁盘信息
collect_disk_info > /tmp/disk_info.txt
sleep 1

# 收集网络信息
collect_network_info > /tmp/network_info.txt
sleep 1

# 检查SSH密钥
check_ssh_keys > /tmp/ssh_keys_check.txt
sleep 1

# 配置防火墙
configure_firewalld > /tmp/firewalld_config.txt
sleep 1

# 生成HTML报告
generate_html_report "/tmp/system_audit_report.html"

echo "系统巡检完成!报告路径:/tmp/system_audit_report.html"

2. 防火墙配置文件:firewalld_rules.conf

在此文件中,可以定义要使用的防火墙规则:

vim firewalld_rules.conf
# 只需正确写出的外网网卡(如 ens160)即可
EXTERNAL_INTERFACE=ens160
# 也支持 INTERFACE=ens160(两者任选其一)

# 可选:public 的 target(不需要就注释掉)
# TARGET=DROP

# 外网默认接受的端口(数组内允许范围)
EXTERNAL_TCP_PORTS=(
  500-600
  666
)
EXTERNAL_UDP_PORTS=(
  9030
  10001-11200
)

# 外网富规则(IP+端口)
EXTERNAL_ALLOWED_IPS=(
  119.29.112.81
  119.29.112.82
)
EXTERNAL_TCP_RICH_PORTS=(
  666
  1024-2012
  22
  36000
)
EXTERNAL_UDP_RICH_PORTS=(
  2012-65535
  666
)

# 可以继续写原生命令(必须带 --permanent 让配置永久生效)
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.88.1" port port="22" protocol="tcp" accept'
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" protocol value="icmp" accept'

3. Firewalld防火墙配置模块:configure_firewalld.sh

此模块包含了Firewalld防火墙规则的配置部分。将简化并只配置内网和外网的基本策略。

#!/bin/bash

# 任何错误、未定义变量、管道失败都立刻停下来
set -Eeuo pipefail

# 启动 firewalld
systemctl enable --now firewalld

# 定义配置文件
CFG="${1:-firewalld_rules.conf}"
LOG="/tmp/firewalld_config.txt"

[[ -r "$CFG" ]] || { echo "配置文件不可读: $CFG" >&2; exit 1; }
# shellcheck source=/dev/null
source "$CFG"

# 取外网网卡变量(EXTERNAL_INTERFACE 或 INTERFACE)
INTERFACE="${EXTERNAL_INTERFACE:-${INTERFACE:-}}"
[[ -n "${INTERFACE}" ]] || { echo "请在配置中设置 EXTERNAL_INTERFACE=ens160(或 INTERFACE=ens160)" >&2; exit 1; }

log(){ echo "[$(date +'%F %T')] $*" | tee -a "$LOG"; }
run(){ log "+ $*"; "$@" >>"$LOG" 2>&1; }

log "=== 只配置 public 区域 + 网卡 ${INTERFACE} ==="

# 绑定网卡到 public(幂等)
run firewall-cmd --permanent --zone=public --add-interface="${INTERFACE}"

# 可选:设置 public 的 target(如 TARGET=DROP)
if [[ -n "${TARGET:-}" ]]; then
  run firewall-cmd --permanent --zone=public --set-target="${TARGET}"
fi

# —— 数组式端口:只处理 EXTERNAL_* —— #
add_ports(){
  local proto=$1; shift
  local -a ports=("$@")
  for p in "${ports[@]:-}"; do
    [[ -n "$p" ]] || continue
    run firewall-cmd --permanent --zone=public --add-port="${p}/${proto}"
  done
}

# 基础端口(全网放开)
add_ports tcp "${EXTERNAL_TCP_PORTS[@]:-}"
add_ports udp "${EXTERNAL_UDP_PORTS[@]:-}"

# 白名单 + 端口(rich-rule)
add_rich_ip_ports(){
  local proto=$1; shift
  local -a ports=("$@")
  for ip in "${EXTERNAL_ALLOWED_IPS[@]:-}"; do
    [[ -n "$ip" ]] || continue
    for p in "${ports[@]:-}"; do
      [[ -n "$p" ]] || continue
      run firewall-cmd --permanent --zone=public \
        --add-rich-rule="rule family='ipv4' source address='${ip}' port port='${p}' protocol='${proto}' accept"
    done
  done
}
add_rich_ip_ports tcp "${EXTERNAL_TCP_RICH_PORTS[@]:-}"
add_rich_ip_ports udp "${EXTERNAL_UDP_RICH_PORTS[@]:-}"

# —— 执行配置文件里的原生命令 —— #
# 仅执行以 "firewall-cmd" 开头且包含 "--permanent" 的行(不会执行 reload / list 等)
log "执行配置文件中的原生 firewalld 规则..."
while IFS= read -r line; do
  line="$(echo "$line" | sed 's/^[[:space:]]*//; s/[[:space:]]*$//')"
  [[ -z "$line" || "$line" =~ ^# ]] && continue
  [[ "$line" == firewall-cmd* && "$line" == *"--permanent"* ]] || continue
  # 忽略 reload / list 之类
  if echo "$line" | grep -Eq -- '--reload|--list-'; then
    continue
  fi
  # shellcheck disable=SC2086
  run bash -c "$line"
done < "$CFG"

# 生效与摘要
run firewall-cmd --reload
{
  echo
  echo "===== public 最终配置 ====="
  firewall-cmd --zone=public --list-all
} >>"$LOG" 2>&1

echo "配置Firewalld防火墙完成,详情见 ${LOG} 或者 firewall-cmd --zone=public --list-all"

4. HTML报告生成模块:generate_html_report.sh

这个模块负责将所有收集到的信息汇总并生成HTML格式的报告。

vim generate_html_report.sh

#!/bin/bash

# HTML报告生成模块
generate_html_report() {
    local output_file="$1"
    echo "<html><head><meta charset='utf-8'><title>系统巡检报告</title>" > "$output_file"
    echo "<style>body{font-family:'Arial';background:#f4f4f4;color:#333;margin:20px;}</style>" >> "$output_file"
    echo "</head><body>" >> "$output_file"
    echo "<h1>系统巡检报告</h1>" >> "$output_file"
    echo "<h2>系统信息</h2><pre>$(cat /tmp/system_info.txt)</pre>" >> "$output_file"
    echo "<h2>内存使用情况</h2><pre>$(cat /tmp/memory_info.txt)</pre>" >> "$output_file"
    echo "<h2>磁盘使用情况</h2><pre>$(cat /tmp/disk_info.txt)</pre>" >> "$output_file"
    echo "<h2>网络配置</h2><pre>$(cat /tmp/network_info.txt)</pre>" >> "$output_file"
    echo "<h2>SSH公私钥检查</h2><pre>$(cat /tmp/ssh_keys_check.txt)</pre>" >> "$output_file"
    echo "<h2>Firewalld 配置</h2><pre>$(cat /tmp/firewalld_config.txt)</pre>" >> "$output_file"
    echo "</body></html>" >> "$output_file"
    
    # 打印巡检结果
    echo "HTML报告生成完毕!"
}

5. 脚本使用步骤

1. 给脚本添加执行权限

首先,为每个脚本文件添加执行权限:

chmod +x system_info.sh
chmod +x memory_info.sh
chmod +x disk_info.sh
chmod +x network_info.sh
chmod +x ssh_keys_check.sh
chmod +x generate_html_report.sh
chmod +x configure_firewalld.sh
chmod +x main.sh

2. 执行主脚本

执行主脚本 main.sh 来开始系统巡检和防火墙配置:

./main.sh

([root@server~]#./main.sh
防火墙配置完毕!
验证防火墙配置….
开始系统巡检...
HTML报告生成完毕
系统巡检完成!报告路径:/tmp/system_audit_report.htm2
[root@server~]#)

3. 查看报告

脚本执行后,会生成 HTML 格式的巡检报告,可以通过浏览器查看:

/tmp/system_audit_report.html

(系统巡检报告
系统信息
系统版本:
NAME=“CentOS Stream”
VERSTON=“9”
ID=“centos
"
ID LIKE-“rhe1 fedora
VERSION_ID=“9”
PLATFORM_ID=“platform:e19”
PRETTY_NAME=CentOS Stream 9”
ANSI_COLOR=0;31”
LoGo=“fedora-logoicon
CPE_NAME"pe:/o:centos:centos:9”
HOME_URL=https://centos. org/"
BUG_ REPORT_UR=“https://issues.redhat.com/”
REDHAT SUPPORT_PRODUCT=“Red Hat Enterprise Linux 9”
REDHAT SUPPORT_ PRODUCT VERSION="CentOS Stream
内核版本:5.14.0-511.e19.x86_64
系统架构:x86_64
启动时间:2025-11-04 10:05:23
运行时间:up 1 hour,27 minutes
系统信息收集完毕!)

(内存使用情况
内存使用情况:
total
used
free
shared buff/cache available
Mem:
3.5Gi
987Mi
243Mi
9.OMi
2.6Gi
2.6Gi
2.0Gi
0B
2.0Gi
Swap:
内存使用情况收集完毕!
磁盘使用情况
磁盘使用情况:
Filesystem
Type
Size Used Avail Use% Mounted on
0%/dev
devtmpfs
devtmpfs
4.OM 0 4.OM
1.8G01.8G 0%/dev/shm
tmpfs
tmpfs
726M 9.1M 717M 2%/run
tmpfs
tmpfs
/
/dev/mapper/cs-root xfs
/dev/nvmeOnlp1
xfs
363M0 363M 0%/run/user/0
tmpfs
tmpfs
磁盘使用情况收集完毕!)

(网络配置
网络配置:
1:1o
inet 127.0.0.1/8 scope host lo
valid_1ft forever preferred_1ft forever
2:ens160
inet 192.168.88.100/24 brd 192.168.88.255 scope global noprefixroute ens160V
valid_lft forever preferred_1ft forever
3:ens224
inet 172.20.10.10/24 brd 172.20.10.255 scope global noprefixroute ens224
valid_lft forever preferred_1ft forever
default via 192.168.88.2 dev ens160 proto static metric 100
172.20.10.0/24 dev ens224 proto kernel scope link src 172.20.10.10 metric 101
192.168.88.0/24 dev ens160 proto kernel scope link src 192.168.88. 100metric 100
Netid State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
udp
UNCONN 0
0
127.0.0.1:323
0.0.0.0:*
users:(“chronyd”,pid-863,fd=5)ino:19437sk:1 cgroup:/system.slice/chronyd. service<>
udp
UNCONN 0
0
[:1]:323
[::]😗
users:(“chronyd”,pid=863,fd=6)) ino:19438 sk:2 cgroup:/system.slice/chronyd.service v6only:1<>
tcp
LISTEN 0
128
0.0.0.0:22
0.0.0.0:*
users:((“sshd”,pid=956,fd=3))ino:26164 sk:3 cgroup:/system.slice/sshd.service<->
[::]:22
tcp
LISTEN 0
128
[:]😗
users:(("ssh,pid956,d=4)ino:26166 sk:4 cgroup:/system. slice/sshd. service v6only:1<一
网络配置收集完毕!
SSH公私钥检查
SSH目录存在:/root/.ssh
total 8
1 root root 2535 Nov 1 17:02 known_hosts
1W
1 root root 1781 Nov 1 17:00 known_hosts.old
-rw---
SSH密钥检查完毕!)

(Firewalld配置
[2025-11-0411:32:41]===只配置public区域+网卡ens160=
[2025-11-04 11:32:41]+firewall-cmd-permanent -zone=public -add-interfaceens160
The interface is under control of NetworkManager,setting zone to ‘public’.
success
[2025-11-04 11:32:41]+firewall-cmd--permanent-zone=public-add-port500-600/tcp
success
[202511-04 11:32:42]+firewall-cmd --permanent -zonepublic-add port=666tcep
success
[2025-11-04 11:32:42]+firewall-cmd -permanent-zone-public-add-port=9030/udp
success
[2025-11-04 11:32:42]+firewall-cmd -permanent -zone=public -add-port=10001-11200/udp
success
[2025-11-04 11:32:43] + firewal1-cd-permanentzonepublicaddrichrulerule family’ ipv4’source address 119.29.12.1 portport666potcol’tpaccep
success
[2025-11-04 11:32:43】 + firewal1-cnd -permanent -zone public-ad-rich rulerule family" ip4’ source address’192.12.1 pot pr’ 1024-2012 protocol2tcp accep
success
[2025-11-04 11:32:44】fiewal1-c-peranenzonepubli-ricrulerue family"pv4’soue addres"19.29.112.8portpo2potocotcpacp
success
[2025-11-04 11:32:44]+firewal1-cd-permanentzonepublicaddrichrulerule family"ipv4’source adaess’119.2912.12 prtpot’36000proto’tP accep
success
[2025-11-04 1:32:44]+fireval1-cd-permanentonepublic-dd-icrule=rule family’pv4’source adress 119.29.112.82 porporprotocol’tcpaccep
success
[2025-11-04 11:2:45】+firewal1-cond -permanent -zone public -add rich rulerule family"ipv4’source address’ 192.12.2 prt pr’ 1024-2012’ protocol2tcp accep
success
[2025-11-04 1:32:45]+fiewal1-c-peranen-zone pbli-aricrulerue family"ipv4" source address"119.29.112.82 port port="22 potocotcpccep
success
[2025-11-04 11:2:46】 firewall-d peranentzonepubli-addrichlerule family’pv4 source address 119.29.1.2pr port36000protoco’tcpaccep
success
[202-11-0 :2:46】 firewal-cd-permanent zonepbi-adrichrule=rule family=“ipv4” source address="19.29.12.1 port pr2012-6555prooco’paccep
success
[2025-11-04 11:2:46]+rewall-dperanentnepubliaddrichlerule family’pv4 source address"119.29.112.81 porport6potocodpaccep
success)

([2025-11-04 11:32:]+ashcfirewal-cd-permanentonepublicaddichrule’rule fami1y=“ipv4” source address=“192.168.88.1” port port=“22” protocol=“tcp” accept
Warning: ALREADY_ENABLED:rule family="ipv4"protocol value=“icmp” accept
success
[2025-11-04 11:32:48]+firewall-cmd --reload
success
public最终配置
public (active)
target:DROP
icmp-block-inversion: no
interfaces:ens160 ens224
sources:
services:
ports: 500-600/tcp 666/tcp 9030/udp 10001-11200/udp
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family=“ipv4”
source address=“119. 29.112.82"port port=“2012-65535” protocol=“udp” accept
rule fami ly"ipv4”
source address-“19.29.112.82” port port=“666” protocol='tcp’accept
rule family=“ipv4”
source address=“119.29.112.81” port port=“22” protocol=“tcp” accept
rule family=“ipv4”
protocol value=“icmp” accept
rule family="ipv41
source address=“119.29.112.81”
port port=“2012-65535” protocol=“udp” accept
rule family="ipv4
source address=“119.29.112.82”
port port=“1024-2012” protocol=“tcp” accept
rule family="ipv4
source address=“119.29.112.82”
port port=“666” protocol=“udp” accept
rule family="ipv4
source address=“119.29.112.81” port port=“666” protocol="tcp accept
rule family="ipv4
source address=“192.168.88.1” port port="22"protocol=tcp"accept
rule family="ipv4
source address=“119.29. 112.81”
port port=“1024-2012” protocol=“tcp” accept
rule family="ipv4
source address=“119.29.112.81”
port port=“666” protocol=“udp” accept
rule family="ipv4
source address="119.29.112.81
port port=“3600” protocol=“tcp” accept
rule family="ipv4
source address=“19.29. 112.82” port port=3600 protocol"tcp"accept
rule family="ipv4)

6. 移除Firewalld防火墙规则的脚本(拓展)

[root@server ~]# cat remove_firewalld.sh
#!/bin/bash

# 任何错误、未定义变量、管道失败都立刻停下来
set -Eeuo pipefail

CFG="${1:-firewalld_rules.conf}"
LOG="/tmp/firewalld_remove.txt"

[[ -r "$CFG" ]] || { echo "配置文件不可读: $CFG" >&2; exit 1; }
# shellcheck source=/dev/null
source "$CFG"

INTERFACE="${EXTERNAL_INTERFACE:-${INTERFACE:-}}"
[[ -n "${INTERFACE}" ]] || { echo "请在配置中设置 EXTERNAL_INTERFACE=ens160(或 INTERFACE=ens160)" >&2; exit 1; }

log(){ echo "[$(date +'%F %T')] $*" | tee -a "$LOG"; }
run(){ log "+ $*"; "$@" >>"$LOG" 2>&1; }

run systemctl start firewalld

# 只处理 public:移除数组里添加的内容
remove_ports(){
  local proto=$1; shift
  local -a ports=("$@")
  for p in "${ports[@]:-}"; do
    [[ -n "$p" ]] || continue
    run firewall-cmd --permanent --zone=public --remove-port="${p}/${proto}" || true
  done
}
remove_ports tcp "${EXTERNAL_TCP_PORTS[@]:-}"
remove_ports udp "${EXTERNAL_UDP_PORTS[@]:-}"

remove_rich_ip_ports(){
  local proto=$1; shift
  local -a ports=("$@")
  for ip in "${EXTERNAL_ALLOWED_IPS[@]:-}"; do
    [[ -n "$ip" ]] || continue
    for p in "${ports[@]:-}"; do
      [[ -n "$p" ]] || continue
      run firewall-cmd --permanent --zone=public \
        --remove-rich-rule="rule family='ipv4' source address='${ip}' port port='${p}' protocol='${proto}' accept" || true
    done
  done
}
remove_rich_ip_ports tcp "${EXTERNAL_TCP_RICH_PORTS[@]:-}"
remove_rich_ip_ports udp "${EXTERNAL_UDP_RICH_PORTS[@]:-}"

# 尝试把配置文件里的 add-* 反向移除(三类常见)
log "尝试反向移除配置文件中的原生命令..."
while IFS= read -r line; do
  line="$(echo "$line" | sed 's/^[[:space:]]*//; s/[[:space:]]*$//')"
  [[ -z "$line" || "$line" =~ ^# ]] && continue
  [[ "$line" == firewall-cmd* && "$line" == *"--permanent"* ]] || continue

  if echo "$line" | grep -q -- "--add-port="; then
    # --add-port=XXX/yyy  -> --remove-port=XXX/yyy
    rm_line="$(echo "$line" | sed 's/--add-port=/--remove-port=/')"
    run bash -c "$rm_line" || true
  elif echo "$line" | grep -q -- "--add-service="; then
    rm_line="$(echo "$line" | sed 's/--add-service=/--remove-service=/')"
    run bash -c "$rm_line" || true
  elif echo "$line" | grep -q -- "--add-rich-rule="; then
    rm_line="$(echo "$line" | sed 's/--add-rich-rule=/--remove-rich-rule=/')"
    run bash -c "$rm_line" || true
  fi
done < "$CFG"

# 可选:把网卡从 public 解绑(按需保留/删除)
run firewall-cmd --permanent --zone=public --remove-interface="${INTERFACE}" || true

run firewall-cmd --reload
echo "移除Firewalld规则完成,详情见 ${LOG} 或者 firewall-cmd --zone=public --list-all"
[root@server ~]# firewall-cmd --zone=public --list-all
public (active)
  target: DROP
  icmp-block-inversion: no
  interfaces: ens160 ens224
  sources:
  services:
  ports: 500-600/tcp 666/tcp 9030/udp 10001-11200/udp
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
        rule family="ipv4" source address="119.29.112.82" port port="2012-65535" protocol="udp" accept
        rule family="ipv4" source address="119.29.112.82" port port="666" protocol="tcp" accept
        rule family="ipv4" source address="119.29.112.81" port port="22" protocol="tcp" accept
        rule family="ipv4" protocol value="icmp" accept
        rule family="ipv4" source address="119.29.112.81" port port="2012-65535" protocol="udp" accept
        rule family="ipv4" source address="119.29.112.82" port port="1024-2012" protocol="tcp" accept
        rule family="ipv4" source address="119.29.112.82" port port="666" protocol="udp" accept
        rule family="ipv4" source address="119.29.112.81" port port="666" protocol="tcp" accept
        rule family="ipv4" source address="192.168.88.1" port port="22" protocol="tcp" accept
        rule family="ipv4" source address="119.29.112.81" port port="1024-2012" protocol="tcp" accept
        rule family="ipv4" source address="119.29.112.81" port port="666" protocol="udp" accept
        rule family="ipv4" source address="119.29.112.81" port port="36000" protocol="tcp" accept
        rule family="ipv4" source address="119.29.112.82" port port="36000" protocol="tcp" accept
        rule family="ipv4" source address="119.29.112.82" port port="22" protocol="tcp" accept
[root@server ~]# bash remove_firewalld.sh
Warning: ALREADY_ENABLED: rule family="ipv4" source address="192.168.88.1" port port="22" protocol="tcp" accept
success
Warning: ALREADY_ENABLED: rule family="ipv4" protocol value="icmp" accept
success
[2025-11-04 11:40:59] + systemctl start firewalld
[2025-11-04 11:40:59] + firewall-cmd --permanent --zone=public --remove-port=500-600/tcp
[2025-11-04 11:40:59] + firewall-cmd --permanent --zone=public --remove-port=666/tcp
[2025-11-04 11:41:00] + firewall-cmd --permanent --zone=public --remove-port=9030/udp
[2025-11-04 11:41:00] + firewall-cmd --permanent --zone=public --remove-port=10001-11200/udp
[2025-11-04 11:41:01] + firewall-cmd --permanent --zone=public --remove-rich-rule=rule family='ipv4' source address='119.29.112.81' port port='666' protocol='tcp' accept
[2025-11-04 11:41:01] + firewall-cmd --permanent --zone=public --remove-rich-rule=rule family='ipv4' source address='119.29.112.81' port port='1024-2012' protocol='tcp' accept
[2025-11-04 11:41:01] + firewall-cmd --permanent --zone=public --remove-rich-rule=rule family='ipv4' source address='119.29.112.81' port port='22' protocol='tcp' accept
[2025-11-04 11:41:02] + firewall-cmd --permanent --zone=public --remove-rich-rule=rule family='ipv4' source address='119.29.112.81' port port='36000' protocol='tcp' accept
[2025-11-04 11:41:02] + firewall-cmd --permanent --zone=public --remove-rich-rule=rule family='ipv4' source address='119.29.112.82' port port='666' protocol='tcp' accept
[2025-11-04 11:41:02] + firewall-cmd --permanent --zone=public --remove-rich-rule=rule family='ipv4' source address='119.29.112.82' port port='1024-2012' protocol='tcp' accept
[2025-11-04 11:41:03] + firewall-cmd --permanent --zone=public --remove-rich-rule=rule family='ipv4' source address='119.29.112.82' port port='22' protocol='tcp' accept
[2025-11-04 11:41:03] + firewall-cmd --permanent --zone=public --remove-rich-rule=rule family='ipv4' source address='119.29.112.82' port port='36000' protocol='tcp' accept
[2025-11-04 11:41:04] + firewall-cmd --permanent --zone=public --remove-rich-rule=rule family='ipv4' source address='119.29.112.81' port port='2012-65535' protocol='udp' accept
[2025-11-04 11:41:04] + firewall-cmd --permanent --zone=public --remove-rich-rule=rule family='ipv4' source address='119.29.112.81' port port='666' protocol='udp' accept
[2025-11-04 11:41:05] + firewall-cmd --permanent --zone=public --remove-rich-rule=rule family='ipv4' source address='119.29.112.82' port port='2012-65535' protocol='udp' accept
[2025-11-04 11:41:05] + firewall-cmd --permanent --zone=public --remove-rich-rule=rule family='ipv4' source address='119.29.112.82' port port='666' protocol='udp' accept
[2025-11-04 11:41:05] 尝试反向移除配置文件中的原生命令...
[2025-11-04 11:41:06] + bash -c firewall-cmd --permanent --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.88.1" port port="22" protocol="tcp" accept'
[2025-11-04 11:41:06] + bash -c firewall-cmd --permanent --zone=public --remove-rich-rule='rule family="ipv4" protocol value="icmp" accept'
[2025-11-04 11:41:06] + firewall-cmd --permanent --zone=public --remove-interface=ens160
[2025-11-04 11:41:07] + firewall-cmd --reload
移除Firewalld规则完成,详情见 /tmp/firewalld_remove.txt 或者 firewall-cmd --zone=public --list-all
[root@server ~]# firewall-cmd --zone=public --list-all
public (active)
  target: DROP
  icmp-block-inversion: no
  interfaces: ens160 ens224
  sources:
  services:
  ports:
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

总结

通过本次学习,实现了一个模块化设计的 系统巡检脚本,并集成了 Firewalld 防火墙配置 功能,能够自动配置防火墙规则并生成详细的 HTML 格式巡检报表。该设计使得脚本功能清晰、易于维护,同时也便于后续扩展:

  1. 模块化设计:每个功能拆分为独立模块,增强了代码的可维护性和可扩展性。

  2. 灵活的功能扩展:可以轻松添加新的功能模块,如增加安全性检查、日志分析等。

  3. HTML报告生成:将收集到的信息输出为HTML格式,方便共享和查看。

  4. 防火墙配置:通过脚本实现了内外网防火墙策略的批量配置。

这种方法不仅提高了 系统巡检 的自动化程度,也为 安全审计 和 运维管理 提供了强大的支持。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐