【问题标题】:Redirect stdout to a running process将标准输出重定向到正在运行的进程
【发布时间】:2012-08-31 21:48:24
【问题描述】:

我知道如何将标准输出重定向到文件,但是否可以将标准输出重定向到进程(Linux 环境)?

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

谢谢!

【问题讨论】:

  • 我能想到一些奇怪的游戏,我会尝试使用命名管道来玩 - 但它不会很漂亮。
  • 这是准无关的,但我不能推荐这篇文章足够linusakesson.net/programming/tty/index.php。它解释了为什么下面的命名管道解决方案有效。

标签: bash redirect stdout


【解决方案1】:

有时像个把戏

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. 你已经完成了。

一些注意事项:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 2022-12-14
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 2013-08-20
    相关资源
    最近更新 更多