0

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

4

2 回答 2

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'

于 2013-08-21T07:14:58.243 回答
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
于 2013-08-21T07:18:18.033 回答