将stdout重定向到正在运行的进程

时间:2012-08-31 21:48:25

标签: bash redirect stdout

我知道如何将stdout重定向到文件,但是是否可以将stdout重定向到进程(linux环境)?

例如,如果我通过“〜^ Z”将活动的SSH会话移动到后台,有没有办法在我的本地主机上启动另一个程序并将其stdout重定向到SSH会话?

谢谢!

1 个答案:

答案 0 :(得分:3)

有时像

这样的伎俩
echo "something" > /proc/pid-of-process/fd/0

有效,但如果它们与伪终端相关联,则不会。

所以,这是实现你想要的一种方式。

  1. **配置SSH连接以使用证书/无密码登录。
  2. 创建命名管道(例如mkfifo mypipe
  3. 使用tail从管道读取并将其传递给SSH进程,例如:

    tail -f mypipe | ssh -t -t user@somehost.com

  4. 将您想要进入ssh会话的任何内容发送到命名管道,例如:

    echo "ls -l" > mypipe

    因此,如果您需要从其他程序中管道填充,那么您只需要

    ./my-program > /path/to/mypipe

  5. 你已经完成了。

  6. 一些注意事项:

    1. **是可选的,但如果不这样做,则必须在启动SSH会话的终端上键入密码,不能通过管道传递密码。实际上,如果您尝试,它将在SSH连接完成后以纯文本形式通过管道显示。
    2. 您的SSH会话现在仅与命名管道一样安全。只是一个抬头。
    3. 从原始终端连接后,您将无法使用SSH会话。你必须使用命名管道。
    4. 您可以随时按住原始终端中的SSH进程来终止它并恢复终端的功能。
    5. 任何输出都会显示在原始终端上 - 可能很明显,但我只想指出它。
    6. -f tail选项是防止SSH进程在管道为空时接收EOF所必需的。还有其他方法可以防止管道关闭,但在我看来这是最简单的。
    7. -t -t的{​​{1}}选项会强制进行tty分配,否则会因为stdin在您的情况下使用管道而抱怨。
    8. 最后,几乎肯定有更好的方法可以做你想做的事情 - 你应该考虑找到它,如果这是严重/长期的。