ubuntu 向多台主机批量传输文件
前提:
- 主机之间可以相互通信
- 所有主机用户名相同,或开放 ssh root 用户远程连接权限
- 所有主机密码相同,或 root 用户密码相同
- 所有主机开放22端口,或者指定端口
1.安装 sshpass
sudo apt update sudo apt install sshpass
2.准备主机列表文件
创建一个名为 hosts.txt 的文件:
vim hosts.txt
格式如下:
root@10.80.14.10 root@10.80.14.13 root@10.80.14.25 root@10.80.14.28 root@10.80.14.34 root@10.80.14.37 root@10.80.14.40 root@10.80.14.43 root@10.80.14.68 root@10.80.14.72 root@10.80.14.75 root@10.80.14.78 root@10.80.14.81 root@10.80.14.87 root@10.80.14.106 root@10.80.14.110 root@10.80.14.113 root@10.80.14.116 root@10.80.14.122 root@10.80.14.125 root@10.80.14.131 root@10.80.14.140 root@10.80.14.143 root@10.80.14.146
如果没有指定用户名,下面的脚本会默认使用 root 用户。
3.创建一个批处理脚本
#!/bin/bash
# 配置参数
source_path="./talimu/bak_run_docker.sh" # 要传输的源文件/文件夹
dest_path="/home/yy/talimu/talimu" # 目标路径
hosts_file="hosts.txt" # 主机列表文件(格式:username@host)
password="你的密码" # ssh密码
ssh_port="22" # ssh端口号,默认开放22
log_dir="transfer_logs_$(date +%y%m%d_%h%m%s)"
# 创建日志目录
mkdir -p $log_dir
# 检查文件是否存在
if [ ! -e "$source_path" ]; then
echo "错误:源文件/文件夹不存在"
exit 1
fi
if [ ! -f "$hosts_file" ]; then
echo "错误:主机列表文件不存在"
exit 1
fi
# 统计总主机数
total=$(wc -l < "$hosts_file")
current=0
success=0
failed=0
echo "开始传输,总计 $total 台主机..."
echo "使用端口: $ssh_port"
# 读取主机列表并传输
while ifs= read -r line; do
current=$((current + 1))
# 如果行包含@,则分割用户名和主机地址
if [[ $line == *"@"* ]]; then
username=$(echo $line | cut -d'@' -f1)
host=$(echo $line | cut -d'@' -f2)
else
# 如果没有指定用户名,使用默认用户root
username="root"
host=$line
fi
echo "[$current/$total] 正在传输到 $username@$host..."
if [ -d "$source_path" ]; then
sshpass -p "$password" scp -p $ssh_port -r -o stricthostkeychecking=no \
"$source_path" "$username@$host:$dest_path" \
>> "$log_dir/success.log" 2>> "$log_dir/errors.log"
else
sshpass -p "$password" scp -p $ssh_port -o stricthostkeychecking=no \
"$source_path" "$username@$host:$dest_path" \
>> "$log_dir/success.log" 2>> "$log_dir/errors.log"
fi
if [ $? -eq 0 ]; then
echo "✅ $username@$host 传输成功"
success=$((success + 1))
else
echo "❌ $username@$host 传输失败"
failed=$((failed + 1))
fi
echo "----------------------------------------"
done < "$hosts_file"
# 显示传输结果统计
echo -e "\n传输完成!"
echo "成功:$success"
echo "失败:$failed"
echo "详细日志保存在:$log_dir/"
到此这篇关于ubuntu向多台主机批量传输文件的流程步骤的文章就介绍到这了,更多相关ubuntu向多台主机批量传输文件内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论