100

Is there a way to quickly bind to a TCP port/ip address and simply print out all information to STDOUT? I have a simple debugging solution which writes things to 127.0.0.1:4444 and I'd like to be able to simply bind up a port from bash and print everything that comes across. Is there an easy way to do this?

1

4 Answers 4

137
$ nc -k -l 4444 > filename.out

see nc(1)

Sign up to request clarification or add additional context in comments.

4 Comments

Any way to do it that doesn't require it to run in a loop, ie bind until killed? I'm repeatedly connecting and disconnecting to the socket and nc dies if I don't run it like this: while true; do nc -l 4444; done.
On some distros you'll need to change it to 'nc -k -l -p 4444'.
If you use ncat instead of nc, you can have multiple concurrent connections while using the exact same syntax.
yes, use ncat instead of nc (it comes bundled with nmap and it's a modern day incarnation of nc)
61

Just because you asked how to do it in bash, though netcat answer is very valid:

  $ exec 3<>/dev/tcp/127.0.0.1/4444
  $ cat <&3

4 Comments

But that doesn't work for listening. I don't think its possible to listen using strictly bash
This solution indeed requires a listening server. Bash cannot do this by means of /dev/tcp as explained in unix.stackexchange.com/a/49947/13746
Listening? That’s what xinetd is for! :D
@Evi1M4chine wow, that's a blast from the past...
19

That is working as you expecting:

 nc -k -l 4444 |bash

and then you

echo "ls" >/dev/tcp/127.0.0.1/4444

then you see the listing performed by bash.

[A Brief Security Warning]
Of course if you leave a thing like this running on your computer, you have a wide open gateway for all kinds of attacks because commands can be sent from any user account on any host in your network. This implements no security (authentication, identification) whatsoever and sends all transmitted commands unencrypted over the network, so it can very easily be abused.

3 Comments

If you don't have /dev/tcp, you can run: echo "ls" | nc 127.0.0.1 4444
@fzbd: there is no /dev/tcp. this is special bash file, so ls will not show this
@MarcinFabrykowski Correct, but if you run these commands on other shells, there is no handler available. It can also fail if your bash isn't compiled with --enable-net-redirections.
10

Adding an answer using ncat that @Freedom_Ben alluded to:

ncat -k -l 127.0.0.1 4444

and explanation of options from man ncat:

-k, --keep-open            Accept multiple connections in listen mode
-l, --listen               Bind and listen for incoming connections

1 Comment

ncat comes with nmap and supports concurrent connections, while the legacy nc command does not.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.