如何在bash中进行多行重定向输入后重定向输出?

时间:2012-03-19 19:21:39

标签: bash ssh cron sftp

我有一个bash脚本,通过SFTP上传文件,命令如下:

sshpass -pABC123 sftp user@host.com  << !
   cd data
   put /path/file.txt
   bye
! 

当流程完成后,我会从bash脚本收到电子邮件通知。我想将此命令的实际输出(来自服务器的响应或来自sshpass的错误)捕获到变量或文本文件中,并将其包含在我的电子邮件中。

我可以选择重定向输出。我知道我可以将命令放入$()来捕获它们的输出,我可以使用&gt;&gt;同样,但是多线输入,我不认为这些会起作用......

我试过这个:

SFTP_RESULT = (    
   sshpass -pABC123 sftp user@host.com  << !
       cd data
       put /path/file.txt
       bye
    ! 
)

我也尝试过:

sshpass -pABC123 sftp user@host.com  << ! >> /file.txt

sshpass -pABC123 sftp user@host.com >> /file.txt << ! 

所有这些只是返回我发送到远程服务器的命令。我没有看到服务器的任何响应。当我从上面的任何一个命令行运行脚本时,我在屏幕上看到了响应。

有人有任何建议吗?

更新

我已经接受了来自 Lars Kotthoff 的答案,即使它并不完美,但根据他的回答以及我在评论中对他的回答的讨论,我想出来了。这就是我所做的:

首先,我将sftp命令移动到名为“sftp_commands”的外部文件

echo $(cat sftp_commands | sshpass -pABC123 sftp user@host.com 2>&1) >> sftp.log

出于某种原因可行。

2 个答案:

答案 0 :(得分:1)

听起来我想要使用expect脚本。期望应该适用于您的操作系统和分发。

除此之外,看看您是否可以使用scp,这通常在启用了sftp的服务器上可用。它可能更容易:

scp /path/file.txt user@example.com:data/

请注意,设置SSH公钥可能更好,而不是使用sshpass。

答案 1 :(得分:0)

重定向工作:

$ cat << ! > /tmp/foo
> foo
> bar
> !
$ cat /tmp/foo 
foo
bar