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 脚本结构
-
模块化设计:每个功能被分离到独立的脚本文件中,主脚本根据用户选择来调用这些模块。
-
功能模块:
-
- 系统优化
- 配置阿里云源
- 配置SSH
- 配置时间同步
- 配置DNS
- 配置防火墙
- 安装常用工具
- 安装MySQL
- 安装Nginx
- 配置静态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 使用方法
- 将所有模块脚本(如
optimize_system.sh、configure_aliyun_repo.sh等)和server_init.sh放在同一目录下。 - 运行主脚本:
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 提升方向
要进一步提高脚本的功能和灵活性,可以从以下几个方面进行优化:
- 增加错误处理机制:使用
trap或exit code捕获和处理执行中的异常,避免脚本因小错误中断。 - 加入日志与报告:将巡检结果输出到日志文件,并设置邮件通知机制,方便运维人员及时了解系统状态。
- 支持参数化执行:通过传参控制模块的执行,例如:
bash main.sh cpu memory disk,只执行指定模块。 - 定时巡检:结合
cron定时任务实现周期性的巡检脚本自动执行,避免人工干预。 - 模块库封装:将常用的功能模块提炼成工具库,方便在不同项目中复用,提高开发效率。
4.4 最终收获
通过本节学习,已经掌握了 Shell 脚本的模块化编程思维,能够:
- 将复杂的脚本任务拆解成易于维护的独立模块;
- 使用函数或独立文件构建清晰的脚本结构;
- 编写可复用、可扩展的自动化运维脚本系统;
- 理解并实践模块化编程的实际应用,如系统巡检、自动部署等。
模块化不仅仅是“拆分”脚本,更是一种组织结构的思维方式,是让脚本从“能跑”到“能维护”的关键能力。它使得脚本更具灵活性、可扩展性和可维护性,特别适用于团队合作和企业级自动化运维场景。
作业
作业1:扩展系统巡检脚本
任务要求:
在现有的系统巡检脚本基础上,增加3个新功能模块:
-
网络信息模块 (
network_info.sh): -
- 显示网络连接数统计(ESTABLISHED、TIME_WAIT等)
- 显示网络接口流量统计
[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
}'
}
-
进程信息模块 (
process_info.sh): -
- 显示僵尸进程数量
- 显示系统负载平均值
- 显示运行时间最长的前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
}
-
日志信息模块 (
log_info.sh): -
- 显示系统启动时间
- 显示最近登录用户
- 检查磁盘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初始化脚本:
-
增加系统信息收集模块 (
system_info.sh): -
- 收集硬件信息(CPU型号、内存大小、磁盘容量)
- 收集系统版本和内核信息
- 生成系统信息报告文件
[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
-
增强服务状态检查:
-
- 检查关键服务运行状态(sshd、crond、network等)
- 检查系统资源使用趋势
[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
-
改进配置验证:
-
- 验证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)
-
- 验证时间同步是否正常
[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
-
- 验证防火墙规则
[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 转发已开启
要求: 确保脚本能够全面反映系统状态。