2016-03-30 220 views
1

我有一個簡單的交互式命令行界面的嵌入式Linux應用程序。重定向進程標準輸入和標準輸出到netcat

我想從telnet(或網絡,通常)訪問命令行。

但是,該過程應該在電路板開啓時以及在一個獨特的實例中開始。因此,下面netcat命令不是一個選項:

nc -l -p 4000 -e myapp 

我可以做

nc -l -p 4000 | myapp 

遠程命令發送到MYAPP,但這種方式我不能看到myapp輸出。

有沒有什麼辦法可以將 stdin和stdout重定向到netcat

謝謝。

回答

3

我發現,通過使用bash V> = 4.0,我可以使用coproc

#!/bin/bash 

coproc myapp 
nc -kl -p 4000 <&"${COPROC[0]}" >&"${COPROC[1]}" 
+0

好主意。 ''&& $ {COPROC [0]}「>&$ $ {COPROC [1]}」'部分看起來沒有必要,因爲bash會爲你做這件事。應該只是'2>&1'將'stderr'重定向到'stdout'。 –

+0

@MaximEgorushkin我只用'2>&1'試過,但恐怕它不起作用... –

5

有沒有辦法既stdin和stdout重定向到netcat的

socat,這是一種更先進的netcat。您可以使用它重定向stdinstdout。例如爲:

socat TCP4-LISTEN:5556,reuseaddr,fork EXEC:"cat - /etc/redhat-release" 

在上述cat讀取stdin/etc/redhat-release並且將它們輸出到stdout

然後嘗試使用:

$ echo "hello" | nc 127.0.0.1 5556 
hello 
Fedora release 22 (Twenty Two) 

$ echo "hello 2" | nc 127.0.0.1 5556 
hello 2 
Fedora release 22 (Twenty Two) 
+0

隨着你建議的命令,我的應用程序纔會啓動當一個客戶端連接時(就像nc -e一樣)。我希望能夠在沒有任何連接的情況下啓動我的流程。 –

+0

@DanielePallastrelli然後你的應用程序必須是一個TCP服務器。您不能重定向(至少很容易)正在運行的進程的打開文件描述符。 –

+0

那麼......當我啓動我的應用程序時,我可以直接將stdin/out重定向到socat,而socat則作爲服務器。連接可以稍後到達。 –

相關問題