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

问题描述 投票:0回答:1

我知道该文件的名称和可能存在该文件的主机。我还知道只有一台主机有这个文件。所以根据这个 答辩 我创建了以下脚本。

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

我把上面的代码放在一个文件名为 file_copy.sh 然后从终端调用该文件,如下所示。$ ./file_copy.sh filename,这就是 $1 参数的来源。我不确定整个文件名,但在这种情况下,只有前缀,所以有一个通配符的 * 但这个问题可以忽略这部分。

在上面的案例中,我知道有两个主机,其中一个会有我的文件,所以我只做了一个if else的切换,但是感觉太黑了,不够优雅。

问题是

  1. 有没有更好的办法来解决上面的if then else来做SCP?
  2. 在if和else两个分支中,我都用SCP,需要我输入两次密码。在两个主机上,用户名和密码都是一样的。有没有什么办法,在shell文件中,让我不用在终端上再次输入密码。
  3. 上面的情况是有两台主机,但是如果我有n台主机,也是类似的情况。那就是一个文件,在一台主机中,但不知道是哪一台,但所有主机的用户名和密码凭证都是一样的。上面的脚本怎么能通用。有没有办法在shell脚本中做一个切换的情况。

谢谢,谢谢

bash scp
1个回答
0
投票
  1. 你可以使用 rsync 而不是。rsync -r -z -c 将返回 更好的错误代码.

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

那你可以...

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

我个人建议不要用纯文本输入密码。ssh私钥 对这个问题很有用。您可以使用 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/$1*" ~/$1 && 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/$1*" ~/$1 && break
done
© www.soinside.com 2019 - 2024. All rights reserved.