我知道该文件的名称和可能存在该文件的主机。我还知道只有一台主机有这个文件。所以根据这个 答辩 我创建了以下脚本。
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的切换,但是感觉太黑了,不够优雅。
问题是
谢谢,谢谢
你可以使用 rsync
而不是。rsync -r -z -c
将返回 更好的错误代码.
你可以用 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
是你的朋友。
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