如果在一台主机中找不到文件,则从另一台主机复制 SCP

SCP copy from another host if file not found in one host

我知道文件的名称和它可能所在的主机。我也知道只有一个主机有那个文件。因此,基于此 reply 我创建了以下脚本。

if scp "username@host1:/tmp/*" ~/;
then echo "done";
else scp "username@host2:/tmp/*" ~/;
fi

我将上面的代码放在文件名 file_copy.sh 中,然后按如下方式从终端调用该文件 $ ./file_copy.sh filename,这就是 </code> 参数的来源。我不确定整个文件名,但在这种情况下只有前缀,所以有通配符 <code>* 但对于这个问题可以忽略那部分。

在上面的例子中,我知道有两台主机,其中一台会有我的文件,所以我就做了一个if else switch,但感觉太hacky了,不够优雅。

问题:

  1. 是否有比 if then else 更好的解决方案?
  2. 在 if 和 else 分支中我都使用 SCP,这需要我输入两次密码。在两台主机上,用户名和密码是相同的。在 shell 文件中,有什么方法可以让我不必在终端上再次输入密码。
  3. 上面的情况有两台主机,但是如果我有n台主机也是类似的情况。那是一个文件,在一台主机上,但不确定是哪一个,但所有主机都具有相同的用户名和密码凭据。如何概括上述脚本。有没有办法在 shell 脚本中制作一个 switch case。

谢谢

  1. 您可以改用 rsyncrsync -r -z -c 将 return better error codes.

  2. 您可以使用sshpass自动输入密码

那你可以..

if sshpass PA55WORD rsync -r -z -c "username@host1:/tmp/*" ~/;
then echo "done";
else sshpass PASSWORD rsync -r -z -c "username@host2:/tmp/*" ~/;
fi

我个人建议不要以纯文本形式输入密码。 ssh private keys 对这个确切的问题很有用。您可以使用 sshpass -f FILE_PATH 或其他一些巧妙的加密方法来获取密码,但 sshpass 是您的朋友。

  1. 对于多个主机,都使用相同的用户名和密码:
HOSTS=( "host1" "host2" "host3" )

for H in ${HOSTS[@]}
do
  sshpass -p PASSWORD rsync -r -z -c "username@${H}:/tmp/*" ~/ && break
done

对于多个主机,都使用不同的用户名和密码

HOSTS=( "host1" "host2" "host3" )
USERS=( "user1" "user2" "user3" )
PASSS=( "pass1" "pass2" "pass3" )

for i in ${!HOSTS[@]}
do
  sshpass -p ${PASSS[$i]} rsync -r -z -c "${USERS[$i]}@${HOSTS[$i]}:/tmp/*" ~/ && break
done