How to make an Echo server with Bash?

BashTcpNetcat

Bash Problem Overview


How to write a echo server bash script using tools like nc, echo, xargs, etc capable of simultaneously processing requests from multiple clients each with durable connection?

The best that I've came up so far is

nc -l -p 2000 -c 'xargs -n1 echo'

but it only allows a single connection.

Bash Solutions


Solution 1 - Bash

If you use ncat instead of nc your command line works fine with multiple connections but (as you pointed out) without -p.

ncat -l 2000 -k -c 'xargs -n1 echo'

ncat is available at http://nmap.org/ncat/.

P.S. with the original the Hobbit's netcat (nc) the -c flag is not supported.

Update: -k (--keep-open) is now required to handle multiple connections.

Solution 2 - Bash

Here are some examples. ncat simple services

TCP echo server

ncat -l 2000 --keep-open --exec "/bin/cat"

UDP echo server

ncat -l 2000 --keep-open --udp --exec "/bin/cat"

Solution 3 - Bash

In case ncat is not an option, socat will also work:

socat TCP4-LISTEN:2000,fork EXEC:cat

The fork is necessary so multiple connections can be accepted. Adding reuseaddr to TCP4-LISTEN may be convenient.

Solution 4 - Bash

netcat solution pre-installed in Ubunutu

The netcat pre-installed in Ubuntu 16.04 comes from netcat-openbsd, and has no -c option, but the manual gives a solution:

sudo mknod -m 777 fifo p
cat fifo | netcat -l -k localhost 8000 > fifo

Then client example:

echo abc | netcat localhost 8000

TODO: how to modify the input string value? The following does not return any reply:

cat fifo | tr 'a' 'b' | netcat -l -k localhost 8000 > fifo

The remote shell example however works:

cat fifo | /bin/sh -i 2>&1 | netcat -l -k localhost 8000 > fifo

I don't know how to deal with concurrent requests simply however.

Solution 5 - Bash

what about...

#! /bin/sh

while :; do
/bin/nc.traditional -k -l -p 3342 -c 'xargs -n1 echo'
done

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRoskotoView Question on Stackoverflow
Solution 1 - BashDavid CostaView Answer on Stackoverflow
Solution 2 - BashdouywView Answer on Stackoverflow
Solution 3 - BashCaesarView Answer on Stackoverflow
Solution 4 - BashCiro Santilli Путлер Капут 六四事View Answer on Stackoverflow
Solution 5 - BashMohan NbsView Answer on Stackoverflow