如果在一台主机中找不到文件,则从另一台主机复制 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了,不够优雅。
问题:
- 是否有比 if then else 更好的解决方案?
- 在 if 和 else 分支中我都使用 SCP,这需要我输入两次密码。在两台主机上,用户名和密码是相同的。在 shell 文件中,有什么方法可以让我不必在终端上再次输入密码。
- 上面的情况有两台主机,但是如果我有n台主机也是类似的情况。那是一个文件,在一台主机上,但不确定是哪一个,但所有主机都具有相同的用户名和密码凭据。如何概括上述脚本。有没有办法在 shell 脚本中制作一个 switch case。
谢谢
您可以改用 rsync
。 rsync -r -z -c
将 return better error codes.
您可以使用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
是您的朋友。
- 对于多个主机,都使用相同的用户名和密码:
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
我知道文件的名称和它可能所在的主机。我也知道只有一个主机有那个文件。因此,基于此 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了,不够优雅。
问题:
- 是否有比 if then else 更好的解决方案?
- 在 if 和 else 分支中我都使用 SCP,这需要我输入两次密码。在两台主机上,用户名和密码是相同的。在 shell 文件中,有什么方法可以让我不必在终端上再次输入密码。
- 上面的情况有两台主机,但是如果我有n台主机也是类似的情况。那是一个文件,在一台主机上,但不确定是哪一个,但所有主机都具有相同的用户名和密码凭据。如何概括上述脚本。有没有办法在 shell 脚本中制作一个 switch case。
谢谢
您可以改用
rsync
。rsync -r -z -c
将 return better error codes.您可以使用
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
是您的朋友。
- 对于多个主机,都使用相同的用户名和密码:
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