将文件从服务器列表复制到特定的远程服务器

将文件从服务器列表复制到特定的远程服务器

我有 3 个远程服务器,需要从源服务器将文件复制到其中,而不必为每台服务器多次运行相同的命令,是否可以从列表中选择一台服务器,然后将文件传输到该服务器?

我的目标是避免为每个服务器单独编写相同的代码。

例如:

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

同样,如果选择其他选项,文件应复制到该服务器。

这是我在一台服务器上复制文件的代码。

#!/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

相关内容