基于脚本运行数据中心生成机器数组及SCP传输需求
动态生成SCP主机列表的Shell脚本实现
针对你提出的跨数据中心机器选择需求,我整理了一个实用的Shell脚本方案,既能根据脚本运行的当前数据中心自动选定本地执行主机,又能在本地主机故障时自动切换到备用节点完成SCP传输。
#!/bin/bash # 原始机器列表:三台分属不同数据中心的机器 machines=( "machineA.abc.host.com" "machineB.def.host.com" "machineC.xyz.host.com" ) # 1. 确定当前运行的 data center # 优先使用环境变量(方便手动指定),否则从当前主机名提取 if [ -n "$RUNNING_DC" ]; then current_dc="$RUNNING_DC" else # 假设当前主机名格式类似:server.abc.host.com,提取中间的dc部分 current_dc=$(hostname | awk -F'.' '{print $2}') fi # 2. 匹配本地主机并生成远程主机列表 local_host="" remote_hosts=() for machine in "${machines[@]}"; do # 提取机器所属的dc machine_dc=$(echo "$machine" | awk -F'.' '{print $2}') if [ "$machine_dc" = "$current_dc" ]; then local_host="$machine" else remote_hosts+=("$machine") fi done # 3. 检测主机是否可达的辅助函数 is_host_reachable() { local host="$1" # 用SSH连通性测试更贴合SCP场景(替换ping也可以) ssh -q "$host" exit > /dev/null 2>&1 return $? } # 4. 执行SCP传输逻辑 source_file="/path/to/local/source/file" dest_path="/path/to/remote/destination/" # 先尝试使用本地主机发起SCP if [ -n "$local_host" ] && is_host_reachable "$local_host"; then echo "使用本地主机 *$local_host* 执行SCP传输..." for remote in "${remote_hosts[@]}"; do scp "$source_file" "$remote:$dest_path" if [ $? -eq 0 ]; then echo "✅ 成功传输到 $remote" else echo "❌ 传输到 $remote 失败" fi done else # 本地主机不可用,切换到远程主机作为执行节点 echo "本地主机 *$local_host* 不可达,切换到备用远程节点执行..." for exec_host in "${remote_hosts[@]}"; do if is_host_reachable "$exec_host"; then echo "使用备用节点 *$exec_host* 发起传输..." # 注意:若用远程节点执行,需确保源文件可被该节点访问(比如共享存储/预同步) scp "$source_file" "$exec_host:$dest_path" break # 找到第一个可用节点就停止 fi done fi
关键逻辑说明
- 灵活的DC检测:支持手动通过环境变量
RUNNING_DC指定数据中心(比如测试时用RUNNING_DC=abc ./script.sh),也能自动从当前主机名解析DC,适配不同运行场景。 - 自动筛选主机:遍历原始机器数组,根据域名中的DC段自动区分本地主机和远程主机列表,无需硬编码。
- 故障切换机制:优先使用本地主机发起传输,当本地主机SSH不可达时,自动遍历备用远程节点,找到第一个可用节点执行传输。
- 可定制的可达性检测:默认用SSH连通性测试(更贴合SCP依赖的协议),你也可以换成
ping快速检测,根据需求调整。
注意:如果使用备用远程节点执行SCP,要确保源文件能被该节点访问——比如放在共享存储,或者先把源文件同步到备用节点后再执行传输,可根据实际环境调整这部分逻辑。
内容的提问来源于stack exchange,提问作者flash
相关产品推荐
相关产品推荐

