使用ssh在bash脚本中连接和执行远程服务器中的命令

时间:2013-08-21 06:25:39

标签: bash ssh sh

我正在尝试找出一种方法来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吗?

2 个答案:

答案 0 :(得分:2)

所以我有几点建议:

  1. 运行远程命令时,有时候模拟tty非常重要。为了做到这一点,尝试使用ssh -t -t来强制伪tty分配,即使stdin不是终端。

  2. 您是否考虑过使用salt-stack? Salt允许您在网络上的多台计算机上并行运行远程命令。 Salt是在其他机器上运行远程命令的绝佳解决方案,它非常易于设置。

  3. 在运行脚本之前尝试使用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