【问题标题】:How to redirect output after a multiline redirect for input in bash?如何在多行重定向后重定向输出以输入 bash?
【发布时间】:2012-04-04 07:28:06
【问题描述】:

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

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 的答案,尽管它并不完美,但根据他的答案以及我们在 cmets 中对他的答案的讨论,我想通了。这就是我所做的:

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

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

出于某种原因,它有效。

【问题讨论】:

    标签: bash ssh cron sftp


    【解决方案1】:

    重定向工作:

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

    【讨论】:

    • 当我这样做时,我的输出文件只包含我发送到另一台服务器的命令。 (它重复 cd 数据、放置 /path.. 等)它没有向我显示来自服务器的响应。当我从命令行运行它时,似乎响应仍然会转到标准输出。
    • 我根据您的建议弄明白了,谢谢 Lars,见上文。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 不幸的是,远程服务器的管理员不会做公钥。也许他们不知道怎么做,或者他们不明白这是最安全的,但他们阻止了我。这本来可以为我节省数小时的恼怒,但我放弃了与他们争论,我只是想继续前进。我看不到如何使用 scp 预设密码。我会考虑期待...谢谢
    • 如果您可以通过 SSH 访问服务器上的 shell,您可能可以自己设置您的公钥。只需从启动连接的机器上获取 ~/.ssh/id_[dr]sa.pub 文件,并将其放在远程服务器上的 ~/.ssh/authorized_keys 中。 (如果您对服务器的唯一访问权限是 chroot,这可能是不可能的。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 2018-04-26
    • 2011-07-10
    • 1970-01-01
    • 2014-04-30
    • 2022-01-17
    相关资源
    最近更新 更多