如何在SFTP执行结束时执行shell脚本?

时间:2018-01-12 10:26:49

标签: bash shell ssh sh sftp

我有一个shell脚本,我在其中SFTP并将我的文件传输到远程主机。

我可以将文件传输到远程主机,但是一旦SFTP完成,我的父shell脚本代码就无法执行。

#!/bin/bash
set -e
echo "Starting SFTP..."
    cd "/Users/myuser/myfolder"
    sftp -o "StrictHostKeyChecking no" admin@myserver.myorg.com << END_SCRIPT
    cd /some/folder/on/remote/host
    put -r .
    bye
    END_SCRIPT
echo "Done."

我没有看到“完成”。在控制台上打印。有线索吗?

2 个答案:

答案 0 :(得分:4)

问题是由于缩进造成的。有两种可能的解决方案

  1. 要么摆脱缩进(至少对于END_SCRIPT行),
  2. 或确保缩进是通过制表符而不是空格,并使用<<-而不是<<重定向运算符。
  3. 您还必须确保END_SCRIPT之后没有空白。

      

    此处文件

         

    这种重定向指示shell从中读取输入   当前源直到包含唯一分隔符的行(没有   可见尾随空白)。所有的线都读到了那一点   然后用作命令的标准输入。

         

    here-documents的格式为:

          <<[-]word
                  here-document
          delimiter
    
         

    没有参数和变量扩展,命令替换,   对字进行算术扩展或路径名扩展。   如果引用单词中的任何字符,则分隔符为   单词上的引号删除结果,以及here-document中的行   没有扩大。如果单词没有引用,则所有行都是   here-document受参数扩展,命令   替换和算术扩展,字符序列   忽略\<newline>,并且必须使用\来引用字符   \$和`。

         

    如果重定向运算符为<<-,则为所有前导制表符   从输入行和包含的行中删除   分隔符。这允许shell脚本中的文档   以自然的方式缩进。

答案 1 :(得分:1)

heredocs需要<<旁边显示的内容 完全是为了结束heredoc而产生的。

在你的情况下缩进引入标签(或之前可能的空格)heredoc delim END_SCRIPT,以便它不再被视为分隔符。 所以sftp命令继续寻找它从未找到的分隔符。

以下是格式。

command <<HEREDOC_DELIM

HEREDOC_DELIM 
# Note that nothing should be put in front of HEREDOC_DELIM - no indents.