1

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

#!/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标记它的输入/输出。HostBHostA

现在,我想使用netcat/usr/bin/nc程序(我对这一切的期望是 HostA 的输出应该出现在 HostB 上,而 HostB 的输出应该出现在 HostA 上......就像在以下点对点聊天的规范示例中发生的那样:procAprocBprocBprocAnc

[HostB]$ nc -l 4000

[HostA]$ nc HostB 4000

但是,当我尝试通过用进程替换两个主机上的人来扩展上述规范示例时,procA如下procB所示,它不起作用

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??>

笔记:

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

HostB上:

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

HostA上:

$ ./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带有一个 INSECURE 选项-e,如果在您的二进制文件中启用它可以以某种方式使用nc,但假设我没有可用的-e选项,我如何通过 2 个远程进程相互连接nc?基本上,我在上面哪里出错了?为什么我上面指出的地方没有输出?提前谢谢了。

4

1 回答 1

0

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

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

此外,在上面的注释(2)中,通信是单向的并不是真的。它是非常双向的,只是您再也看不到 HostB 上的任何输出,因为 stdin 和 stdout 已从终端重定向到 fifo。因此,您正确地看到procB了 HostA 上的输出,这只不过是procAHostA 上的输出发送到procBHostB 上作为procB' 输入!

哇!

编辑: 要实际查看每个终端上的输出,请使用tee,如下所示:

在主机 B 上:

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

在主机 A 上:

$ mkfifo p
$ ./procA <p | nc HostB 4000 | tee p
于 2012-01-12T06:09:40.003 回答