怎么用 Shell 脚本批量初始化 Linux 服务器环境?

文章导读
使用 Shell 脚本批量初始化 Linux 服务器适合同构集群环境,核心在于标准化安全策略、系统参数和基础工具。必须在执行前确保 SSH 连通性,脚本需具备权限检查、系统版本兼容性及回滚意识,严禁在生产环境无差别关闭防火墙。
📋 目录
  1. 核心初始化脚本(增强版)
  2. 批量执行方案
  3. 验证方法
  4. 常见坑与排查
A A

使用 Shell 脚本批量初始化 Linux 服务器适合同构集群环境,核心在于标准化安全策略、系统参数和基础工具。必须在执行前确保 SSH 连通性,脚本需具备权限检查、系统版本兼容性及回滚意识,严禁在生产环境无差别关闭防火墙。

先说结论:Shell 脚本能显著降低重复配置成本,但必须增强脚本健壮性并配合批量分发工具。

  • 适合:同构服务器集群(如均为 CentOS 7+ 或 Ubuntu 20.04+)的批量部署
  • 关键改进:脚本需包含 Root 权限检查、系统版本判断、chrony 替代 ntpdate、防火墙策略而非直接关闭
  • 批量执行:结合 ssh 循环、pssh 或 ansible 实现多机并发执行
  • 验收:逐台验证时间同步、安全策略生效情况及业务端口连通性

核心初始化脚本(增强版)

以下脚本增加了权限校验、系统版本识别及安全策略优化,避免盲目执行导致服务中断。

#!/bin/bash
set -e

# 1. 权限检查
if [ "$EUID" -ne 0 ]; then
  echo "错误:请使用 root 权限运行此脚本"
  exit 1
fi

# 2. 系统版本判断
if [ -f /etc/redhat-release ]; then
  PM="yum"
  SERVICE_MGR="systemctl"
elif [ -f /etc/debian_version ]; then
  PM="apt"
  SERVICE_MGR="systemctl"
else
  echo "警告:未识别的操作系统版本,部分命令可能失效"
  PM="unknown"
fi

# 3. 时间与时区同步 (推荐使用 chrony)
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo "Asia/Shanghai" > /etc/timezone
if [ "$PM" == "yum" ]; then
  yum install -y chrony
  systemctl enable chronyd
  systemctl start chronyd
elif [ "$PM" == "apt" ]; then
  apt update
  apt install -y chrony
  systemctl enable chrony
  systemctl start chrony
fi

# 4. 安全策略调整 (SELinux)
# 永久关闭需修改配置文件,仅 setenforce 重启后失效
if [ -f /etc/selinux/config ]; then
  sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
  setenforce 0
  echo "SELinux 已配置为 Disabled (需重启永久生效)"
fi

# 5. 防火墙策略 (严禁生产环境直接关闭)
# 建议开放特定端口,此处仅示例开放 SSH 端口
if command -v firewall-cmd &> /dev/null; then
  firewall-cmd `--permanent` `--add-service`=ssh
  firewall-cmd `--reload`
  echo "防火墙运行中,已开放 SSH 服务"
elif command -v ufw &> /dev/null; then
  ufw allow ssh
  ufw enable
  echo "UFW 已启用并开放 SSH"
else
  echo "未检测到常见防火墙工具,请手动确认安全组策略"
fi

# 6. 系统参数优化 (文件打开数)
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf

# 7. 基础工具安装
if [ "$PM" == "yum" ]; then
  yum install -y vim wget curl net-tools
elif [ "$PM" == "apt" ]; then
  apt install -y vim wget curl net-tools
fi

echo "初始化完成,请重启系统使 SELinux 配置永久生效"

批量执行方案

单机脚本验证无误后,可通过 SSH 循环或并行工具分发执行。以下是基于 SSH 密钥信任的简单批量执行示例。

前提:已配置管理机到所有目标主机的 SSH 免密登录。

怎么用 Shell 脚本批量初始化 Linux 服务器环境?
#!/bin/bash
# hosts.txt 每行一个 IP 地址
HOSTS_FILE="hosts.txt"
SCRIPT_FILE="init.sh"

while read -r IP; do
  echo "正在初始化:$IP"
  # 上传脚本并执行
  scp "$SCRIPT_FILE" "root@$IP:/tmp/"
  ssh "root@$IP" "chmod +x /tmp/init.sh && /tmp/init.sh"
  if [ $? -eq 0 ]; then
    echo "$IP 初始化成功"
  else
    echo "$IP 初始化失败,请检查"
  fi
done < "$HOSTS_FILE"

对于大规模集群,建议使用 psshAnsible 以提高并发效率和错误处理能力。

验证方法

执行完成后,需逐台或通过批量命令验证关键配置是否生效。

  • 时区检查:执行 date,确认显示 CST 时区且时间准确;检查 systemctl status chronyd 服务状态。
  • SELinux 状态:执行 getenforce 返回 Disabled;检查 /etc/selinux/config 配置项是否为 disabled。
  • 文件限制:执行 ulimit -n,确认输出为 65535;注意新登录会话才生效。
  • 防火墙状态:执行 firewall-cmd `--list-services`ufw status,确认 SSH 端口开放且服务运行中。
  • 工具验证:执行 vim `--version`curl `--version` 确认基础工具已安装。

常见坑与排查

  • SSH 锁死风险:修改 SSH 配置(如禁止 root 登录、修改端口)前,务必确认密钥登录可用且新端口在防火墙放行,否则可能导致无法远程连接。
  • SELinux 生效机制:修改 /etc/selinux/config 后通常需重启系统才能永久生效,仅执行 setenforce 0 重启后会还原。
  • 网络中断风险:批量执行防火墙规则时,若规则错误可能导致当前 SSH 会话断开。建议先放行 SSH 端口,再调整其他策略。
  • 内核参数加载:若修改了 sysctl.conf,需执行 sysctl -p 立即生效,否则需重启。
  • 包管理器冲突:脚本中需严格区分 yum/apt,避免在不支持的系统上调用错误命令导致脚本中断(已使用 set -e 防止错误扩散)。

建议参考各发行版官方文档进行参数调优,生产环境操作前务必在测试环境验证。