批量同步文件到多个服务器
在 CentOS 环境下,管理 50 台以内服务器,优先推荐
“Rsync+SSH 免密 + Shell 脚本”
方案,兼顾效率、安全性和免费特性,同时操作门槛低、易批量管理。以下是具体方案选择和落地建议:
一、核心方案推荐:Rsync+SSH 免密 + Shell 脚本
1. 方案优势(适配 50 台以内规模)
- 高效性:Rsync 支持增量传输(仅同步变化文件),比 SCP 速度快 30%-50%,尤其适合重复传输场景(如定期更新配置文件)。
- 安全性:基于 SSH 协议加密传输,搭配免密登录(密钥认证),避免密码泄露风险,且无动态代码执行,不会被误判为后门。
- 低成本:CentOS 默认预装 Rsync 和 OpenSSH,无需额外安装软件,完全免费。
- 易批量:通过 Shell 脚本遍历服务器列表,可实现 “一键批量传输”,50 台服务器并行执行仅需几分钟。
2. 落地步骤
步骤 1:配置 SSH 免密登录(关键前提)
# 1. 本地生成SSH密钥对(主控端执行,一路回车,无需设置密码)
ssh-keygen -t ed25519 -C "batch-upload"
# 2. 准备服务器列表文件(servers.txt,格式:IP:端口:用户名:目标路径)
cat > servers.txt << EOF
192.168.1.100:22:root:/data/wwwroot/
192.168.1.101:22:admin:/var/www/
# 此处省略其他48台服务器...
EOF
# 3. 批量分发公钥到目标服务器(首次执行需输入各服务器密码,后续免密)
while IFS=: read ip port user remote_path; do
# 跳过注释行
if [[ $ip =~ ^# ]]; then continue; fi
# 分发公钥(-p指定端口,-o StrictHostKeyChecking=no自动接受主机密钥)
ssh-copy-id -p $port -o StrictHostKeyChecking=no $user@$ip
done < servers.txt
步骤 2:编写批量传输脚本(batch_sync.sh)
#!/bin/bash
# 功能:批量同步本地文件到多台CentOS服务器
# 用法:./batch_sync.sh 本地文件/目录 服务器列表文件
# 检查参数
if [ $# -ne 2 ]; then
echo "用法:$0 本地文件/目录 服务器列表文件"
exit 1
fi
local_source=$1
servers_file=$2
# 检查本地源是否存在
if [ ! -e "$local_source" ]; then
echo "错误:本地源 $local_source 不存在"
exit 1
fi
# 遍历服务器列表并同步
while IFS=: read ip port user remote_path; do
# 跳过注释和空行
if [[ $ip =~ ^# || -z $ip ]]; then continue; fi
echo "=== 开始同步到 $user@$ip:$port ==="
# Rsync命令(-a归档模式,-v详细输出,-z压缩,-e指定SSH端口)
rsync -avz -e "ssh -p $port" "$local_source" "$user@$ip:$remote_path"
# 检查同步结果
if [ $? -eq 0 ]; then
echo -e "✅ 同步成功:$ip\n"
else
echo -e "❌ 同步失败:$ip\n"
# 失败记录到日志(可选)
echo "$(date +'%Y-%m-%d %H:%M:%S') 同步失败:$user@$ip" >> sync_error.log
fi
done < "$servers_file"
echo "批量同步完成!失败记录见 sync_error.log(若有)"
步骤 3:执行批量传输
# 1. 给脚本加执行权限
chmod +x batch_sync.sh
# 2. 执行同步(示例:同步本地test.php到50台服务器的目标路径)
./batch_sync.sh /local/path/test.php servers.txt
# 3. 同步目录(加-r参数,Rsync会自动处理目录,无需额外加-r)
./batch_sync.sh /local/path/config_dir/ servers.txt
默认分类 2025-10-16 12:59:57 通过 网页 浏览(10)
共有0条评论!