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

3

我有一个Bash脚本,可以通过以下命令使用SFTP上传文件:

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

当我的bash脚本完成时,我会收到一封电子邮件通知。 我想将此命令的实际输出(来自服务器的响应或sshpass的错误)捕获到变量或文本文件中,并将其包含在我的电子邮件中。
有哪些选项可以重定向输出?我知道我可以将命令放入$()中以捕获它们的输出,并且我也可以使用>>,但是对于多行输入,我认为这些方法都不起作用...
我试过了这个:
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个回答

2

重定向起作用:

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

当我这样做时,我的输出文件仅包含我发送到其他服务器的命令。(它重复cd data、put /path..等) 它不显示服务器的响应。当我从命令行运行它时,似乎响应仍然会输出到stdout。 - ethanpil
根据您的建议,我解决了问题,谢谢Lars,请参见上文。 - ethanpil

1

听起来你想使用一个expect脚本。Expect应该适用于你的操作系统和发行版。

如果不行,看看能否使用scp,这通常在也启用了sftp的服务器上可用。这可能会更容易:

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

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

不幸的是,远程服务器的管理员不会使用公钥。也许他们不知道如何使用,或者他们不理解这是最安全的方式,但是他们对此置之不理。如果他们同意使用公钥,那么我将节省数小时的时间和精力,但是我已经放弃了与他们争论,并且正在尝试继续前进。我不知道如何使用scp预设密码。我将研究expect...谢谢。 - ethanpil
如果您可以通过SSH访问服务器上的shell,那么您可能可以自己设置公钥。只需从发起连接的计算机中获取/.ssh/id_[dr]sa.pub文件,并将其放置在远程服务器上的/.ssh/authorized_keys中即可。(如果您仅能够chrooted访问服务器,则可能无法执行此操作。) - ghoti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接