Baixe o arquivo de uma das duas máquinas usando o SCP?

1

Eu tenho um script de shell abaixo do bash que estou executando em machineA e esse script de shell tentará fazer o download de um arquivo tar de uma dessas duas máquinas machineB e machineC e colocá-lo em /testing/directory1 em machineA .

E ambas as máquinas (machineB e machineC) terão o mesmo arquivo test.tar no mesmo diretório /data/v1 .

Eu preciso baixar o arquivo test.tar de qualquer uma dessas duas máquinas (machineB e machineC) do diretório /data/v1 . Se machineB estiver ativo, então baixarei o arquivo tar de machineB e, se estiver desativado, baixarei o mesmo arquivo tar de machineC ..

Mas atualmente no meu script de shell, suponha, por qualquer razão, se machineB estiver inativo, então eu acho que ele nem vai tentar baixar o mesmo arquivo tar de machineC e ele lançará uma exceção e parará o shell roteiro.

Eu quero usar set -e , mas ele deve lançar uma exceção apenas quando ambas as máquinas estiverem inativas e não conseguirem fazer o download do arquivo tar de machineB e machineC . Se machineB estiver inativo por qualquer motivo, tente baixar de 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

Alguma idéia de como isso pode ser feito? Eu quero usar scp apenas aqui não rsync como eu preciso gastar algum tempo compreendendo rsync.

    
por arsenal 26.01.2014 / 03:50

2 respostas

3

Você está desnecessariamente complicando as coisas. Apenas tente machineA e se isso falhar, vá para 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

Se você quiser saber de qual host você fez o download, poderá fazer:

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

E se você quiser fazer outra coisa, se nenhuma das máquinas estiver ativa:

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
    
por 26.01.2014 / 17:49
2
if ping -c 3 -W 1 hostA >/dev/null; then
 SRV=hostA
elif ping -c 3 -W1 hostB >/dev/null; then
 SRV=hostB
else
 echo "cannot contact either hostA or hostB"
 exit 1
fi

scp david@$SRV:$FILE_LOCATION/$FILE_NAME $PATH_LOCATION/. 
RET=$?

echo "Return code is $RET"

...
    
por 26.01.2014 / 04:09