2012-01-11 26 views
1

在玉簪,我有一个过程,procA,即执行I/O,就像这样:如何通过netcat和fifo将2个远程进程连接在一起?

#!/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(而不是前缀HostA)。

现在,我想使用的netcat程序(/usr/bin/nc)发送procA的标准输出到procB的标准输入,并procB的标准输出到procA的标准输入。我在这个所有人意料的是,主机A的输出应该出现在主机B和主机B的输出应该出现在主机A ...多会发生在以下规范nc例如对等网络聊天的

[HostB]$ nc -l 4000 

[HostA]$ nc HostB 4000 

但是,当我试图通过与进程procAprocB两个主机代替人类延长上述典型的例子如下,它没有工作

主机B

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

,并在主机A

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

注:

  1. 我已经验证端口4000是主机B上的开放。
  2. 单向通信,如下面似乎工作

主机B

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

主机A

$ ./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选项可用,如何通过nc将两个远程进程连接到彼此?基本上,我上面哪里出错了?为什么我在上面指出的地方没有输出?提前谢谢了。

回答

0

上述行为实际上是正确的行为,只是我没有意识到这一点。

无论我在抱怨<WHY NO OUTPUT HERE??>,它都是因为终端的stdout已被重定向到本地fifos。 (难怪,你在终端上看不到任何东西!)

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

哇!

编辑: 要实际看到每个终端上的输出,使用tee,像这样:

hostB上:

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

hostA上:

$ mkfifo p 
$ ./procA <p | nc HostB 4000 | tee p 
相关问题