3つのリモートサーバーがあり、ソースサーバーからそのサーバーにファイルをコピーする必要があります。各サーバーに対して同じコマンドを複数回実行するのではなく、リストから1つのサーバーを選択してそのサーバーにファイルを転送できますか?
私の目標は、サーバーごとに個別に同じコードを書くことです。
たとえば、
A = source server
B = remote server 1
C = remote server 2
D = remote server 3
(there may be more remote servers in future)
ファイルをコピーするサーバー(B / C / D)を入力してください。
コマンドラインでBを選択すると、次のコマンドが実行されます。
scp xyz.txt user@remoteserver2:/home
scp jkl.txt user@remoteserver2:/home
同様に、別のオプションを選択した場合は、ファイルをそのサーバーにコピーする必要があります。
これは1つのサーバーからファイルをコピーするコードです。
#!/bin/sh
today=`date '+%Y%m%d'`;
min_date=`date -d "$today -14days" +%Y%m%d`
max_date=`date -d "$today -1days" +%Y%m%d`
read -p "Enter the date you want input files for [yyyymmdd]: " user_date
udate=$user_date
if [[ $user_date -ge $min_date && $user_date -lt $today ]]
then
ssh user@server2 mkdir -p /data/${udate}_inputfiles/{f1,f2,f3,f4,f5,f6}
echo "Starting to copy files"
cd /homepath1
scp *${udate}* user@server2:/data/${udate}_inputfiles/f1
scp *${udate}* user@server2:/data/${udate}_inputfiles/f2
scp *${udate}* user@server2:/data/${udate}_inputfiles/f3
scp *${udate}* user@server2:/data/${udate}_inputfiles/f4
scp *${udate}* user@server2:/data/${udate}_inputfiles/f5
scp *${udate}* user@server2:/data/${udate}_inputfiles/f6
else
echo "Entered date is invalid: Please specify date between $min_date and $max_date"
fi
ベストアンサー1
とても簡単です。関数を書いてください。
function serverscp () {
s="$1"
ssh user@$s mkdir -p /data/${udate}_inputfiles/f{1,2,3,4,5,6}
echo "Starting copy"
cd /homepath1
scp *${udate}* user@${s}:/data/${udate}_inputfiles/f1
scp *${udate}* user@${s}:/data/${udate}_inputfiles/f2
scp *${udate}* user@${s}:/data/${udate}_inputfiles/f3
scp *${udate}* user@${s}:/data/${udate}_inputfiles/f4
scp *${udate}* user@${s}:/data/${udate}_inputfiles/f5
scp *${udate}* user@${s}:/data/${udate}_inputfiles/f6
cd $OLDPWD
}
後でスクリプトで
for tgt in server1 server2 server3 ; do
serverscp $tgt
done
警告するテストされていないコード、確認されていないコードhttps://shellcheck.org