批量SCP文件到多个主机shell脚本
本脚本可以将文件或者目录同步至多台主机
需要一个配置文件里面定义主机IP和密码
脚本会忽略密钥错误等信息,无需进行处理
配置文件格式:
#IP地址 密码
192.168.1.1 12345678
172.1.1.1 1231231
#井号后面的是注释会忽略,IP和密码之间可以用任意数量空格进行分割之后需要在脚本中定义配置文件位置
脚本内容:
#!/bin/bash
# 配置文件路径
CONFIG_FILE="/home/root/Desktop/hosts.conf"
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m'
# 交互式输入
read -p "请输入本地文件或目录路径: " local_path
read -p "请输入远程用户名: " remote_user
read -p "请输入远程目录路径: " remote_path
# 验证本地路径
if [ ! -e "$local_path" ]; then
echo -e "${RED}错误:本地路径 $local_path 不存在${NC}"
exit 1
fi
# 读取配置文件并同步
echo -e "\n开始同步文件..."
echo "本地路径: $local_path"
echo "远程用户: $remote_user"
echo "远程路径: $remote_path"
echo "----------------------------------------"
success_count=0
fail_count=0
total_count=0
while IFS= read -r line; do
# 跳过注释、空行和第一行
[[ "$line" =~ ^# || -z "$line" || $total_count -eq 0 ]] && { total_count=$((total_count + 1)); continue; }
# 分割IP和密码
read -r ip password _ <<< "$line"
if [ -z "$ip" ] || [ -z "$password" ]; then
echo -e "${RED}无效行: $line${NC}"
continue
fi
echo -n "同步到 $ip... "
# 使用更完善的SSH选项
sshpass -p "$password" scp \
-o StrictHostKeyChecking=no \
-o UserKnownHostsFile=/dev/null \
-o ConnectTimeout=10 \
-o PasswordAuthentication=yes \
-o PubkeyAuthentication=no \
-r "$local_path" "$remote_user@$ip:$remote_path"
if [ $? -eq 0 ]; then
echo -e "${GREEN}成功${NC}"
success_count=$((success_count + 1))
else
echo -e "${RED}失败${NC}"
fail_count=$((fail_count + 1))
fi
done < "$CONFIG_FILE"
# 显示结果
echo "----------------------------------------"
echo "同步完成"
echo "成功: $success_count"
echo "失败: $fail_count"
echo "总计: $((success_count + fail_count))"说谢谢了吗?