如何实现多服务器SCP自动化?基于IP文本文件批量分发文件
嘿,刚好我之前处理过不少批量SCP自动化的需求,给你分享两个实用的解决方案:
1. 多服务器场景下SCP操作自动化的实现思路
要实现多服务器SCP自动化,免密SSH登录是核心前提——不然每次传输都要手动输密码,根本谈不到自动化。
第一步:配置免密SSH登录
如果还没生成过SSH密钥对,先在本地机器生成:
ssh-keygen -t rsa -b 4096 -N "" -f ~/.ssh/id_rsa
参数说明:-N ""表示设置空密码(避免后续脚本执行时弹出密码提示),-f指定密钥保存路径,一路回车即可完成生成。
接下来把公钥复制到所有目标服务器上(第一次需要输入目标机器的登录密码):
ssh-copy-id username@target_server_ip
如果服务器数量多,可以后面结合批量脚本完成这一步,不用手动逐个操作。
第二步:编写批量SCP脚本
如果是固定的服务器列表,可以直接把服务器信息写在脚本里,示例如下:
#!/bin/bash # 定义目标服务器列表,格式为「用户名@IP地址」 servers=( "dev_user@192.168.1.20" "test_user@192.168.1.21" "prod_user@192.168.1.22" ) # 本地要传输的文件/目录路径 local_resource="/home/local_user/data_backup.tar.gz" # 目标服务器的存储路径 remote_dir="/data/backups/" # 遍历服务器列表执行SCP for server in "${servers[@]}"; do echo "开始向 $server 传输文件..." scp "$local_resource" "$server:$remote_dir" # 检查传输结果并输出日志 if [ $? -eq 0 ]; then echo "✅ 向 $server 传输成功!" else echo "❌ 向 $server 传输失败,请检查网络或路径!" fi done
给脚本添加执行权限后就能直接运行:
chmod +x batch_scp.sh ./batch_scp.sh
2. 从IP文本文件批量执行SCP传输
如果所有目标机器的IP都存在文本文件里(比如server_list.txt),我们可以通过循环读取文件内容来实现批量传输。
第一步:整理服务器列表文件
确保server_list.txt的格式清晰,每行一个服务器信息:
dev_user@192.168.1.20 test_user@192.168.1.21 192.168.1.22 # 如果目标服务器用户名和本地一致,可只写IP # 这是注释行,脚本会自动跳过
第二步:编写读取文件的批量SCP脚本
#!/bin/bash # 服务器列表文件路径 server_file="./server_list.txt" # 本地要传输的资源路径 local_resource="/home/local_user/deploy_package.zip" # 目标服务器存储路径 remote_dir="/opt/apps/" # 先检查列表文件是否存在 if [ ! -f "$server_file" ]; then echo "错误:找不到服务器列表文件 $server_file!" exit 1 fi # 逐行读取文件内容 while IFS= read -r server; do # 跳过空行和注释行(以#开头的行) if [[ -z "$server" || "$server" =~ ^# ]]; then continue fi echo "正在处理服务器:$server" # 如果目标服务器SSH端口不是默认22,添加-P参数,比如scp -P 2222 ... scp "$local_resource" "$server:$remote_dir" # 记录传输结果到日志文件 if [ $? -eq 0 ]; then echo "$(date +'%Y-%m-%d %H:%M:%S') - $server 传输成功" >> scp_success.log echo "✅ $server 传输完成" else echo "$(date +'%Y-%m-%d %H:%M:%S') - $server 传输失败" >> scp_fail.log echo "❌ $server 传输失败" fi done < "$server_file" echo "批量传输任务结束!成功日志查看 scp_success.log,失败日志查看 scp_fail.log"
同样给脚本加执行权限后运行即可。
额外实用小贴士
- 传输目录时,添加
-r参数:scp -r /local/dir/ "$server:/remote/dir/" - 网络较慢时,添加
-C参数开启压缩传输,提升速度:scp -C "$local_resource" "$server:$remote_dir" - 如果需要跳过主机密钥验证(测试环境可用,生产环境不建议),可以在
scp命令前加-o StrictHostKeyChecking=no
内容的提问来源于stack exchange,提问作者sourabh malavade
相关产品推荐
相关产品推荐

