15

I'd like to take a program P that reads from stdin & writes to stdout, but connect it to nc or whatever such that it reads from a certain port and outputs to another port.

# The reading is easy, here P reads from port 50505
nc -l 50505 | P

How do I get it to write back to say port 60606?

3
  • Your question is unclear as stated. You mean that someone may open 2 TCP connections to your machine, one to port 50505 and another to port 50506, send data on the first one intended to be fed to P and expect to read the output of P from the second TCP connection? Why the UDP tag? Commented Nov 10, 2014 at 21:52
  • Yes! As far as UDP, I think I wanted ports, but that wasn't an existing keyword, so I thought TCP, and I think I added UDP out of reflex. Commented Nov 10, 2014 at 22:03
  • See Can I pipe/redirect a console application through netcat so it can be used remotely? (on SU). Commented Nov 10, 2014 at 22:18

2 Answers 2

17

I you mean that someone may open 2 TCP connections to your machine, one to port 50505 and another to port 60606, send data on the first one intended to be fed to P and expect to read the output of P from the second TCP connection, then that would be:

< /dev/null nc -q -1 -l 50505 | P | nc -l 60606 > /dev/null

Or with socat:

socat -u tcp-listen:50505,reuseaddr - | P | socat -u - tcp-listen:60606,reuseaddr

For P to send its output back to the same connection:

socat tcp-listen:50505,reuseaddr exec:P
1
  • If you want socat to connect to a remote host instead of listening for an incoming connection, replace tcp-listen:PORT with tcp:HOST:PORT Commented Dec 25, 2020 at 5:45
3

You don't need nc in order to work with ports. bash can do that itself:

Bash handles several filenames specially when they are used in redirections, as described in the following table:

/dev/fd/fd
    If fd is a valid integer, file descriptor fd is duplicated.
/dev/stdin
    File descriptor 0 is duplicated.
/dev/stdout
    File descriptor 1 is duplicated.
/dev/stderr
    File descriptor 2 is duplicated.
/dev/tcp/host/port
   If host is a valid hostname or Internet address, and port is an integer 
   port number or service name, bash attempts to open a TCP connection to
   the corresponding socket.
/dev/udp/host/port
    If host is a valid hostname or Internet address, and port is an integer 
    port number or service name, bash attempts to open a UDP connection to
    the corresponding socket.
3
  • 3
    /dev/tcp is often disabled and can't be used for listening. You need zsh if you want a shell that can create listening tcp sockets. Commented Nov 10, 2014 at 22:30
  • @StéphaneChazelas I have to admit I never tried. It doesn't say anything about this restriction in the man page, does it? Commented Nov 10, 2014 at 22:51
  • Well, how would you do it? A listener socket is a door to create more accepting sockets, redirections don't work as well for that. zsh uses a builtin for that (ztcp -l for listening and ztcp -a to accept connections on the listening socket). Commented Nov 10, 2014 at 23:02

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.