2012-01-11 95 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 
相關問題