我有 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