Linux

如何迭代 bash 數組並有效地創建 SCP 命令?

  • December 24, 2013

我需要從machineBmachineC到scp 文件machineA。我正在執行我的下面的 shell 腳本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 中的每個數字。

PARTITION因此,如果我一一迭代,我的 scp 命令應該如下所示-

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/.

問題陳述:-

  1. 如何以這種方式迭代 PARTITION,以便我可以製作上述 SCP 命令?
  2. 而且,如您所見,我正在將文件一一複製到文件machineA /data01/primary/夾中。有沒有更好的方法來做到這一點?意思是,我可以一次將所有文件複製在一起而不是一個一個地複制嗎?

您可以像這樣遍歷 PARTITION 數組

for el in "${PARTITION[@]}"
do
   echo "$el"
done

我建議查看rsync完成這項任務,因為它為這種類型的備份提供了更全面的功能。您可以從 machineA 執行此操作,將其指向 B 和 C 上的快照目錄,然後您的整個快照目錄將被鏡像。

然後,您可以使用cron以設定的時間間隔進行安排。 scp是一次性副本的理想選擇,但您的方案聽起來像是一項正常備份工作。 rsync還通過標準 SSH 埠進行通信,因此如果scp目前可以正常工作,則無需更改網路、防火牆等。

rsync如果需要,您甚至可以實現在所有三台伺服器上創建相同鏡像的功能。

引用自:https://serverfault.com/questions/563332