Linux
使用 SCP 從兩台機器中的任何一台下載文件?
我有一個下面執行的 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