Why use netcat?
Netcat is easily used with command line and is particularly handy for use in any scripting task that requires transferring data or listening for requests. This powerful little utility is often referred to as the "Swiss Army Knife" of networking tools and is arguably the single most useful tool for interacting with systems across a network.
Some people may ask "why bother using netcat when you can use ssh
and scp
?". The answer is that netcat (or nc
, which the program is also called) is installed on a lot of Linux boxes by default, sshd
is not.
Hence it can come in handy if you don't have access or permissions to install sshd
, or if you don't want to install sshd
at all.
Getting started
The netcat utility is called nc
, check if you have it installed:
which nc
If you need to install it use:
sudo apt-get install netcat
Basic chat server
Lets try it out using a simple hello world test.
On one of your machines for example 192.168.0.31 run the following command:
nc -l 2222
This will simply listen on port 2222 for any incoming data.
On another machine run:
nc 192.168.0.31 2222
Next, type anything at all - for example "hello world!" and you'll see it echoed on the listener's shell.
Any text entered into either of the shells ends up being displayed on the other machine also.
File transfer - from the server side (listener)
Now onto something more useful, we'll transfer a file from one box (the server) to another box (the client). So as soon as the server receives a connection, the file gets transferred.
On the machine where the file exists run the following command:
nc -l 2222 < filename
On the box where you'd like to receive the file, run:
nc 192.168.0.31 2222 > any_file_name
Note that if you don't point the data to any_filename, the data will just be displayed in the shell at the receiving end. Also, obviously the receiving file any_file_name can be any file name (but is normally the same as the original).
If you wanted to append the contents of filename to an already existing any_filename, you could use this instead:
nc 192.168.0.31 2222 >> any_file_name
Note the '>>' rather than just a single '>' (the '>>' appends while the > replaces).
File transfer - from the client side
To transfer a file in the opposite direction use:
nc -l 2222 > file_copy
On the client side (sender in this case) use:
cat file_to_send | nc 192.168.0.31 2222
To keep the listener open for further data, use the the -k
option:
nc -lk 2222 >> file
Some people actually use this as a very basic honeypot to catch people snooping on their network.
Note:
One thing to bear in mind when using netcat is that no encryption is used, so sensitive data should not be transferred using netcat. That's why there is an encrypted version of the utility called cryptcat.
Also, for those of you who were used to the old style netcat there is a version available called nc.traditional
(which supports the -e
and -c
options to execute commands!).
Thanks to Hobbit and Eric Jackson for their work with netcat.