如何将输入从一个 SSH 会话传输到另一个会话?使用先进先出?

如何将输入从一个 SSH 会话传输到另一个会话?使用先进先出?

不久前,我看到一篇关于使用fifo?将消息从一个控制台窗口传输到另一个控制台窗口的文章。

我以前没有使用过它,也找不到我的文章链接。我该如何设置?

我希望打开两个控制台进行日志记录,并让一个控制台显示从另一个控制台发送的日志消息(实时)。

答案1

当通过 mkfifo 创建命名管道(或者您可以执行的任何其他操作)时,它会创建一个管道“文件”,该文件将保留在原处,直到它被删除(或者,在某些情况下,直到您的计算机重新启动,如果您忘记了)去掉它)。您可以简单地使用 mkfifo 创建自己的命名管道,因为它需要很少的参数,如下所示:

host # mkfifo -m 777 /tmp/corncob

这就是创建命名管道 /tmp/corncob 所需的全部内容。用于设置权限的 -m 标志不是必需的。通常,如果不包含它,新命名管道的默认权限集将是系统的默认权限集。另外,您还可以传递 -m 标志并设置 alpha 权限,而不是八进制,例如:

host # mkfifo -m a=rwx /tmp/corncob

创建完全相同的东西。您可以像删除文件一样删除命名管道。 rm,然后就消失了。

关于命名管道,您应该注意的一件事是,它们通常(据我所知)一次只能通过自身完全传递一个输入/输出流。也就是说,如果有一个进程向命名管道发送输入,并且有两个进程从命名管道读取数据,则只有其中一个读取进程会收到输出。还应该注意的是,如果存在这种情况,一旦接收输出的原始进程退出,另一个进程将开始从命名管道接收输出(如果它仍在尝试从中读取)。这是一个很长的句子还是我只是打字太快了? ;)

下面是我的意思的一个例子:

host-term1 # while :;do echo a b c d e >/tmp/corncob;sleep 15;done

host-term2 # tail -f /tmp/corncob
a b c d e
a b c d e
a b c d e
a b c d e
a b c d e
a b c d e
a b c d e
a b c d e

host-term3 # tail -f /tmp/corncob

host-term2 # ^C

host-term3 #
^C
a b c d e
a b c d e
a b c d e
a b c d e

通过

答案2

使用该mkfifo命令创建一个 fifo 队列,将输出通过管道传输到该队列(tee如果您希望在两个终端上都输出,请使用而不是重定向),然后将cat其输出到另一个终端上。请注意,fifo 会阻塞,因此您必须确保使用它的方式不会停止程序。

相关内容