Linux

使用 SCP 從兩台機器中的任何一台下載文件?

  • January 26, 2014

我有一個下面執行的 bash shell 腳本,machineA該 shell 腳本將嘗試從這兩台機器中的任何一台下載一個 tar 文件machineB並將machineC/testing/directory1放入machineA.

並且兩台機器(machineB 和 machineC)都將test.tar在同一目錄中具有相同的文件/data/v1

我需要test.tar從目錄中的這兩台機器(machineB 和 machineC)中的任何一台下載文件/data/v1。如果machineB啟動,那麼我將從下載 tar 文件machineB,如果它關閉,那麼我將從machineC..下載相同的 tar 文件

但是目前在我的 bash shell 腳本中假設無論出於何種原因如果machineB它關閉了,那麼我猜它甚至不會嘗試從中下載相同的 tar 文件machineC,它會拋出異常並停止 shell 腳本。

我想使用set -e,但只有當兩台機器都關閉並且無法從machineB和下載 tar 文件時它才會拋出異常machineC。如果machineB由於某種原因而關閉,那麼它應該嘗試從machineC..下載

#!/bin/bash
set -e

readonly PATH_LOCATION=/testing/directory1
readonly MACHINES=(machineB machineC)
readonly FILE_LOCATION=/data/v1
readonly FILE_NAME=test.tar

length1=$(ssh -o "StrictHostKeyChecking no" david@${MACHINES[0]} "ls '$FILE_LOCATION' | wc -l")
length2=$(ssh -o "StrictHostKeyChecking no" david@${MACHINES[1]} "ls '$FILE_LOCATION' | wc -l")

echo $length1
echo $length2

if [ "$length1" -gt 0 ] || [ "$length2" -gt 0 ]
then
   rm -rf $PATH_LOCATION/*
   scp david@${MACHINES[0]}:$FILE_LOCATION/$FILE_NAME $PATH_LOCATION/. || scp david@${MACHINES[1]}:$FILE_LOCATION/$FILE_NAME $PATH_LOCATION/.
   tar -xvf $PATH_LOCATION/$FILE_NAME -C $PATH_LOCATION
   rm $PATH_LOCATION/$FILE_NAME
fi

任何想法如何做到這一點?我只想在這裡使用 scp 而不是 rsync,因為我需要花一些時間來理解 rsync。

你不必要地使事情複雜化。只需嘗試 machineA,如果失敗,請轉到 machineB:

#!/usr/bin/env bash
set -e

readonly PATH_LOCATION=/testing/directory1
readonly MACHINES=(machineB machineC)
readonly FILE_LOCATION=/data/v1
readonly FILE_NAME=test.tar
readonly TARGET="$FILE_LOCATION/$FILE_NAME"


for MACHINE in ${MACHINES[@]}; do
   scp david@$MACHINE:$TARGET $PATH_LOCATION && break
done

如果您想知道從哪個主機下載,您可以執行以下操作:

for MACHINE in ${MACHINES[@]}; do
   if scp david@$MACHINE:$TARGET $PATH_LOCATION; then
     echo "Downloaded from $MACHINE";
     break;
   fi
done

如果你想在兩台機器都沒有啟動的情況下做其他事情:

for MACHINE in ${MACHINES[@]}; do
   if scp david@$MACHINE:$TARGET $PATH_LOCATION; then
     echo "Downloaded from $MACHINE";
     break;
   fi
done
if [[ $? -eq 1 ]]; then
  echo "Download failed"
fi

引用自:https://unix.stackexchange.com/questions/110942