Server script without built-in sockets

Kurt Granroth kurt+plug-discuss at granroth.com
Tue Oct 23 16:40:11 MST 2007


Kurt Granroth wrote:
> Here's an esoteric question for those of you wanting a challenge.  How
> can I turn an arbitrary non-networked bash script into a server?
[snip]

Found it!

$ mkfifo sock
$ netcat -lp 16789 < <(script.sh <sock 2>&1) >sock

Craig's suggestion on 'expect' actually put me on the right track.  I
got to thinking that I could start up netcat in a background process and
somehow communicate with it.  I couldn't think of how to do it until
last night when I was drifting off to sleep, a thought just popped into
my brain "named pipes"... and then I went to sleep.

When I woke up this morning, I puzzled on what that cryptic "named
pipes" could mean when it hit me that I could redirect stdin and stdout
from netcat using a named pipe (fifo) and use that to communicate with
the controlling process!

Sweet.

It took me a little longer than I'd like to find the final version of
that line.  The problem that eluded me was how to get *input* from the
fifo.  A little process substitution was just was the doctor ordered.

If that line looks like random characters to you, here's an explanation.

$ mkfifo sock

This creates a "named pipe" which is a special file that can be used to
communicate between processes.  You can experiment with this yourself
thusly:

1. In one window, type "mkfifo fifo; cat < fifo"
2. In another window, type "echo 'Hello, world' > fifo"
3. Notice that it prints out in the 'cat' window

$ netcat -lp 16789

Starts up netcat in listening mode on port 16789

$ netcat -lp 16789 >sock

Redirects all output received by netcat to the named pipe 'sock'.  That
means that anything that is doing a 'read' on 'sock' will get whatever
netcat receives

$ ... <(script.sh <sock 2>&1) ...

A little black-magic.  This opens up 'script.sh' in a sub-process and
gives it the 'sock' fifo to use as stdin.  Handily, my script does a
'read' on stdin so it hangs until there is some data on fifo.  The final
2>&1 redirects stderr to stdout so that everything is going out on one f
file descriptor

Putting it altogether:

$ netcat -lp 16789 < <(script.sh <sock 2>&1) >sock

script.sh is started up first in a sub-process and waits while reading
'sock'.  When netcat receives some data over the network, it passes it
off to 'sock'.  script.sh now reads in the data as if it was normal
stdin and process it.  It's output is redirected to stdout which is now
stdin for netcat.  netcat pushes the output as its response over the
network.

Simple :-)

Kurt

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 249 bytes
Desc: OpenPGP digital signature
Url : http://lists.PLUG.phoenix.az.us/pipermail/plug-discuss/attachments/20071023/0a40a8c5/attachment.pgp 


More information about the PLUG-discuss mailing list