在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
备注:
在 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个远程进程相互连接?基本上,我上面出错的地方?为什么我上面指出的地方没有输出?非常感谢提前。
答案 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