我正在尝试找出一种方法来ssh到远程文件,检查文件是否存在,如果它存在ssh回到第一台服务器,执行命令并完成。到目前为止,这是我的代码片段:
for file_name in $(ls $FILE_DIR/)
do
ssh user@remote.com: home/some/directory
'if [ -f $DIRECTORY/$file_name ]
then
ssh user@originalserver.com: home/some/Directory
'scp user@remote.com: $DIRECTORY/$file_name $DIRECTORY/$file_name"_"$(date +%Y%m%d%H%M%S)
fi''
scp user@remote.com $FILE_DIR/$file_name $DIRECTORY/$file_name
当我执行脚本时,在命令行中打开与远程服务器的连接,并且不会执行脚本的其余部分。
另外,我正在尝试做的有效吗?我可以在通过ssh加入的服务器中进行ssh吗?
答案 0 :(得分:2)
所以我有几点建议:
运行远程命令时,有时候模拟tty非常重要。为了做到这一点,尝试使用ssh -t -t来强制伪tty分配,即使stdin不是终端。
您是否考虑过使用salt-stack? Salt允许您在网络上的多台计算机上并行运行远程命令。 Salt是在其他机器上运行远程命令的绝佳解决方案,它非常易于设置。
在运行脚本之前尝试使用bash -x运行远程命令,这样,您应该看到帮助您调试情况所需的所有输出。如果这还不够,请确保将标准输出/错误重定向到文件,以查看出现了什么问题,例如:
ssh user@remote.com' bash -x ./script_2004.5664 | tee -a~ / some.log> 2 - ;&安培; 1' 强>
答案 1 :(得分:1)
首先,不要使用ls迭代文件。 Bash可以自己做到这一点。
for file_name in "$FILE_DIR"/*
也使用[[]]代替[
以下是可能符合您要求的脚本:
for filename in "$FILE_DIR/"*; do
# Check if file exists on the remote server
if [[ $(ssh user@remote.com "[[ -f $DIRECTORY/$filename ]] && echo 1") ]]; then
# Download that file
scp user@remote.com: "$DIRECTORY/$filename" "$DIRECTORY/${filename}_$(date +%Y%m%d%H%M%S)"
fi
done