Redirect process stdin and stdout to netcat

2019-04-02 08:10发布

问题:

I have an embedded linux application with a simple interactive command line interface.

I'd like to access the command line from telnet (or network, in general).

However, the process should be started when the board turns on, and in a unique instance. So, the following netcat command is not an option:

nc -l -p 4000 -e myapp

I can do

nc -l -p 4000 | myapp

to send remote commands to myapp, but this way I can't see myapp output.

Is there any way to redirect both stdin and stdout to netcat?

Thanks.

回答1:

I found that by using bash v. >= 4.0 I can use coproc:

#!/bin/bash

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


回答2:

Is there a way to redirect both stdin and stdout to netcat

There is socat, which is a more advanced netcat. You can redirect both stdin and stdout with it. E.g.:

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

In the above cat reads stdin and /etc/redhat-release and outputs them into stdout.

And then try using that:

$ 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)


回答3:

You can use ncat (from nmap package: apt install nmap) for that as well as follow:

ncat -lnvp 443 -e myapp

don't forget to fflush(stdout); after each printf("%s",str); in your app