如何通过netcat和fifo连接2个远程进程?

时间:2012-01-11 08:48:49

标签: process fifo netcat

在HostA上,我有一个执行I / O的进程procA,如下所示:

#!/bin/bash
while sleep 1 ; do
  # Consume input *if available*
  if read -t 0.5 x; then  # a timed-read
    # If input is available, output it.
    echo "HostA Input: $x"
  fi

  # Produce some output.
  echo "HostA Output: $(date)"
done

在HostB上,我有一个非常相似的过程procB,唯一的区别是procB用前缀HostB标记其输入/输出(而不是前缀{{1} }})。

现在,我想使用netcat程序(HostA)将/usr/bin/nc的标准输出发送到procA的标准输出,将procB的标准输出发送到{ {1}}的标准。我对这一切的期望是HostA的输出应该出现在HostB上,HostB的输出应该出现在HostA上......就像跟随对象的规范procB示例一样同伴聊天:

procA

但是,当我尝试通过使用流程nc[HostB]$ nc -l 4000 [HostA]$ nc HostB 4000 替换两个主机上的人员来扩展上述规范示例时,它不起作用:< / p>

HostB

procA

HostA

procB

备注:

  1. 我已验证端口4000在HostB上已打开。
  2. 单向通信,如下所示,似乎有用
  3. HostB

    $ mkfifo p
    $ ./procB <p | nc -l 4000 >p
    <WHY NO OUTPUT HERE??>
    

    HostA

    $ mkfifo p
    $ ./procA <p | nc HostB 4000 >p
    <WHY NO OUTPUT HERE??>
    

    现在,我知道$ mkfifo p $ ./procB <p | nc -l 4000 >p 附带了一个INSECURE选项$ ./procA | nc HostB 4000 HostB Output: Wed Jan 11 13:53:37 IST 2012 HostB Output: Wed Jan 11 13:53:39 IST 2012 HostB Input: HostA Output: Wed Jan 11 13:55:02 IST 2012 HostB Output: Wed Jan 11 13:53:40 IST 2012 HostB Input: HostA Output: Wed Jan 11 13:55:04 IST 2012 HostB Output: Wed Jan 11 13:53:41 IST 2012 HostB Input: HostA Output: Wed Jan 11 13:55:05 IST 2012 HostB Output: Wed Jan 11 13:53:42 IST 2012 ^C ,如果在nc二进制文件中启用它,可以某种方式使用它,但假设我没有-e 1}}选项可用,如何通过nc将2个远程进程相互连接?基本上,我上面出错的地方?为什么我上面指出的地方没有输出?非常感谢提前。

1 个答案:

答案 0 :(得分:0)

上面描述的行为实际上是正确的行为,只是我没有意识到它是。

无论我在哪里抱怨<WHY NO OUTPUT HERE??>,都是因为终端的标准输出被重定向到本地的FIFO。 (难怪,终端上没有看到任何东西!)

此外,在上面的注释(2)中,通信是单向的并不是真的;它是非常双向的,只是你不能再看到HostB上的任何输出,因为stdin和stdout已经从终端重定向到fifo。因此,您正确在HostA上查看procB的输出,这只是HostA上procA的输出,发送到HostB上的procB {{1}输入!

哇!

修改 要实际查看每个终端上的输出,请使用procB,如下所示:

在HostB上:

tee

在HostA上:

$ mkfifo p
$ ./procB <p | nc -l 4000 | tee p