ithuang
ithuang
发布于 2025-07-12 / 3 阅读
0

Shell 脚本模块化编程与 Linux 初始化脚本实现

Shell 脚本模块化编程与 Linux 初始化脚本实现

1. Shell 模块化编程概述

1.1 模块化编程的概念

模块化编程是将复杂任务拆分为多个独立的小模块(函数或脚本)。 每个模块只负责一个明确功能,主脚本统一调度这些模块。

这种思想使脚本更加:

  • 可复用
  • 易维护
  • 易扩展
  • 结构清晰

1.2 模块化的优势

优势说明
易维护模块独立,可快速定位和修复问题
高复用性相同功能模块可被多个脚本共享
可扩展性强新功能只需新增一个模块文件
结构清晰逻辑分层,团队协作更高效

2. Shell 模块化实现方法

Shell 模块化主要有两种方式:


2.1 函数模块化

在单个脚本中定义多个函数,然后按需调用。

保存为 func_demo.sh:

[root@hab1 /shell]# vim fun_demo.sh
[root@hab1 /shell]# cat fun_demo.sh
#!/bin/bash
# 函数模块化示例:系统信息巡检

# 1. 打印系统信息
print_system_info() {
    echo "===== 系统信息 ====="
    echo "主机名: $(hostname)"
    echo "操作系统: $(uname -s)"
    echo "内核版本: $(uname -r)"
}

# 2. 内存使用
show_memory_usage() {
    echo "===== 内存使用情况 ====="
    free -h
}

# 3. 磁盘使用
show_disk_usage() {
    echo "===== 磁盘使用情况 ====="
    df -h --output=source,pcent,target | column -t
}

# 主逻辑调用
print_system_info
show_memory_usage
show_disk_usage
[root@hab1 /shell]# cat fun_demo.sh
#!/bin/bash
# 函数模块化示例:系统信息巡检

# 1. 打印系统信息
print_system_info() {
    echo "===== 系统信息 ====="
    echo "主机名: $(hostname)"
    echo "操作系统: $(uname -s)"
    echo "内核版本: $(uname -r)"
}

# 2. 内存使用
show_memory_usage() {
    echo "===== 内存使用情况 ====="
    free -h
}

# 3. 磁盘使用
show_disk_usage() {
    echo "===== 磁盘使用情况 ====="
    df -h --output=source,pcent,target | column -t
}

# 主逻辑调用
print_system_info
show_memory_usage
show_disk_usage

[root@hab1 /shell]# chmod 755 fun_demo.sh
[root@hab1 /shell]# bash fun_demo.sh
===== 系统信息 =====
主机名: hab1
操作系统: Linux
内核版本: 5.14.0-511.el9.x86_64
===== 内存使用情况 =====
               total        used        free      shared  buff/cache   available
Mem:           1.7Gi       490Mi       997Mi       7.0Mi       406Mi       1.2Gi
Swap:          2.0Gi          0B       2.0Gi
===== 磁盘使用情况 =====
文件系统             已用%  挂载点
devtmpfs             0%     /dev
tmpfs                0%     /dev/shm
tmpfs                2%     /run
efivarfs             22%    /sys/firmware/efi/efivars
/dev/mapper/cs-root  8%     /
/dev/nvme0n1p2       24%    /boot
/dev/nvme0n1p1       2%     /boot/efi
tmpfs                1%     /run/user/0
df -h --output=source,pcent,target | column -t
df -h 查找磁盘信息
--output=source,pcent,target 只输出这三方面的信息
column -t 调整输出格式,让数据对齐

2.2 脚本模块化

将不同功能拆分为独立脚本文件,通过 source 加载。

示例:脚本模块化巡检

创建目录并进入:

mkdir file_mod_demo && cd file_mod_demo

(1) CPU信息模块 (cpu_info.sh)

[root@hab1 /shell]# vim cpu_info.sh
[root@hab1 /shell]# cat cpu_info.sh
#!/bin/bash
collect_cpu_info() {
    echo "===== CPU 信息 ====="
    lscpu | grep -E "Model name|Architecture|CPU\(s\)"
}
lscpu | grep -E "Model name|Architecture|CPU\(s\)"
lscpu 查找 CPU 信息
grep -E 启用正则表达式
"Model name|Architecture|CPU\(s\)" 找CPU对应的信息,其中两个\符号是转义字符

(2) 内存信息模块 (mem_info.sh)

[root@hab1 /shell]# vim mem_info.sh
[root@hab1 /shell]# cat mem_info.sh
#!/bin/bash
collect_memory_info() {
    echo "===== 内存信息 ====="
    free -h
}

(3) 磁盘信息模块 (disk_info.sh)

[root@hab1 /shell]# vim disk_info.sh
[root@hab1 /shell]# cat disk_info.sh
#!/bin/bash
collect_disk_info() {
    echo "===== 磁盘信息 ====="
    df -h --output=source,pcent,target | column -t
}
df -h --output=source,pcent,target | column -t
df -h 查找磁盘信息
--output=source,pcent,target 只输出这三方面的信息
column -t 调整输出格式,让数据对齐

(4) 主脚本(main.sh)

[root@hab1 /shell]# vim main.sh
[root@hab1 /shell]# cat main.sh
#!/bin/bash
# 文件模块化巡检主脚本

# 加载模块
source ./cpu_info.sh
source ./mem_info.sh
source ./disk_info.sh

echo "开始系统信息巡检..."
sleep 1
collect_cpu_info # 调用函数
sleep 1
collect_memory_info # 调用函数
sleep 1
collect_disk_info # 调用函数
echo "系统巡检完成"

运行:

chmod +x *.sh # 给所有脚本加 x 执行权限
bash main.sh

输出:

[root@hab1 /shell]# chmod +x *.sh
[root@hab1 /shell]# ll
总用量 20
-rwxr-xr-x 1 root root 124  4月 13 19:50 cpu_info.sh
-rwxr-xr-x 1 root root 123  4月 13 19:52 disk_info.sh
-rwxr-xr-x 1 root root 552  4月 13 17:40 fun_demo.sh
-rwxr-xr-x 1 root root 311  4月 13 19:53 main.sh
-rwxr-xr-x 1 root root  86  4月 13 19:51 mem_info.sh
[root@hab1 /shell]# bash main.sh
开始系统信息巡检...
===== CPU 信息 =====
BIOS Model name:                      Intel(R) Core(TM) i5-8265U CPU @ 1.60GHz
===== 内存信息 =====
               total        used        free      shared  buff/cache   available
Mem:           1.7Gi       494Mi       993Mi       7.0Mi       406Mi       1.2Gi
Swap:          2.0Gi          0B       2.0Gi
===== 磁盘信息 =====
文件系统             已用%  挂载点
devtmpfs             0%     /dev
tmpfs                0%     /dev/shm
tmpfs                2%     /run
efivarfs             22%    /sys/firmware/efi/efivars
/dev/mapper/cs-root  8%     /
/dev/nvme0n1p2       24%    /boot
/dev/nvme0n1p1       2%     /boot/efi
tmpfs                1%     /run/user/0
系统巡检完成

3. Linux 系统初始化脚本模块化实现

3.1 目标

本脚本旨在通过模块化的方式对 Linux 系统进行初始化配置。通过选择不同的选项,用户可以实现一键系统优化、SSH配置、MySQL安装、Nginx安装、静态IP配置等操作。脚本适用于 CentOS Stream 9、RHEL、Rocky Linux、AlmaLinux 等 Linux 系统。


3.2 脚本结构

  1. 模块化设计:每个功能被分离到独立的脚本文件中,主脚本根据用户选择来调用这些模块。

  2. 功能模块:

    1. 系统优化
    2. 配置阿里云源
    3. 配置SSH
    4. 配置时间同步
    5. 配置DNS
    6. 配置防火墙
    7. 安装常用工具
    8. 安装MySQL
    9. 安装Nginx
    10. 配置静态IP

3.2.1 主脚本 (main.sh)

mkdir server_init && cd server_init
vim main.sh
[root@hab1 /shell/server_init]# cat main.sh
#!/bin/bash

# 引入所有模块(仅加载函数,不执行)
source ./optimize_system.sh
source ./configure_dns.sh
source ./configure_aliyun_repo.sh
source ./configure_ssh.sh
source ./configure_time_sync.sh
source ./configure_firewall.sh
source ./install_basic_tools.sh
source ./install_mysql.sh
source ./install_nginx.sh
source ./configure_static_ip.sh

# 获取主网卡函数
get_active_interface() {
    iface=$(ip route | grep default | awk '{print $5}' | head -n 1)
    [ -z "$iface" ] && iface=$(ip a | grep 'state UP' | awk '{print $2}' | sed 's/://')
    echo "$iface"
}

# 选项菜单(按照图片中的顺序)
echo "请选择操作:"
echo "0. 执行所有操作"
echo "1. 优化Linux系统"
echo "2. 配置DNS"
echo "3. 配置阿里云源"
echo "4. 配置SSH"
echo "5. 配置时间同步"
echo "6. 配置防火墙"
echo "7. 安装常用工具"
echo "8. 安装MySQL"
echo "9. 安装Nginx"
echo "10. 配置静态IP"

# 获取用户输入
read -p "请输入选项(0-10): " choice

# 根据选项执行相应的功能
case $choice in
    0)
        echo "正在执行所有操作..."
        optimize_system
        configure_dns
        configure_aliyun_repo
        configure_ssh
        configure_time_sync
        configure_firewall
        install_basic_tools
        install_mysql
        install_nginx
        configure_static_ip
        ;;
    1)
        echo "正在优化Linux系统..."
        optimize_system
        ;;
    2)
        echo "正在配置DNS..."
        configure_dns
        ;;
    3)
        echo "正在配置阿里云源..."
        configure_aliyun_repo
        ;;
    4)
        echo "正在配置SSH..."
        configure_ssh
        ;;
    5)
        echo "正在配置时间同步..."
        configure_time_sync
        ;;
    6)
        echo "正在配置防火墙..."
        configure_firewall
        ;;
    7)
        echo "正在安装常用工具..."
        install_basic_tools
        ;;
    8)
        echo "正在安装MySQL..."
        install_mysql
        ;;
    9)
        echo "正在安装Nginx..."
        install_nginx
        ;;
    10)
        echo "正在配置静态IP..."
        configure_static_ip
        ;;
    *)
        echo "无效选择,请输入0-10之间的数字"
        ;;
esac

脚本说明

#!/bin/bash

# ==================== 脚本整体说明 ====================
# 脚本用途:Linux 服务器一键初始化、配置工具菜单
# 运行方式:chmod +x 脚本名.sh && ./脚本名.sh
# 核心逻辑:加载外部函数文件 → 展示菜单 → 读取用户选择 → 执行对应功能
# ======================================================

# 加载外部脚本文件(只导入函数,不执行任何操作)
# source 命令作用:将外部脚本的函数导入当前脚本,可直接调用
source ./optimize_system.sh        # 系统优化函数
source ./configure_aliyun_repo.sh  # 阿里云软件源配置函数
source ./configure_ssh.sh          # SSH 配置函数
source ./configure_time_sync.sh    # 时间同步配置函数
source ./configure_dns.sh          # DNS 配置函数
source ./configure_firewall.sh     # 防火墙配置函数
source ./install_basic_tools.sh    # 常用工具安装函数
source ./install_mysql.sh          # MySQL 安装函数
source ./install_nginx.sh          # Nginx 安装函数
source ./configure_static_ip.sh    # 静态 IP 配置函数

# ==================== 核心工具函数 ====================
# 函数名:get_active_interface
# 功能:自动获取当前系统**正在使用的物理网卡**(如 eth0、ens33)
get_active_interface() {
    # -------------------- 方法1:从默认路由获取网卡(最准确) --------------------
    # ip route          查看系统路由表信息
    # grep default      过滤出“默认路由”(服务器访问外网的路由)
    # awk '{print $5}'  提取路由信息的第 5 列(这一列固定是网卡名称)
    # head -n 1         只取第一条结果(避免多网卡重复)
    # 结果存入变量 iface
    iface=$(ip route | grep default | awk '{print $5}' | head -n 1)

    # -------------------- 方法2:备用方案(方法1获取失败时执行) --------------------
    # [ -z "$iface" ]   判断 iface 变量是否为空(-z = zero 空值)
    # &&               逻辑与:前面成立,才执行后面命令
    # ip a             查看所有网卡信息(ip address 缩写)
    # grep 'state UP'   过滤出状态为“已启用”的网卡
    # awk '{print $2}' 提取第 2 列(网卡名,带冒号,如 ens160:)
    # sed 's/://'      替换掉冒号,得到纯网卡名
    [ -z "$iface" ] && iface=$(ip a | grep 'state UP' | awk '{print $2}' | sed 's/://')

    # 输出最终获取到的网卡名称,供其他配置使用
    echo "$iface"
}

# ==================== 展示操作菜单 ====================
echo "请选择操作:"
echo "0. 执行所有操作"
echo "1. 优化Linux系统"
echo "2. 配置阿里云源"
echo "3. 配置SSH"
echo "4. 配置时间同步"
echo "5. 配置DNS"
echo "6. 配置防火墙"
echo "7. 安装常用工具"
echo "8. 安装MySQL"
echo "9. 安装Nginx"
echo "10. 配置静态IP"

# ==================== 读取用户输入 ====================
# read 命令:读取用户键盘输入
# -p 参数:显示提示文字
# 输入内容存入变量 choice
read -p "请输入选项(0-10): " choice

# ==================== 根据选择执行对应函数 ====================
# case 多条件判断语句:匹配用户输入的数字,执行对应代码
case $choice in
    # 输入 0:一键执行所有配置
    0)
        echo "正在执行所有操作..."
        optimize_system         # 调用系统优化函数
        configure_dns           # 调用 DNS 配置函数
        configure_aliyun_repo   # 调用阿里云源配置函数
        configure_ssh           # 调用 SSH 配置函数
        configure_time_sync     # 调用时间同步函数
        configure_firewall      # 调用防火墙配置函数
        install_basic_tools     # 调用常用工具安装函数
        install_mysql           # 调用 MySQL 安装函数
        install_nginx           # 调用 Nginx 安装函数
        configure_static_ip     # 调用静态 IP 配置函数
        ;;  # 每个分支结束必须写 ;;
    
    # 输入 1:仅优化系统
    1)
        echo "正在优化Linux系统..."
        optimize_system
        ;;
    
    # 输入 2:仅配置 DNS
    2)
        echo "正在配置DNS..."
        configure_dns
        ;;
        
    # 输入 3:仅配置阿里云源
    3)
        echo "正在配置阿里云源..."
        configure_aliyun_repo
        ;;
    
    # 输入 4:仅配置 SSH
    4)
        echo "正在配置SSH..."
        configure_ssh
        ;;
    
    # 输入 5:仅配置时间同步
    5)
        echo "正在配置时间同步..."
        configure_time_sync
        ;;
            
    # 输入 6:仅配置防火墙
    6)
        echo "正在配置防火墙..."
        configure_firewall
        ;;
    
    # 输入 7:仅安装常用工具
    7)
        echo "正在安装常用工具..."
        install_basic_tools
        ;;
    
    # 输入 8:仅安装 MySQL
    8)
        echo "正在安装MySQL..."
        install_mysql
        ;;
    
    # 输入 9:仅安装 Nginx
    9)
        echo "正在安装Nginx..."
        install_nginx
        ;;
    
    # 输入 10:仅配置静态 IP
    10)
        echo "正在配置静态IP..."
        configure_static_ip
        ;;
    
    # 输入 0-10 以外内容:提示无效选项
    *)
        echo "无效选择,请输入0-10之间的数字"
        ;;
esac

3.2.2 各模块脚本

必须在同一路径下

(1) 系统优化模块 (**optimize_system.sh**)

[root@hab1 /shell/server_init]# vim optimize_system.sh
[root@hab1 /shell/server_init]# cat optimize_system.sh
#!/bin/bash
# 优化Linux系统
optimize_system() {
    echo "优化Linux系统..."
    setenforce 0
    sed -i -r 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
    modprobe bridge
    echo 1 > /proc/sys/net/ipv4/ip_forward
    echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
    echo "net.ipv4.icmp_echo_ignore_all=0" >> /etc/sysctl.conf
    sysctl -p >/dev/null 2>&1
    echo "Linux系统优化完成"
}

脚本说明

#!/bin/bash

# 函数名:optimize_system
# 功能:Linux 系统基础优化(关闭SELinux、开启内核转发、加载网桥模块、开启ping)
# 作用:让服务器网络更稳定、兼容虚拟化/容器、关闭安全限制
optimize_system() {
    # 输出提示信息:告诉用户正在执行系统优化
    echo "优化Linux系统..."

    # 临时关闭 SELinux(立即生效)
    # setenforce 0 = 将SELinux设置为宽容模式(不拦截操作,仅记录日志)
    setenforce 0

    # 永久关闭 SELinux(重启后依然生效)
    # sed -i = 直接修改文件内容(in-place)
    # -r = 启用扩展正则表达式
    # s/^SELINUX=.*/SELINUX=disabled/g = 匹配以SELINUX=开头的行,替换为SELINUX=disabled
    # /etc/selinux/config = SELinux主配置文件
    sed -i -r 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config

    # 加载 Linux 内核 bridge(网桥)模块
    # modprobe = 加载内核模块
    # bridge = 网桥模块,Docker/KVM/虚拟机网络必备
    modprobe bridge

    # 临时开启 系统IP转发功能(立即生效)
    # 作用:让服务器可以转发数据包,实现路由/共享上网
    # /proc/sys/net/ipv4/ip_forward = 内核IP转发开关,1=开启,0=关闭
    echo 1 > /proc/sys/net/ipv4/ip_forward

    # 永久开启 IP 转发(重启后依然生效)
    # 将配置写入 /etc/sysctl.conf 系统内核参数文件
    echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

    # 永久允许 Ping 响应(防止服务器禁ping导致无法测试连通性)
    # icmp_echo_ignore_all=0 表示 不忽略ICMP请求(允许ping)
    # 1=禁止ping,0=允许ping
    echo "net.ipv4.icmp_echo_ignore_all=0" >> /etc/sysctl.conf

    # 重新加载内核参数,让上面的配置立即生效
    # sysctl -p = 加载/etc/sysctl.conf配置
    # >/dev/null 2>&1 = 屏蔽所有输出(不打印提示信息,保持界面干净)
    sysctl -p >/dev/null 2>&1

    # 输出提示:优化完成
    echo "Linux系统优化完成"
}

(2) 配置DNS模块 (**configure_dns.sh**)

[root@hab1 /shell/server_init]# vim configure_dns.sh
[root@hab1 /shell/server_init]# cat configure_dns.sh
#!/bin/bash
# 配置DNS
configure_dns() {
echo "配置DNS..."
echo
echo "默认主DNS:114.114.114.114"
echo "默认备用DNS:8.8.8.8"
echo
read -p "请输入主DNS(直接回车使用默认): " dns1
dns1=${dns1:-114.114.114.114}
read -p "请输入备用DNS(直接回车使用默认): " dns2
dns2=${dns2:-8.8.8.8}
cat > /etc/resolv.conf <<EOF
nameserver $dns1
nameserver $dns2
EOF
echo "$dns1,$dns2" > /tmp/dns_list.txt
echo "DNS配置完成,主DNS:$dns1,备用DNS:$dns2"
}

脚本说明

#!/bin/bash

# 函数名:configure_dns
# 功能:配置 Linux 系统 DNS 域名解析(让服务器能通过域名访问网络)
# 作用:设置主备DNS,保证域名解析稳定、快速
configure_dns() {
    # 输出提示信息:开始配置DNS
    echo "配置DNS..."

    # 空行,让界面输出更美观、易读
    echo

    # 提示用户当前脚本的默认DNS地址
    echo "默认主DNS:114.114.114.114"  # 国内公共DNS,速度快
    echo "默认备用DNS:8.8.8.8"        # Google公共DNS,国际通用

    # 空行,界面美观
    echo

    # 读取用户输入的【主DNS】
    # read -p 显示提示文字并等待用户输入
    # 输入内容存入变量 dns1
    read -p "请输入主DNS(直接回车使用默认): " dns1

    # 设置主DNS默认值
    # ${dns1:-114.114.114.114}
    # 如果用户未输入(直接回车),则变量 dns1 使用默认值 114.114.114.114
    dns1=${dns1:-114.114.114.114}

    # 读取用户输入的【备用DNS】
    read -p "请输入备用DNS(直接回车使用默认): " dns2

    # 设置备用DNS默认值,未输入则使用 8.8.8.8
    dns2=${dns2:-8.8.8.8}

    # ==================== 核心:写入DNS配置文件 ====================
    # cat > 文件 <<EOF:覆盖写入文件内容
    # /etc/resolv.conf 是 Linux 系统的 DNS 配置文件
    cat > /etc/resolv.conf <<EOF
# 主DNS服务器
nameserver $dns1
# 备用DNS服务器(主DNS故障时自动切换)
nameserver $dns2
EOF

    # 将配置好的DNS地址保存到临时文件 /tmp/dns_list.txt
    # 作用:方便后续脚本查看/读取当前DNS配置
    echo "$dns1,$dns2" > /tmp/dns_list.txt

    # 输出提示:配置完成,并显示当前生效的主备DNS地址
    echo "DNS配置完成,主DNS:$dns1,备用DNS:$dns2"
}

(3) 配置阿里云源模块 (**configure_aliyun_repo.sh**)

[root@hab1 /shell/server_init]# vim configure_aliyun_repo.sh
[root@hab1 /shell/server_init]# cat configure_aliyun_repo.sh
#!/bin/bash
# 配置阿里云源
configure_aliyun_repo() {
echo "配置阿里云源..."
# mkdir -p /etc/yum.repos.d/backup
# mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/ &>/dev/null
cat > /etc/yum.repos.d/aliyun.repo <<EOF
[baseos]
name=CentOS Stream \$releasever - BaseOS
baseurl=https://mirrors.aliyun.com/centos-stream/\$stream/BaseOS/\$basearch/os/
gpgcheck=0
enabled=1

[appstream]
name=CentOS Stream \$releasever - AppStream
baseurl=https://mirrors.aliyun.com/centos-stream/\$stream/AppStream/\$basearch/os/
gpgcheck=0
enabled=1
EOF
yum clean all >/dev/null 2>&1
yum makecache fast >/dev/null 2>&1
echo "阿里云源配置完成"
}

脚本说明

#!/bin/bash

# 函数名:configure_aliyun_repo
# 功能:为 CentOS/RHEL 系统配置【阿里云 YUM 软件源】
# 作用:替换官方源,让软件下载速度更快、更稳定
configure_aliyun_repo() {
    # 输出提示信息:开始配置阿里云源
    echo "配置阿里云源..."

    # 以下两行被注释(# 开头),表示暂不执行
    # 作用:备份系统原有的 yum 源文件(防止出错可恢复)
    # mkdir -p /etc/yum.repos.d/backup/
    # mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/ &>/dev/null

    # ===================== 核心:生成阿里云 repo 配置文件 =====================
    # cat > 文件名 <<EOF
    # 作用:将 EOF 之间的所有内容,覆盖写入到指定文件中
    # /etc/yum.repos.d/aliyun.repo 是 yum 源配置文件
    cat > /etc/yum.repos.d/aliyun.repo <<EOF
# BaseOS 软件源(系统核心基础包)
[baseos]
name=CentOS Stream \$releasever - BaseOS          # 源名称(自定义,方便识别)
baseurl=https://mirrors.aliyun.com/centos-stream/\$stream/BaseOS/\$basearch/os/  # 阿里云下载地址
gpgcheck=0                                        # 关闭 GPG 校验(0=关闭,1=开启)
enabled=1                                          # 启用该源(1=启用,0=禁用)

# AppStream 软件源(应用程序、扩展包)
[appstream]
name=CentOS Stream \$releasever - AppStream
baseurl=https://mirrors.aliyun.com/centos-stream/\$stream/AppStream/\$basearch/os/
gpgcheck=0
enabled=1
EOF

    # 清理旧的 yum 缓存(删除本地已缓存的软件包信息)
    # >/dev/null 2>&1  表示屏蔽所有输出,不打印日志
    yum clean all >/dev/null 2>&1

    # 快速生成新的 yum 缓存(让系统识别新配置的阿里云源)
    yum makecache fast >/dev/null 2>&1

    # 输出提示:配置完成
    echo "阿里云源配置完成"
}

(4) 配置SSH模块 (**configure_ssh.sh**)

[root@hab1 /shell/server_init]# vim configure_ssh.sh
[root@hab1 /shell/server_init]# cat configure_ssh.sh
#!/bin/bash
# 配置SSH
configure_ssh() {
echo "配置SSH..."
read -p "请输入SSH端口(默认22): " ssh_port
ssh_port=${ssh_port:-22}
sed -i "s/^#Port .*/Port $ssh_port/" /etc/ssh/sshd_config
sed -i "s/^Port .*/Port $ssh_port/" /etc/ssh/sshd_config
sed -i 's/^#PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
sed -i 's/^PermitRootLogin no/PermitRootLogin yes/' /etc/ssh/sshd_config
sed -i 's/^PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config
systemctl restart sshd
echo "SSH配置完成,当前端口:$ssh_port"
}

脚本说明

#!/bin/bash

# 函数名:configure_ssh
# 功能:配置 SSH 远程连接服务(修改端口、允许root登录、开启密码验证)
# 作用:方便远程管理服务器,提高使用便利性
configure_ssh() {
    # 输出提示信息:开始配置SSH
    echo "配置SSH..."

    # 读取用户输入的SSH端口号
    # read -p :显示提示文字并等待用户输入
    # 输入内容保存到变量 ssh_port
    read -p "请输入SSH端口(默认22): " ssh_port

    # 设置端口默认值
    # ${ssh_port:-22} :如果用户没有输入内容(直接回车),则使用默认值 22
    ssh_port=${ssh_port:-22}

    # 修改SSH配置文件:取消注释#Port 并设置为用户指定的端口
    # sed -i :直接修改文件内容
    # s/^#Port .*/Port $ssh_port/
    # 匹配以 #Port 开头的行,替换成 Port 自定义端口
    sed -i "s/^#Port .*/Port $ssh_port/" /etc/ssh/sshd_config

    # 修改SSH配置文件:如果已经有 Port 配置,直接覆盖更新
    # 匹配以 Port 开头的行,替换成最新端口
    sed -i "s/^Port .*/Port $ssh_port/" /etc/ssh/sshd_config

    # 开启root远程登录权限(取消注释)
    # 匹配 #PermitRootLogin 开头的行,替换为 PermitRootLogin yes
    sed -i 's/^#PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config

    # 开启root远程登录权限(如果配置为no则强制改为yes)
    # 匹配 PermitRootLogin no ,替换为 yes
    sed -i 's/^PermitRootLogin no/PermitRootLogin yes/' /etc/ssh/sshd_config

    # 开启密码登录认证
    # 匹配 PasswordAuthentication no ,替换为 yes(允许使用密码连接SSH)
    sed -i 's/^PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config

    # 重启SSH服务,让所有配置立即生效
    # systemctl restart sshd = 重启sshd服务
    systemctl restart sshd

    # 输出提示:配置完成,并显示当前使用的SSH端口
    echo "SSH配置完成,当前端口:$ssh_port"
}

(5) 配置时间同步模块 (**configure_time_sync.sh**)

[root@hab1 /shell/server_init]# vim configure_time_sync.sh
[root@hab1 /shell/server_init]# cat configure_time_sync.sh
#!/bin/bash
# 配置时间同步
configure_time_sync() {
echo "配置时间同步..."
yum install -y chrony &>/dev/null
systemctl enable chronyd --now
chronyc sources
echo "时间同步配置完成"
}

脚本说明

#!/bin/bash

# 函数名:configure_time_sync
# 功能:配置 Linux 系统时间自动同步(使用 chrony 服务)
# 作用:保证服务器时间准确,避免日志错乱、证书失效、服务异常等问题
configure_time_sync() {
    # 输出提示信息:开始配置时间同步
    echo "配置时间同步..."

    # 安装 chrony 时间同步服务
    # yum install -y      自动安装,无需确认(-y = yes 确认所有安装)
    # >/dev/null          屏蔽安装过程输出(让界面更干净)
    yum install -y chrony &>/dev/null

    # 设置 chronyd 服务:开机自启 + 立即启动
    # systemctl enable    设置开机自动启动
    # --now               同时立刻启动服务(不用重启系统)
    systemctl enable chronyd --now

    # 查看时间同步源状态(显示当前正在同步的时间服务器)
    # chronyc sources     查看 chrony 同步情况,用于验证服务是否正常
    chronyc sources

    # 输出提示:时间同步配置完成
    echo "时间同步配置完成"
}

(6) 配置防火墙模块 (**configure_firewall.sh**)

[root@hab1 /shell/server_init]# vim configure_firewall.sh
[root@hab1 /shell/server_init]# cat configure_firewall.sh
#!/bin/bash
# 配置防火墙
configure_firewall() {
echo "配置防火墙..."
systemctl stop firewalld &>/dev/null
systemctl disable firewalld &>/dev/null
iptables -F; iptables -t nat -F
iptables -P INPUT ACCEPT; iptables -P FORWARD ACCEPT
echo 1 > /proc/sys/net/ipv4/ip_forward
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p >/dev/null 2>&1
echo "防火墙配置完成"
}

脚本说明

#!/bin/bash

# 函数名:configure_firewall
# 功能:关闭并禁用 firewalld 防火墙,清空 iptables 规则,开启 IP 转发
# 作用:适用于内网环境/测试环境,避免防火墙拦截端口、服务无法访问
# 生产环境公网服务器不建议直接这么操作
configure_firewall() {
    # 输出提示信息
    echo "配置防火墙..."

    # 停止 firewalld 防火墙服务
    # &>/dev/null 表示屏蔽命令执行的所有输出(不显示报错或信息)
    systemctl stop firewalld &>/dev/null

    # 禁用 firewalld 开机自启,防止重启后再次启动
    systemctl disable firewalld &>/dev/null

    # 清空防火墙规则
    # iptables -F               清空 filter 表的所有规则
    # iptables -t nat -F        清空 nat 网络地址转换表的所有规则
    iptables -F; iptables -t nat -F

    # 设置防火墙默认策略为允许(ACCEPT)
    # iptables -P INPUT ACCEPT      允许所有入站流量
    # iptables -P FORWARD ACCEPT     允许所有数据包转发
    iptables -P INPUT ACCEPT; iptables -P FORWARD ACCEPT

    # 临时开启 IP 转发(内核立即生效)
    # 作用:允许服务器转发网络数据包,用于路由、Docker、虚拟机等
    echo 1 > /proc/sys/net/ipv4/ip_forward

    # 永久开启 IP 转发,写入系统内核配置文件,重启依然生效
    echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf

    # 重新加载 sysctl 内核参数
    # -p 加载 /etc/sysctl.conf
    # >/dev/null 2>&1 屏蔽所有输出
    sysctl -p >/dev/null 2>&1

    # 提示配置完成
    echo "防火墙配置完成"
}

(7) 安装常用工具模块 (**install_basic_tools.sh**)

[root@hab1 /shell/server_init]# vim install_basic_tools.sh
[root@hab1 /shell/server_init]# cat install_basic_tools.sh
#!/bin/bash
# 安装常用工具
install_basic_tools() {
echo "安装常用工具..."
yum install -y epel-release yum-utils &>/dev/null
yum install -y vim git wget net-tools lrzsz zip unzip bzip2 psmisc telnet tree &>/dev/null
echo "常用工具安装完成"
}

脚本说明

#!/bin/bash

# 函数名:install_basic_tools
# 功能:安装 Linux 系统管理必备的常用工具包
# 作用:让服务器具备编辑文件、下载文件、网络测试、文件解压等基础能力
install_basic_tools() {
    # 输出提示信息:开始安装常用工具
    echo "安装常用工具..."

    # 第一步:安装扩展源和yum工具
    # yum install -y         自动确认安装,无需手动输入y
    # epel-release           第三方扩展软件源(提供很多官方源没有的工具)
    # yum-utils              yum工具集(包含yum-config-manager等常用命令)
    # &>/dev/null            屏蔽所有安装输出(界面干净不刷屏)
    yum install -y epel-release yum-utils &>/dev/null

    # 第二步:批量安装基础运维工具
    # 一次性安装所有常用命令,每个工具作用见注释
    yum install -y \
    vim \           # 强大的文本编辑器,修改配置文件必备
    git \           # 代码版本管理工具
    wget \          # 从网络下载文件的工具
    net-tools \     # 网络工具包(包含 ifconfig、netstat 等经典命令)
    lrzsz \         # 文件上传下载工具(rz上传、sz下载)
    zip \           # zip压缩工具
    unzip \         # zip解压工具
    bzip2 \         # bzip2压缩解压工具
    psmisc \        # 进程管理工具(包含 killall 等命令)
    telnet \        # 端口连通性测试工具
    tree \          # 树形结构展示目录文件
    &>/dev/null

    # 输出提示:安装完成
    echo "常用工具安装完成"
}

(8) 安装MySQL模块 (**install_mysql.sh**)

[root@hab1 /shell/server_init]# vim install_mysql.sh
[root@hab1 /shell/server_init]# cat install_mysql.sh
#!/bin/bash
# 安装MySQL
install_mysql() {
echo "安装MySQL..."
yum install -y mysql-server &>/dev/null
systemctl enable mysqld --now
systemctl status mysqld --no-pager
echo "MySQL安装完成"
}

脚本说明

#!/bin/bash

# 函数名:install_mysql
# 功能:一键安装 MySQL 数据库服务并启动
# 作用:快速部署数据库环境,支持开机自启,查看运行状态
install_mysql() {
    # 输出提示信息:开始安装 MySQL
    echo "安装MySQL..."

    # 安装 MySQL 服务端
    # yum install -y        自动确认安装,无需手动输入 y
    # mysql-server          MySQL 数据库服务包
    # &>/dev/null           屏蔽安装过程的所有输出(界面干净)
    yum install -y mysql-server &>/dev/null

    # 设置 MySQL 开机自启,并立即启动服务
    # systemctl enable      设置服务开机自动启动
    # --now                 立即启动服务(不需要重启系统)
    systemctl enable mysqld --now

    # 查看 MySQL 服务当前运行状态
    # systemctl status      查看服务状态
    # --no-pager            不分页显示(直接输出全部信息,不卡住)
    systemctl status mysqld --no-pager

    # 输出提示:MySQL 安装并启动完成
    echo "MySQL安装完成"
}

(9) 安装Nginx模块 (**install_nginx.sh**)

[root@hab1 /shell/server_init]# vim install_nginx.sh
[root@hab1 /shell/server_init]# cat install_nginx.sh
#!/bin/bash
# 安装Nginx
install_nginx() {
echo "安装Nginx..."
yum install -y nginx &>/dev/null
systemctl enable nginx --now
systemctl status nginx --no-pager
echo "Welcome to IT-HeiMa" > /usr/share/nginx/html/index.html
echo "Nginx安装并配置完成"
}

脚本说明

#!/bin/bash

# 函数名:install_nginx
# 功能:一键安装 Nginx 网页服务 + 启动 + 开机自启 + 自定义首页
# 作用:快速搭建 Web 服务器,用于网站、代理、负载均衡等
install_nginx() {
    # 输出提示信息:开始安装 Nginx
    echo "安装Nginx..."

    # 安装 Nginx 服务
    # yum install -y        自动确认安装,无需手动输入 y
    # nginx                Nginx 官方软件包
    # &>/dev/null          屏蔽安装过程输出(界面干净,不打印日志)
    yum install -y nginx &>/dev/null

    # 设置 Nginx 开机自启,并立即启动服务
    # systemctl enable     设置服务开机自动运行
    # --now                立即启动服务(无需重启系统)
    systemctl enable nginx --now

    # 查看 Nginx 服务当前运行状态
    # systemctl status     查看服务状态
    # --no-pager           不分页显示(直接输出全部信息,不卡住等待)
    systemctl status nginx --no-pager

    # 自定义 Nginx 欢迎页面
    # 覆盖写入默认首页文件 /usr/share/nginx/html/index.html
    # 内容:Welcome to IT-HeiMa
    echo "Welcome to IT-HeiMa" > /usr/share/nginx/html/index.html

    # 输出提示:Nginx 安装、启动、配置全部完成
    echo "Nginx安装并配置完成"
}

(10) 配置静态IP模块 (**configure_static_ip.sh**)

[root@hab1 /shell/server_init]# vim configure_static_ip.sh
[root@hab1 /shell/server_init]# cat configure_static_ip.sh
#!/bin/bash
# 配置静态IP
# 这里直接调用主脚本中的 get_active_interface 函数
configure_static_ip() {
iface=$(get_active_interface)
echo "检测到主网卡:$iface"

read -p "请输入静态IP地址: " static_ip
while ! [[ "$static_ip" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; do
    echo "无效的IP,请重新输入"
    read -p "请输入静态IP地址: " static_ip
done

read -p "请输入子网掩码(如24): " netmask
read -p "请输入网关(如192.168.80.2): " gateway

if [ -f /tmp/dns_list.txt ]; then
    IFS=',' read -r dns1 dns2 < /tmp/dns_list.txt
else
    dns1="114.114.114.114"
    dns2="8.8.8.8"
fi

config_file="/etc/NetworkManager/system-connections/$iface.nmconnection"
cat > "$config_file" <<EOF
[connection]
id=$iface
uuid=$(uuidgen)
type=ethernet
interface-name=$iface
autoconnect-priority=-999

[ipv4]
address1=$static_ip/$netmask,$gateway
method=manual
dns=$dns1,$dns2

[ipv6]
method=disabled
EOF

chmod 600 "$config_file"
systemctl restart NetworkManager
echo "静态IP配置完成"
}

脚本说明

#!/bin/bash

# 函数名:configure_static_ip
# 功能:自动为服务器配置【静态IP地址】(固定IP,重启不丢失)
# 作用:将动态获取的DHCP IP改为手动设置的固定IP,方便远程连接
# 依赖:需要调用前面定义的 get_active_interface 函数获取网卡名
configure_static_ip() {
    # 调用函数获取当前【正在使用的网卡名称】(如 ens33、eth0)
    # 结果存入变量 iface
    iface=$(get_active_interface)
    
    # 输出提示:告诉用户检测到的网卡
    echo "检测到主网卡:$iface"

    # ---------------------- 1. 获取并校验静态IP ----------------------
    # 提示用户输入静态IP地址
    read -p "请输入静态IP地址: " static_ip
    
    # IP地址格式校验循环
    # 正则表达式:^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$
    # 作用:判断输入内容是否符合 0-999.0-999.0-999.0-999 的IP格式
    while ! [[ "$static_ip" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; do
        # 如果格式错误,提示重新输入
        echo "无效的IP,请重新输入"
        read -p "请输入静态IP地址: " static_ip
    done

    # ---------------------- 2. 获取子网掩码和网关 ----------------------
    # 提示输入子网掩码(通常输入 24,代表 255.255.255.0)
    read -p "请输入子网掩码(如24): " netmask
    
    # 提示输入网关地址(路由器/虚拟机网关)
    read -p "请输入网关(如192.168.80.2): " gateway

    # ---------------------- 3. 读取之前配置的DNS ----------------------
    # 判断文件 /tmp/dns_list.txt 是否存在
    # 这个文件是上一步 configure_dns 函数生成的
    if [ -f /tmp/dns_list.txt ]; then
        # IFS=',' :指定分隔符为逗号
        # 读取文件内容,按逗号分割,分别赋值给 dns1 和 dns2
        IFS=',' read -r dns1 dns2 < /tmp/dns_list.txt
    else
        # 如果文件不存在(没配置过DNS),则使用默认公共DNS
        dns1="114.114.114.114"
        dns2="8.8.8.8"
    fi

    # ---------------------- 4. 定义网卡配置文件路径 ----------------------
    # CentOS Stream 9 系统网卡配置文件存放路径
    config_file="/etc/NetworkManager/system-connections/$iface.nmconnection"

    # ---------------------- 5. 写入静态IP配置文件 ----------------------
    # 覆盖写入配置文件内容
    cat > "$config_file" <<EOF
[connection]
id=$iface                  # 连接ID(和网卡名一致)
uuid=$(uuidgen)            # 自动生成唯一UUID(系统必需)
type=ethernet              # 网络类型:以太网
interface-name=$iface      # 绑定的物理网卡
autoconnect-priority=-999  # 自动连接优先级

[ipv4]                     # IPv4配置
address1=$static_ip/$netmask,$gateway  # IP/掩码,网关
method=manual              # 手动设置(静态IP)
dns=$dns1,$dns2            # DNS服务器地址

[ipv6]                     # IPv6配置
method=disabled            # 禁用IPv6(仅使用IPv4)
EOF

    # ---------------------- 6. 设置文件权限并重启服务 ----------------------
    # 设置配置文件权限为 600(仅root可读写,NetworkManager要求)
    chmod 600 "$config_file"
    
    # 重启网络管理服务,让静态IP配置立即生效
    systemctl restart NetworkManager

    # 输出提示:配置完成
    echo "静态IP配置完成"
}

3.3 说明

  • 每个模块:每个功能都被独立拆分到单独的脚本中,便于管理和调试。
  • 主脚本:server_init.sh 通过 source 引入所有模块,并根据用户选择调用相应的模块。
  • 可维护性:模块化后,修改某个功能模块时不会影响其他功能,方便日后的扩展。

3.4 使用方法

  1. 将所有模块脚本(如 optimize_system.sh、configure_aliyun_repo.sh 等)和 server_init.sh 放在同一目录下。
  2. 运行主脚本:
chmod +x *.sh # 给所有的脚本加 x 执行权限
bash main.sh

根据提示输入选项(如 1-10)执行对应的操作。

这样就可以根据需要选择不同的操作,并灵活地管理 Linux 系统的初始化配置。

查看脚本整体结构

[root@hab1 /shell/server_init]# chmod +x *.sh
[root@hab1 /shell/server_init]# ll
总用量 44
-rwxr-xr-x 1 root root  645  4月 13 20:12 configure_aliyun_repo.sh
-rwxr-xr-x 1 root root  492  4月 13 20:10 configure_dns.sh
-rwxr-xr-x 1 root root  386  4月 13 20:15 configure_firewall.sh
-rwxr-xr-x 1 root root  564  4月 13 20:13 configure_ssh.sh
-rwxr-xr-x 1 root root 1037  4月 13 20:20 configure_static_ip.sh
-rwxr-xr-x 1 root root  201  4月 13 20:13 configure_time_sync.sh
-rwxr-xr-x 1 root root  261  4月 13 20:17 install_basic_tools.sh
-rwxr-xr-x 1 root root  198  4月 13 20:17 install_mysql.sh
-rwxr-xr-x 1 root root  260  4月 13 20:19 install_nginx.sh
-rwxr-xr-x 1 root root 2278  4月 13 19:59 main.sh
-rwxr-xr-x 1 root root  418  4月 13 20:09 optimize_system.sh
[root@hab1 /shell/server_init]# tree
.
├── configure_aliyun_repo.sh
├── configure_dns.sh
├── configure_firewall.sh
├── configure_ssh.sh
├── configure_static_ip.sh
├── configure_time_sync.sh
├── install_basic_tools.sh
├── install_mysql.sh
├── install_nginx.sh
├── main.sh
└── optimize_system.sh

0 directories, 11 files

执行所有模块功能:

打包发送给新服务器运行

[root@hab3 /shell/server_init]# ./main.sh
请选择操作:
0. 执行所有操作
1. 优化Linux系统
2. 配置DNS
3. 配置阿里云源
4. 配置SSH
5. 配置时间同步
6. 配置防火墙
7. 安装常用工具
8. 安装MySQL
9. 安装Nginx
10. 配置静态IP
请输入选项(0-10): 0
正在执行所有操作...
优化Linux系统...
Linux系统优化完成
配置DNS...

默认主DNS:114.114.114.114
默认备用DNS:8.8.8.8

请输入主DNS(直接回车使用默认):
请输入备用DNS(直接回车使用默认):
DNS配置完成,主DNS:114.114.114.114,备用DNS:8.8.8.8
配置阿里云源...
阿里云源配置完成
配置SSH...
请输入SSH端口(默认22):
SSH配置完成,当前端口:22
配置时间同步...
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^? ntp7.flashdance.cx            2   6     1     1    +29ms[  +29ms] +/-  108ms
^? a.chl.la                      2   6     1     1  -3106us[-3106us] +/-  100ms
^? 139.199.214.202               2   6     1     1  +4696us[+4696us] +/-   80ms
^? time.cloudflare.com           0   6     0     -     +0ns[   +0ns] +/-    0ns
时间同步配置完成
配置防火墙...
防火墙配置完成
安装常用工具...
常用工具安装完成
安装MySQL...
Created symlink /etc/systemd/system/multi-user.target.wants/mysqld.service → /usr/lib/systemd/system/mysqld.service.
● mysqld.service - MySQL 8.0 database server
     Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; preset: disabled)
     Active: active (running) since Mon 2026-04-13 20:36:51 CST; 9ms ago
    Process: 26738 ExecStartPre=/usr/libexec/mysql-check-socket (code=exited, status=0/SUCCESS)
    Process: 26760 ExecStartPre=/usr/libexec/mysql-prepare-db-dir mysqld.service (code=exited, status=0/SUCCESS)
   Main PID: 26834 (mysqld)
     Status: "Server is operational"
      Tasks: 38 (limit: 10867)
     Memory: 458.1M
        CPU: 2.437s
     CGroup: /system.slice/mysqld.service
             └─26834 /usr/libexec/mysqld --basedir=/usr

4月 13 20:36:47 hab3 systemd[1]: Starting MySQL 8.0 database server...
4月 13 20:36:47 hab3 mysql-prepare-db-dir[26760]: Initializing MySQL database
4月 13 20:36:51 hab3 systemd[1]: Started MySQL 8.0 database server.
MySQL安装完成
安装Nginx...
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
● nginx.service - The nginx HTTP and reverse proxy server
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: disabled)
     Active: active (running) since Mon 2026-04-13 20:36:55 CST; 12ms ago
    Process: 28205 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
    Process: 28221 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
    Process: 28242 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
   Main PID: 28262 (nginx)
      Tasks: 3 (limit: 10867)
     Memory: 3.0M
        CPU: 29ms
     CGroup: /system.slice/nginx.service
             ├─28262 "nginx: master process /usr/sbin/nginx"
             ├─28263 "nginx: worker process"
             └─28264 "nginx: worker process"

4月 13 20:36:55 hab3 systemd[1]: Starting The nginx HTTP and reverse proxy…r...
4月 13 20:36:55 hab3 nginx[28221]: nginx: the configuration file /etc/ngin…s ok
4月 13 20:36:55 hab3 nginx[28221]: nginx: configuration file /etc/nginx/ng…sful
4月 13 20:36:55 hab3 systemd[1]: Started The nginx HTTP and reverse proxy …ver.
Hint: Some lines were ellipsized, use -l to show in full.
Nginx安装并配置完成
检测到主网卡:ens160
请输入静态IP地址: 192.168.80.13
请输入子网掩码(如24): 24
请输入网关(如192.168.80.2): 192.168.80.2
静态IP配置完成

验证结果

[root@hab3 /shell/server_init]# date
2026年 04月 13日 星期一 20:38:20 CST
[root@hab3 /shell/server_init]# getenforce
Permissive
[root@hab3 /shell/server_init]# cat /etc/resolv.conf
nameserver 114.114.114.114
nameserver 8.8.8.8
[root@hab3 /shell/server_init]#  cat /etc/NetworkManager/system-connections/ens160.nmconnection
[connection]
id=ens160
uuid=78d75b11-2bc1-4119-be8a-6f83690510a7
type=ethernet
interface-name=ens160
autoconnect-priority=-999

[ipv4]
address1=192.168.80.13/24,192.168.80.2
method=manual
dns=114.114.114.114,8.8.8.8

[ipv6]
method=disabled
[root@hab3 /shell/server_init]#

4. 总结

4.1 核心知识点回顾

通过本节内容的学习,掌握了以下关键技能:

  • Shell 模块化编程:将复杂的脚本任务拆分为多个可复用、易于维护的小模块。每个模块负责一个明确的功能,主脚本统一调用它们。
  • 函数与文件模块化:学会了如何通过函数和独立脚本文件来组织和管理不同的功能。函数模块化适用于较小的脚本文件,文件模块化则适合更复杂的任务。
  • 自动化脚本系统:结合不同的模块,构建了一个完整的自动化系统,例如 Linux 系统的初始化、巡检等任务。
  • 错误处理与调试技巧:了解如何提高脚本的鲁棒性,包括错误捕获、调试和日志输出。

4.2 实战价值

本节所学的模块化编程思想在实际运维工作中有广泛的应用,特别是在以下场景:

  • Linux 主机初始化:帮助快速配置和初始化新部署的 Linux 服务器,确保环境的一致性。
  • 企业环境系统巡检:能够定期检查系统健康状态、资源使用情况,及时发现潜在问题。
  • 自动化运维/DevOps 流程:提高运维自动化水平,减少手动操作,提高工作效率。
  • 云主机批量检测与配置:适用于云平台上多个虚拟机实例的管理和配置,节省时间和成本。
  • 教学与实训环境:为培训学员提供一个易于理解和操作的脚本框架,帮助学习自动化运维。

4.3 提升方向

要进一步提高脚本的功能和灵活性,可以从以下几个方面进行优化:

  1. 增加错误处理机制:使用 trap 或 exit code 捕获和处理执行中的异常,避免脚本因小错误中断。
  2. 加入日志与报告:将巡检结果输出到日志文件,并设置邮件通知机制,方便运维人员及时了解系统状态。
  3. 支持参数化执行:通过传参控制模块的执行,例如:bash main.sh cpu memory disk,只执行指定模块。
  4. 定时巡检:结合 cron 定时任务实现周期性的巡检脚本自动执行,避免人工干预。
  5. 模块库封装:将常用的功能模块提炼成工具库,方便在不同项目中复用,提高开发效率。

4.4 最终收获

通过本节学习,已经掌握了 Shell 脚本的模块化编程思维,能够:

  • 将复杂的脚本任务拆解成易于维护的独立模块;
  • 使用函数或独立文件构建清晰的脚本结构;
  • 编写可复用、可扩展的自动化运维脚本系统;
  • 理解并实践模块化编程的实际应用,如系统巡检、自动部署等。

模块化不仅仅是“拆分”脚本,更是一种组织结构的思维方式,是让脚本从“能跑”到“能维护”的关键能力。它使得脚本更具灵活性、可扩展性和可维护性,特别适用于团队合作和企业级自动化运维场景。


作业

作业1:扩展系统巡检脚本

任务要求:

在现有的系统巡检脚本基础上,增加3个新功能模块:

  1. 网络信息模块 (network_info.sh):

    1. 显示网络连接数统计(ESTABLISHED、TIME_WAIT等)
    2. 显示网络接口流量统计
[root@hab3 /shell/server_init]# vim network_info.sh
[root@hab3 /shell/server_init]# cat network_info.sh
#!/bin/bash

network_info() {
echo "========== 网络连接状态统计 =========="
# 统计各种连接状态的数量 (使用 ss 命令,效率更高)
if command -v ss &> /dev/null; then
    echo "TCP 连接状态汇总:"
    ss -tna | awk 'NR>1 {state[$1]++} END {for (s in state) print "  " s ": " state[s]}'
else
    # 回退到 netstat
    netstat -tan | awk 'NR>2 {state[$NF]++} END {for (s in state) print "  " s ": " state[s]}'
fi

echo -e "\n========== 网络接口流量统计 =========="
# 读取 /proc/net/dev 获取流量字节数,转换为人类可读格式
cat /proc/net/dev | awk 'NR>2 {
    iface=$1; gsub(/:/, "", iface);
    rx_bytes=$2; tx_bytes=$10;
    printf "%-10s 接收: %10.2f MB\t发送: %10.2f MB\n", iface, rx_bytes/1024/1024, tx_bytes/1024/1024
}'
}
  1. 进程信息模块 (process_info.sh):

    1. 显示僵尸进程数量
    2. 显示系统负载平均值
    3. 显示运行时间最长的前5个进程
[root@hab3 /shell/server_init]# vim process_info.sh
[root@hab3 /shell/server_init]# cat process_info.sh
#!/bin/bash

process_info() {
echo "========== 系统负载与进程信息 =========="

# 僵尸进程数量
zombie_count=$(ps aux | awk '$8=="Z" || $8=="Z+" {count++} END {print count+0}')
echo "僵尸进程数量: $zombie_count"

# 系统负载平均值 (1分钟, 5分钟, 15分钟)
load_avg=$(uptime | awk -F 'load average: ' '{print $2}')
echo "系统负载 (1分钟, 5分钟, 15分钟): $load_avg"

# 运行时间最长的前5个进程 (按累计 CPU 时间排序)
echo -e "\n运行时间最长的前5个进程 (按CPU时间排序):"
ps -eo pid,user,time,comm --sort=-time | head -6 | column -t
}
  1. 日志信息模块 (log_info.sh):

    1. 显示系统启动时间
    2. 显示最近登录用户
    3. 检查磁盘inode使用率
[root@hab3 /shell/server_init]# vim log_info.sh
[root@hab3 /shell/server_init]# cat log_info.sh
#!/bin/bash

log_info() {
echo "========== 系统日志相关信息 =========="

# 系统启动时间
if command -v uptime &> /dev/null; then
    boot_time=$(uptime -s 2>/dev/null)
    if [ -z "$boot_time" ]; then
        # 某些系统 uptime 不支持 -s,回退到 who -b
        boot_time=$(who -b | awk '{print $3, $4}')
    fi
    echo "系统启动时间: $boot_time"
fi

# 最近登录的5个用户
echo -e "\n最近登录的用户 (最后5条):"
last -n 5 2>/dev/null | head -5

# 磁盘 inode 使用率
echo -e "\n磁盘 Inode 使用情况:"
df -i | grep -vE '^Filesystem|tmpfs|udev' | awk '{printf "%-25s 已用: %s/%s (使用率 %s)\n", $1, $3, $2, $5}'
}

要求: 修改主脚本,支持按模块名称选择执行。

[root@hab3 /shell/server_init]# vim main.sh
[root@hab3 /shell/server_init]# cat main.sh
#!/bin/bash

# 引入所有模块(仅加载函数,不执行)
source ./optimize_system.sh
source ./configure_dns.sh
source ./configure_aliyun_repo.sh
source ./configure_ssh.sh
source ./configure_time_sync.sh
source ./configure_firewall.sh
source ./install_basic_tools.sh
source ./install_mysql.sh
source ./install_nginx.sh
source ./configure_static_ip.sh
source ./network_info.sh
source ./process_info.sh
source ./log_info.sh

# 获取主网卡函数
get_active_interface() {
    iface=$(ip route | grep default | awk '{print $5}' | head -n 1)
    [ -z "$iface" ] && iface=$(ip a | grep 'state UP' | awk '{print $2}' | sed 's/://')
    echo "$iface"
}

# 选项菜单(按照图片中的顺序)
echo "请选择操作:"
echo "0. 执行所有操作"
echo "1. 优化Linux系统"
echo "2. 配置DNS"
echo "3. 配置阿里云源"
echo "4. 配置SSH"
echo "5. 配置时间同步"
echo "6. 配置防火墙"
echo "7. 安装常用工具"
echo "8. 安装MySQL"
echo "9. 安装Nginx"
echo "10. 配置静态IP"
echo "11. 网络信息模块"
echo "12. 进程信息模块"
echo "13. 日志信息模块"

# 获取用户输入
read -p "请输入选项(0-13): " choice

# 根据选项执行相应的功能
case $choice in
    0)
        echo "正在执行所有操作..."
        optimize_system
        configure_dns
        configure_aliyun_repo
        configure_ssh
        configure_time_sync
        configure_firewall
        install_basic_tools
        install_mysql
        install_nginx
        configure_static_ip
        network_info
        process_info
        log_info
        ;;
    1)
        echo "正在优化Linux系统..."
        optimize_system
        ;;
    2)
        echo "正在配置DNS..."
        configure_dns
        ;;
    3)
        echo "正在配置阿里云源..."
        configure_aliyun_repo
        ;;
    4)
        echo "正在配置SSH..."
        configure_ssh
        ;;
    5)
        echo "正在配置时间同步..."
        configure_time_sync
        ;;
    6)
        echo "正在配置防火墙..."
        configure_firewall
        ;;
    7)
        echo "正在安装常用工具..."
        install_basic_tools
        ;;
    8)
        echo "正在安装MySQL..."
        install_mysql
        ;;
    9)
        echo "正在安装Nginx..."
        install_nginx
        ;;
    10)
        echo "正在配置静态IP..."
        configure_static_ip
        ;;
    11)
        echo "正在检查网络信息..."
        network_info
        ;;
    12)
        echo "正在查看进程信息..."
        process_info
        ;;
    13)
        echo "日志信息查询中..."
        log_info
        ;;
    *)
        echo "无效选择,请输入0-13之间的数字"
        ;;
esac

运行验证

[root@hab3 /shell/server_init]# ./main.sh
请选择操作:
0. 执行所有操作
1. 优化Linux系统
2. 配置DNS
3. 配置阿里云源
4. 配置SSH
5. 配置时间同步
6. 配置防火墙
7. 安装常用工具
8. 安装MySQL
9. 安装Nginx
10. 配置静态IP
11. 网络信息模块
12. 进程信息模块
13. 日志信息模块
请输入选项(0-13): 11
正在检查网络信息...
========== 网络连接状态统计 ==========
TCP 连接状态汇总:
  LISTEN: 6
  ESTAB: 2

========== 网络接口流量统计 ==========
lo         接收:       0.00 MB  发送:       0.00 MB
ens160     接收:     104.01 MB  发送:       1.96 MB
[root@hab3 /shell/server_init]# ./main.sh
请选择操作:
0. 执行所有操作
1. 优化Linux系统
2. 配置DNS
3. 配置阿里云源
4. 配置SSH
5. 配置时间同步
6. 配置防火墙
7. 安装常用工具
8. 安装MySQL
9. 安装Nginx
10. 配置静态IP
11. 网络信息模块
12. 进程信息模块
13. 日志信息模块
请输入选项(0-13): 12
正在查看进程信息...
========== 系统负载与进程信息 ==========
僵尸进程数量: 0
系统负载 (1分钟, 5分钟, 15分钟): 0.00, 0.00, 0.00

运行时间最长的前5个进程 (按CPU时间排序):
PID    USER   TIME      COMMAND
26834  mysql  00:00:05  mysqld
1      root   00:00:03  systemd
29336  root   00:00:03  kworker/1:0-events
793    root   00:00:02  vmtoolsd
2      root   00:00:00  kthreadd
[root@hab3 /shell/server_init]# ./main.sh
请选择操作:
0. 执行所有操作
1. 优化Linux系统
2. 配置DNS
3. 配置阿里云源
4. 配置SSH
5. 配置时间同步
6. 配置防火墙
7. 安装常用工具
8. 安装MySQL
9. 安装Nginx
10. 配置静态IP
11. 网络信息模块
12. 进程信息模块
13. 日志信息模块
请输入选项(0-13): 13
日志信息查询中...
========== 系统日志相关信息 ==========
系统启动时间: 2026-04-13 20:04:18

最近登录的用户 (最后5条):
root     pts/1        192.168.80.11    Mon Apr 13 20:05 - 20:06  (00:00)
root     pts/0        192.168.80.1     Mon Apr 13 20:04   still logged in
reboot   system boot  5.14.0-511.el9.x Mon Apr 13 20:04   still running
root     pts/0        192.168.80.1     Mon Apr 13 20:02 - 20:04  (00:01)
reboot   system boot  5.14.0-511.el9.x Mon Apr 13 20:02 - 20:04  (00:02)

磁盘 Inode 使用情况:
文件系统                      已用: 已用(I)/Inodes (使用率 已用(I)%)
efivarfs                  已用: 0/0 (使用率 -)
/dev/mapper/cs-root       已用: 91759/24324096 (使用率 1%)
/dev/nvme0n1p2            已用: 22/524288 (使用率 1%)
/dev/nvme0n1p1            已用: 0/0 (使用率 -)
[root@hab3 /shell/server_init]#

作业2:优化初始化脚本

任务要求:

改进现有的Linux初始化脚本:

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

    1. 收集硬件信息(CPU型号、内存大小、磁盘容量)
    2. 收集系统版本和内核信息
    3. 生成系统信息报告文件
[root@hab3 /shell/server_init]# vim system_info.sh
[root@hab3 /shell/server_init]# cat system_info.sh
#!/bin/bash
# 文件名: system_info.sh
# 描述: 收集系统硬件、版本信息并生成报告
system_info() {
REPORT_DIR="/var/log/sysinfo"
REPORT_FILE="${REPORT_DIR}/system_report_$(date +%Y%m%d_%H%M%S).txt"

# 创建报告目录
mkdir -p "$REPORT_DIR"

# 清空/初始化报告文件
{
    echo "==============================================="
    echo "       系统初始化信息报告"
    echo "       生成时间: $(date)"
    echo "==============================================="
    echo ""

    # --- 1. 系统版本与内核 ---
    echo "---------- 操作系统版本 ----------"
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        echo "发行版名称: $NAME $VERSION"
    elif [ -f /etc/redhat-release ]; then
        echo "发行版: $(cat /etc/redhat-release)"
    else
        echo "未知发行版"
    fi
    echo "内核版本: $(uname -r)"
    echo "系统架构: $(uname -m)"
    echo ""

    # --- 2. CPU 信息 ---
    echo "---------- CPU 信息 ----------"
    CPU_MODEL=$(grep -m 1 "model name" /proc/cpuinfo | cut -d ':' -f2 | sed 's/^[ \t]*//')
    CPU_CORES=$(grep -c "^processor" /proc/cpuinfo)
    echo "型号: $CPU_MODEL"
    echo "核心数: $CPU_CORES"
    echo ""

    # --- 3. 内存信息 ---
    echo "---------- 内存信息 ----------"
    MEM_TOTAL_KB=$(grep "MemTotal" /proc/meminfo | awk '{print $2}')
    MEM_TOTAL_GB=$(echo "scale=2; $MEM_TOTAL_KB/1024/1024" | bc 2>/dev/null || awk -v mem="$MEM_TOTAL_KB" 'BEGIN {printf "%.2f", mem/1024/1024}')
    echo "总内存: ${MEM_TOTAL_GB} GB"
    echo ""

    # --- 4. 磁盘容量 ---
    echo "---------- 磁盘及分区容量 ----------"
    # 列出物理块设备(排除loop、ram等)
    lsblk -d -o NAME,SIZE,TYPE | grep -E "disk" | while read line; do
        echo "$line"
    done
    echo ""
    echo "分区挂载及使用情况:"
    df -h --exclude-type=tmpfs --exclude-type=devtmpfs | column -t
    echo ""

    echo "报告已生成: $REPORT_FILE"
} | tee "$REPORT_FILE"
}
[root@hab3 /shell/server_init]# ./main.sh
请选择操作:
0. 执行所有操作
1. 优化Linux系统
2. 配置DNS
3. 配置阿里云源
4. 配置SSH
5. 配置时间同步
6. 配置防火墙
7. 安装常用工具
8. 安装MySQL
9. 安装Nginx
10. 配置静态IP
11. 网络信息模块
12. 进程信息模块
13. 日志信息模块
14. 系统信息收集
请输入选项(0-14): 14
系统信息收集中...
===============================================
       系统初始化信息报告
       生成时间: 2026年 04月 13日 星期一 21:47:25 CST
===============================================

---------- 操作系统版本 ----------
发行版名称: CentOS Stream 9
内核版本: 5.14.0-511.el9.x86_64
系统架构: x86_64

---------- CPU 信息 ----------
型号: Intel(R) Core(TM) i5-8265U CPU @ 1.60GHz
核心数: 2

---------- 内存信息 ----------
总内存: 1.70 GB

---------- 磁盘及分区容量 ----------
nvme0n1   50G disk

分区挂载及使用情况:
文件系统             容量  已用  可用  已用%  挂载点
efivarfs             256K  54K   198K  22%    /sys/firmware/efi/efivars
/dev/mapper/cs-root  47G   3.6G  43G   8%     /
/dev/nvme0n1p2       960M  226M  735M  24%    /boot
/dev/nvme0n1p1       599M  7.5M  592M  2%     /boot/efi

报告已生成: /var/log/sysinfo/system_report_20260413_214725.txt

[root@hab3 /shell/server_init]# cat /var/log/sysinfo/system_report_20260413_214725.txt
===============================================
       系统初始化信息报告
       生成时间: 2026年 04月 13日 星期一 21:47:25 CST
===============================================

---------- 操作系统版本 ----------
发行版名称: CentOS Stream 9
内核版本: 5.14.0-511.el9.x86_64
系统架构: x86_64

---------- CPU 信息 ----------
型号: Intel(R) Core(TM) i5-8265U CPU @ 1.60GHz
核心数: 2

---------- 内存信息 ----------
总内存: 1.70 GB

---------- 磁盘及分区容量 ----------
nvme0n1   50G disk

分区挂载及使用情况:
文件系统             容量  已用  可用  已用%  挂载点
efivarfs             256K  54K   198K  22%    /sys/firmware/efi/efivars
/dev/mapper/cs-root  47G   3.6G  43G   8%     /
/dev/nvme0n1p2       960M  226M  735M  24%    /boot
/dev/nvme0n1p1       599M  7.5M  592M  2%     /boot/efi

报告已生成: /var/log/sysinfo/system_report_20260413_214725.txt
  1. 增强服务状态检查:

    1. 检查关键服务运行状态(sshd、crond、network等)
    2. 检查系统资源使用趋势
[root@hab3 /shell/server_init]# cat system_check.sh
#!/bin/bash
# ===================================================================
# 脚本名称: system_check.sh
# 功能描述: CentOS 9 服务状态检查 & 系统资源使用趋势查看
# 使用方法: 直接执行脚本或 source 后调用 check_system 函数
# ===================================================================

# -------------------------- 全局配置 --------------------------
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

SERVICES=("sshd" "crond" "NetworkManager")

# -------------------------- 主检查函数 --------------------------
check_system() {
    # 内部辅助函数:检查单个服务状态
    _check_service() {
        local service=$1
        if systemctl is-active --quiet "$service"; then
            echo -e "${GREEN}[ ACTIVE ]${NC}   $service"
        else
            echo -e "${RED}[ INACTIVE ]${NC} $service"
        fi
    }

    # 输出分割线
    _print_header() {
        echo ""
        echo "========================================"
        echo "    $1"
        echo "========================================"
    }

    # ---------- 1. 服务状态检查 ----------
    _print_header "CentOS 9 服务状态检查"

    for svc in "${SERVICES[@]}"; do
        _check_service "$svc"
    done

    # 兼容检查传统 network 服务
    if systemctl list-unit-files 2>/dev/null | grep -q "^network.service"; then
        _check_service "network"
    fi

    # ---------- 2. 系统资源趋势检查 ----------
    _print_header "系统资源使用趋势"

    # 检查 sar 命令是否可用
    if ! command -v sar &> /dev/null; then
        echo -e "${YELLOW}警告: 'sar' 命令未找到。${NC}"
        echo "请执行以下命令安装 sysstat 包以获取详细历史趋势:"
        echo "    sudo dnf install sysstat -y"
        echo "    sudo systemctl enable --now sysstat"
        echo ""
        echo "当前使用基础命令展示即时状态:"
        echo "----------------------------------------"
        echo ">> 系统负载 (1, 5, 15分钟):"
        uptime
        echo ""
        echo ">> CPU 和内存概况 (top):"
        top -bn1 | head -15
        echo ""
        echo ">> 内存使用详情:"
        free -h
        echo ""
        echo ">> 磁盘使用情况:"
        df -h
        echo ""
        echo ">> 简短资源采样 (vmstat 2次):"
        vmstat 2 2
        return 0
    fi

    # 获取今日 sa 数据文件
    TODAY=$(date +%d)
    SA_FILE="/var/log/sa/sa$TODAY"

    if [ ! -f "$SA_FILE" ]; then
        echo -e "${YELLOW}注意: 今日的系统活动数据文件 ($SA_FILE) 尚未生成。${NC}"
        echo "这可能是因为 sysstat 服务刚启动或尚未到数据收集时间。"
        echo "以下将显示当前实时采样数据:"
        echo "----------------------------------------"
        echo ">> 实时 CPU 使用率 (1秒采样):"
        sar -u 1 1 2>/dev/null | tail -5
        echo ""
        echo ">> 实时内存使用:"
        sar -r 1 1 2>/dev/null | tail -5
        echo ""
        echo ">> 系统负载:"
        uptime
        return 0
    fi

    # 显示历史趋势数据
    echo ">> CPU 使用率趋势 (今日按小时统计,最近20条):"
    sar -u -f "$SA_FILE" 2>/dev/null | tail -20
    echo ""

    echo ">> 内存使用趋势 (今日按小时统计,最近20条):"
    sar -r -f "$SA_FILE" 2>/dev/null | tail -20
    echo ""

    echo ">> 磁盘 I/O 趋势 (今日按小时统计,最近20条):"
    sar -b -f "$SA_FILE" 2>/dev/null | tail -20
    echo ""

    # 实时采样补充
    echo ">> 当前实时 CPU 采样 (1秒):"
    sar -u 1 1 2>/dev/null | tail -5
    echo ""

    echo ">> 系统负载平均值:"
    uptime
}

# -------------------------- 函数调用 --------------------------
# 如果脚本被直接执行(而非被 source),则自动调用检查函数
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
    check_system
fi


[root@hab3 /shell/server_init]# ./main.sh
请选择操作:
0. 执行所有操作
1. 优化Linux系统
2. 配置DNS
3. 配置阿里云源
4. 配置SSH
5. 配置时间同步
6. 配置防火墙
7. 安装常用工具
8. 安装MySQL
9. 安装Nginx
10. 配置静态IP
11. 网络信息模块
12. 进程信息模块
13. 日志信息模块
14. 系统信息收集
15. 服务状态与资源趋势
请输入选项(0-15): 15
服务状态与资源趋势...

========================================
    CentOS 9 服务状态检查
========================================
[ ACTIVE ]   sshd
[ ACTIVE ]   crond
[ ACTIVE ]   NetworkManager

========================================
    系统资源使用趋势
========================================
警告: 'sar' 命令未找到。
请执行以下命令安装 sysstat 包以获取详细历史趋势:
    sudo dnf install sysstat -y
    sudo systemctl enable --now sysstat

当前使用基础命令展示即时状态:
----------------------------------------
>> 系统负载 (1, 5, 15分钟):
 22:27:34 up  2:23,  1 user,  load average: 0.00, 0.00, 0.00

>> CPU 和内存概况 (top):
top - 22:27:34 up  2:23,  1 user,  load average: 0.00, 0.00, 0.00
Tasks: 219 total,   1 running, 218 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  3.1 sy,  0.0 ni, 96.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   1741.3 total,    286.6 free,    845.7 used,    778.7 buff/cache
MiB Swap:   2064.0 total,   2063.7 free,      0.2 used.    895.6 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      1 root      20   0  176076  18848  10856 S   0.0   1.1   0:04.33 systemd
      2 root      20   0       0      0      0 S   0.0   0.0   0:00.02 kthreadd
      3 root      20   0       0      0      0 S   0.0   0.0   0:00.00 pool_wo+
      4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker+
      5 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker+
      6 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker+
      7 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker+
      9 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker+

>> 内存使用详情:
               total        used        free      shared  buff/cache   available
Mem:           1.7Gi       845Mi       286Mi       5.0Mi       778Mi       895Mi
Swap:          2.0Gi       0.0Ki       2.0Gi

>> 磁盘使用情况:
文件系统             容量  已用  可用 已用% 挂载点
devtmpfs             4.0M     0  4.0M    0% /dev
tmpfs                871M     0  871M    0% /dev/shm
tmpfs                349M  5.2M  344M    2% /run
efivarfs             256K   54K  198K   22% /sys/firmware/efi/efivars
/dev/mapper/cs-root   47G  3.6G   43G    8% /
/dev/nvme0n1p2       960M  226M  735M   24% /boot
/dev/nvme0n1p1       599M  7.5M  592M    2% /boot/efi
tmpfs                175M  4.0K  175M    1% /run/user/0

>> 简短资源采样 (vmstat 2次):
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0    256 293440   3808 793708    0    0    21    54  116  202  0  1 99  0  0
 0  0    256 293440   3808 793808    0    0     0     0  229  408  0  0 100  0  0
  1. 改进配置验证:

    1. 验证DNS配置是否生效
[root@hab3 /shell/server_init]# vim configure_dns.sh
[root@hab3 /shell/server_init]# cat configure_dns.sh
#!/bin/bash
# 配置DNS
configure_dns() {
echo "配置DNS..."
echo
echo "默认主DNS:114.114.114.114"
echo "默认备用DNS:8.8.8.8"
echo
read -p "请输入主DNS(直接回车使用默认): " dns1
dns1=${dns1:-114.114.114.114}
read -p "请输入备用DNS(直接回车使用默认): " dns2
dns2=${dns2:-8.8.8.8}
cat > /etc/resolv.conf <<EOF
nameserver $dns1
nameserver $dns2
EOF
echo "$dns1,$dns2" > /tmp/dns_list.txt
echo "DNS配置完成,主DNS:$dns1,备用DNS:$dns2"

echo "========== DNS 配置验证 =========="

# 获取当前 DNS 服务器地址
DNS_SERVERS=$(grep -E "^nameserver" /etc/resolv.conf | awk '{print $2}' | head -2)
if [ -z "$DNS_SERVERS" ]; then
    echo "警告: 未在 /etc/resolv.conf 中找到 nameserver 配置"
else
    echo "DNS 服务器:"
    echo "$DNS_SERVERS"
    # 测试解析
    TEST_DOMAIN="www.baidu.com"
    if command -v nslookup &>/dev/null; then
        if nslookup "$TEST_DOMAIN" >/dev/null 2>&1; then
            echo "✓ DNS 解析正常 (测试域名: $TEST_DOMAIN)"
        else
            echo "✗ DNS 解析失败"
        fi
    elif command -v dig &>/dev/null; then
        if dig +short "$TEST_DOMAIN" >/dev/null 2>&1; then
            echo "✓ DNS 解析正常 (测试域名: $TEST_DOMAIN)"
        else
            echo "✗ DNS 解析失败"
        fi
    else
        echo "未找到 nslookup/dig 命令,跳过解析测试"
    fi
fi
}

[root@hab3 /shell/server_init]# ./main.sh
请选择操作:
0. 执行所有操作
1. 优化Linux系统
2. 配置DNS
3. 配置阿里云源
4. 配置SSH
5. 配置时间同步
6. 配置防火墙
7. 安装常用工具
8. 安装MySQL
9. 安装Nginx
10. 配置静态IP
11. 网络信息模块
12. 进程信息模块
13. 日志信息模块
14. 系统信息收集
请输入选项(0-14): 2
正在配置DNS...
配置DNS...

默认主DNS:114.114.114.114
默认备用DNS:8.8.8.8

请输入主DNS(直接回车使用默认): 192.168.80.2
请输入备用DNS(直接回车使用默认): 114.114.114.114
DNS配置完成,主DNS:192.168.80.2,备用DNS:114.114.114.114
========== DNS 配置验证 ==========
DNS 服务器:
192.168.80.2
114.114.114.114
✓ DNS 解析正常 (测试域名: www.baidu.com)
    1. 验证时间同步是否正常
[root@hab3 /shell/server_init]# vim configure_time_sync.sh
[root@hab3 /shell/server_init]# cat configure_time_sync.sh
#!/bin/bash
# 配置时间同步
configure_time_sync() {
echo "配置时间同步..."
yum install -y chrony &>/dev/null
systemctl enable chronyd --now
chronyc sources
echo "时间同步配置完成"
echo "当前系统时间:$(date)"
}

[root@hab3 /shell/server_init]# ./main.sh
请选择操作:
0. 执行所有操作
1. 优化Linux系统
2. 配置DNS
3. 配置阿里云源
4. 配置SSH
5. 配置时间同步
6. 配置防火墙
7. 安装常用工具
8. 安装MySQL
9. 安装Nginx
10. 配置静态IP
11. 网络信息模块
12. 进程信息模块
13. 日志信息模块
14. 系统信息收集
请输入选项(0-14): 5
正在配置时间同步...
配置时间同步...
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^- ntp7.flashdance.cx            2   9   377   322  -1641us[-1641us] +/-  136ms
^- a.chl.la                      2   9   365   389   -251us[ -251us] +/-  102ms
^* 139.199.214.202               2   9   377   397   -836us[-1161us] +/-   65ms
^- time.cloudflare.com           3   8   377   190  -5526us[-5526us] +/-  102ms
时间同步配置完成
当前系统时间:2026年 04月 13日 星期一 21:25:49 CST
    1. 验证防火墙规则
[root@hab3 /shell/server_init]# vim configure_firewall.sh
[root@hab3 /shell/server_init]# cat configure_firewall.sh
#!/bin/bash
# 配置防火墙
configure_firewall() {
echo "配置防火墙..."
systemctl stop firewalld &>/dev/null
systemctl disable firewalld &>/dev/null
iptables -F; iptables -t nat -F
iptables -P INPUT ACCEPT; iptables -P FORWARD ACCEPT
echo 1 > /proc/sys/net/ipv4/ip_forward
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p >/dev/null 2>&1
echo "防火墙配置完成"
echo "重启防火墙 $(systemctl restart firewalld &>/dev/null)"
echo "查看防火墙规则 $(firewall-cmd --list-all)"
echo "INPUT 链规则概览:"
    iptables -L INPUT -n --line-numbers | head
echo "FORWARD 链规则概览:"
    iptables -L FORWARD -n --line-numbers | head
echo "IP 转发状态"
if [[ $(cat /proc/sys/net/ipv4/ip_forward) -eq 1 ]]; then
    echo "  ✅ 内核 IP 转发已开启"
else
    echo "  ❌ 警告: 内核 IP 转发未开启"
fi
}

[root@hab3 /shell/server_init]# ./main.sh
请选择操作:
0. 执行所有操作
1. 优化Linux系统
2. 配置DNS
3. 配置阿里云源
4. 配置SSH
5. 配置时间同步
6. 配置防火墙
7. 安装常用工具
8. 安装MySQL
9. 安装Nginx
10. 配置静态IP
11. 网络信息模块
12. 进程信息模块
13. 日志信息模块
14. 系统信息收集
请输入选项(0-14): 6
正在配置防火墙...
配置防火墙...
防火墙配置完成
重启防火墙
查看防火墙规则 public
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: cockpit dhcpv6-client ssh
  ports:
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
INPUT 链规则概览:
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
FORWARD 链规则概览:
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
IP 转发状态
  ✅ 内核 IP 转发已开启

要求: 确保脚本能够全面反映系统状态。