我有一个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
出于某种原因可行。
答案 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