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

cwd*_*cwd 3 logs terminal pipe

不久前,我看到了一篇关于使用fifo?

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

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

mar*_*ark 6

创建命名管道时,通过 mkfifo(或者您可以通过其他方式创建),它会创建一个管道“文件”,该文件在被删除之前一直保留在原位(或者,在某些情况下,直到您的机器重新启动,如果您忘记去掉它)。您可以简单地使用 mkfifo 创建自己的命名管道,因为它只需要很少的参数,如下所示:

host # mkfifo -m 777 /tmp/corncob
Run Code Online (Sandbox Code Playgroud)

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

host # mkfifo -m a=rwx /tmp/corncob
Run Code Online (Sandbox Code Playgroud)

创建完全相同的东西。您可以像删除文件一样删除命名管道。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
Run Code Online (Sandbox Code Playgroud)

通过