Мне нужно scp файлы из machineB
и machineC
в machineA
. Я запускаю свой скрипт оболочки ниже из machineA
. Я правильно настроил ключи ssh.
Если файлов нет в machineB
, то они должны быть в machineC
.
#!/bin/bash
readonly PRIMARY=/data01/primary/.
readonly FILERS_LOCATION=(machineB machineC)
readonly MAPPED_LOCATION=/bat/data/snapshot
PARTITION=(0 3 5 7 9)
dir1=/bat/data/snapshot/20131222
dir2=/bat/data/snapshot/20131222
scp david@${FILERS_LOCATION[0]}:$dir1/weekly_1980_[$el]_200003_5.data $PRIMARY || scp david@${FILERS_LOCATION[1]}:$dir2/weekly_1980_[$el]_200003_5.data $PRIMARY
Теперь мой вопрос: если вы посмотрите на мою команду scp выше, [$el]
на данный момент (что неверно), мне нужно заменить это на PARTITION
, что означает, что мне нужно выполнить итерацию PARTITION
и заменить [$el]
на каждое число в PARTITION.
Итак, моя команда scp должна выглядеть так, если я буду выполнять ее PARTITION
поочередно:
scp david@machineB:/bat/data/snapshot/20131222/weekly_1980_0_200003_5.data /data01/primary/. || scp david@machineC:/bat/data/snapshot/20131222/weekly_1980_0_200003_5.data /data01/primary/.
scp david@machineB:/bat/data/snapshot/20131222/weekly_1980_3_200003_5.data /data01/primary/. || scp david@machineC:/bat/data/snapshot/20131222/weekly_1980_3_200003_5.data /data01/primary/.
scp david@machineB:/bat/data/snapshot/20131222/weekly_1980_5_200003_5.data /data01/primary/. || scp david@machineC:/bat/data/snapshot/20131222/weekly_1980_5_200003_5.data /data01/primary/.
scp david@machineB:/bat/data/snapshot/20131222/weekly_1980_7_200003_5.data /data01/primary/. || scp david@machineC:/bat/data/snapshot/20131222/weekly_1980_7_200003_5.data /data01/primary/.
scp david@machineB:/bat/data/snapshot/20131222/weekly_1980_9_200003_5.data /data01/primary/. || scp david@machineC:/bat/data/snapshot/20131222/weekly_1980_9_200003_5.data /data01/primary/.
Постановка задачи:-
- Как мне выполнить итерацию PARTITION таким образом, чтобы можно было выполнить указанную выше команду SCP?
- И еще, как вы видите, я копирую файлы по одному в
machineA
/data01/primary/
папку. Есть ли способ сделать это лучше? То есть, могу ли я копировать все файлы вместе за один раз, а не по одному?
решение1
Вы можете выполнить итерацию по массиву PARTITION следующим образом:
for el in "${PARTITION[@]}"
do
echo "$el"
done
решение2
Я бы посоветовал рассмотреть rsync
для выполнения этой задачи, так как она обеспечивает большую функциональность для этого типа резервного копирования. Вы можете выполнить это с machineA, указав на каталоги снимков на B и C, и весь ваш каталог снимков будет зеркалирован.
Затем вы можете использовать cron
его для планирования через заданные интервалы времени. scp
Идеально подходит для одноразового копирования, но ваш сценарий похож на обычное задание по резервному копированию. rsync
Также взаимодействует через стандартные порты SSH, поэтому, если scp
работает в настоящее время, не должно быть необходимости вносить изменения в сеть, брандмауэры и т. д.
rsync
При необходимости можно даже реализовать функционал по созданию идентичного зеркала на всех трех серверах .