Linux Netcat command – The swiss army knife of networking

By | 17/12/2012

Swiss Army Knife of networking netcat is a versatile tool that is able to read and write data across TCP and UDP network . Combined with other tools and redirection it can be used in number of ways in your scripts. You will be surprised to see what you can accomplish with Linux netcat command.

What netcat does it opens the connection between two machines and give back two streams. After that everything is up to your imagination. You can build a server, transfer files, chat with friends, stream media or use it as a standalone client for some other protocols.

Here are some of the usage of netcat.

[A( B(]

Linux netcat command examples

1. Port scanning

Port scanning is done by system admin and hackers to find the open ports at some machine. It helps them to identify the venerability in the system.

$nc -z -v -n 21-25

It can work in both TCP and UDP mode, default is TCP mode, to change to udp use -u option

z option tell netcat to use zero IO .i.e the connection is closed as soon as it opens and no actual data exchange take place.
v option is used for verbose option.
n option tell netcat not to use the DNS lookup for the address.

This command will print all the open ports between 21 to 25.

Banner is a text that services sends when you connects to them. Banner are very usefull when you are trying to velberability in the system as it identify the type and version of the services. NOTE not all services may send banner.
Once You have found the open ports you can easily grab the service banner by connecting to them using netcat.

$ nc -v 21

The Linux netcat command will connect to open port 21 and will print the banner of the service running at that port.

2. Chat Server

If you want to chat with your friend there are numerous software and messenger services available at your disposal.But what if you do not have that luxury anymore like inside your computer lab, where all outside connections are restricted, how will you communicate to your friend who is sitting in the next room. Don’t worry my friend because netcat has a solution for you just create a chat server and a predetermined port and he can connects to you.


$nc -l 1567

The Linux netcat command starts a tcp server at port 1567 with stdout and stdin for input output stream i.e. The output is displayed at the shell and input is read from shell.


$nc 1567

After this whatever you type on machine B will appear on A and vice-versa.

3. File transfer

Most of the time we are trying to transfer file over network and stumble upon the problem which tool to use. There are again numerous methods available like FTP, SCP, SMB etc. But is it really worth the effort to install and configure such complicated software and create a sever at your machine when you only need to transfer one file and only once.

Suppose you want to transfer a file “file.txt” from A to B
Anyone can be server or client, lets make A as server and B as client.


$nc -l 1567 < file.txt


$nc -n 1567 > file.txt

Here we have created a server at A at redirected the netcat input from file file.txt, So when any connection is successfull the netcat send the content of the file.

Again at the client we have redirect the output of netcat to file.txt. When B connects to A , A sends the file content and B save that content to file file.txt.

It is not necessary do create the source of file as server we can work in the eopposeit order also. Like in the below case we are sending file from B to A but server is created at A. This time we only need to redirect ouput of netcat at to file and input at B from file.

B as server

$nc -l 1567 > file.txt


$nc 1567 < file.txt

4. Directory transfer

Sending file is easy but what if we want to send more than one files, or a whole directory, its easy just use archive tool tar to archive the files first and then send this archive.

Suppose you want to transfer a directory over the network from A to B.


$tar -cvf – dir_name | nc -l 1567


$nc -n 1567 | tar -xvf -

Here at server A we are creating the tar archive and redirecting its outout at the console through -. Then we are piping it to netcat which is used to send it over network.

At Client we are just downloading the archive file from the server using the netcat and piping its output tar tool to extract the files.

Want to conserve bandwidth by compressing the archive, we can use bzip2 or other tool specific to content of files.


$tar -cvf – dir_name| bzip2 -z | nc -l 1567

Compress the archive using the bzip2 utility.


$nc -n 1567 | bzip2 -d |tar -xvf -

Decompress the archive using bzip2 archive

5. Encrypt your data when sending over the network

If you are worried about the security of data being sent over the network you can encrypt your data before sending using some tool like mcrypt.


$nc localhost 1567 | mcrypt –flush –bare -F -q -d -m ecb > file.txt

Encrypt the data using the mcrypt tool.


$mcrypt –flush –bare -F -q -m ecb < file.txt | nc -l 1567

Decrypt the data using the mcrypt tool.
Both the above commands will propmt for passowrd make sure to use the same password on both.

Here we have used mcrypt for encryption but any tool can be used.

6. Stream a video

Not the best method to stream but if the server doesn’t have the specific tools, then with netcat we still have hope.


$cat video.avi | nc -l 1567

Here we are just reading the video file and redirecting its output to netcat

$nc 1567 | mplayer -vo x11 -cache 3000 -

Here we are reading the data from the socket and redirecting it to mplayer.

7. Cloning a device

If you have just installed and configured a Linux machine and have to do the same to other machine too and do not want to do the configuration again. No need to repeat the process just boot the other machine with some boot-able pen drive and clone you machine.

Cloning a linux PC is very simple. Suppose your system disk is /dev/sda

$dd if=/dev/sda | nc -l 1567


$nc -n 1567 | dd of=/dev/sda

dd is a tool which reads the raw data from the disk, we are just redirecting its output stream through a netcat server to the other machine and writing it to the disk, it will copy everything along with the partition table. But if we have already done the partition and need to move only the root partition we can change sda with sda1, sda2 etc depending where out root is installed.

8. Opening a shell

We have used remote Shell using the telnet and ssh but what if they are not installed and we do not have the permission to install them, then we can create remote shell using netcat also.

If your netcat support -c and -e option (traditional netcat)

$nc -l 1567 -e /bin/bash -i


$nc 1567

Here we have created a netcat server and indicated it to run /bin/bash command when connection is successful.

If netcat doesn’t support -c or -e options(openbsd netcat) we can still crate remote shell.

$mkfifo /tmp/tmp_fifo
$cat /tmp/tmp_fifo | /bin/sh -i 2>&1 | nc -l 1567 > /tmp/tmp_fifo

Here we have created a fifo. Then we have piped the content of this fifo file using pipe command to a shell 2>&1 is used to redirect stderr to same file where stdout is redirected which is piped to netcat server running at port 1567. Now here again we have redirected the output of netcat to fifo file.


The input received from network is written to fifo file.

The fifo file is read by cat command and it content is sent to sh command.

Sh command processes the received input and write it back to netcat.

Netcat send the output over the network to client.

All this is possible because pipe causes the command to run in parallel. The fifo file is used instead of regular file because the fifo causes the read to wait while if it was an ordinary file the cat command would have ended as soon as started reading an empty file.

At client is just as simple as conecting to server

$nc -n 1567

And you will get a shell prompt at the client

9. Reverse Shell

Reverse shell are shell opened at the client side. Reverse shell are so named because unlike other configuration here server is using the services provided by the client.


$nc -l 1567

At the client side simply tell netcat to execute the shell when connection is complete.


$nc 1567 -e /bin/bash

Now what is so special about reverse shell.
Reverse shell is often used to bypass the firewall restrictions like blocked inbound connections. For example, I have a private IP address of and I connect to outside network with a proxy server. If I want to access a shell at this machine from outside the network say, then I’ll use reverse shell for this purpose.

10. Specify Source Port

Suppose your firewall filters all ports but 25 then you need to specify the source port also with -p option

$nc -l 1567


$nc 1567 -p 25

You need root permissions to use port less than 1024.

This command will open the port 25 at the client which will be used for communication otherwise any random port can be used.

11. Specify Source Address

Suppose you have more than one addresses for your machine and you want to explicitly tell which address to use for outgoing data. Then we can specify the ip address with -s option in netcat

$nc -u -l 1567 < file.txt


$nc -u 1567 -s > file.txt

This command will bind the address

These are just some of the examples to play with netcat.
Some Other uses can be.

  •     Telnet client with -t option,
  •     HTTP client to download files,
  •     Check mail by connecting to mail server and using SMTP protocol,
  •     Stream your desktop using ffmpeg to grab our desktop and many more.

In short if you know the protocol you can implement any client using netcat as medium for network communication.


Netcat Man Page


NOTE : Enjoyed this article? Read other interesting articles on Bash Scripting  and readelf command.

17 thoughts on “Linux Netcat command – The swiss army knife of networking

  1. John Lauro

    netcat is a decent knife and can do a lot, but if you really want the swiss army knife of networking you should check out socat. It does everything netcat can, and more…

  2. djf

    Very good article – most useful – of any netcat (nc) introduction I have ever read. And useful means means that I will use it.


  3. crond

    Good one.
    Are we missing a port number, in client side of point 6 ?

    1. Rajeev Post author

      Thanks for mentioning that updated it.

  4. Miten Mehta

    we are missing -p portnum when we start server with -l. It should be nc -l -p 1234 instead of nc -l 1234.

    1. rajeev

      Miten Mehta there are many variants of netcat available which only varies in supported features and command line options.
      For example I have ubuntu and default netcat on this is netcat-openbsd, which does not need the -p option. If I want the other variant I can install netcat-traditional which requires -p option.

      You can try installing both of these and once you are comfortable with one you can set it default by using update-alternative.

  5. yop

    Like Rajeev said, you should use ncat instead of the old netcat.

    Also socat gives a lot of useful features too.

  6. Aaron Toponce

    It’s worth mentioning that when using nc(1), packets are not encrypted over the network. So, when cloning a device, to prevent plain text, you should something that encrypts the data, such as openssl(1):

    # nc -l 1337 | openssl enc -d -des3 -pass pass:password | dd of=/dev/sda bs=4k

    Then on the client:

    # dd if=/dev/sda bs=4k | openssl enc -des3 -pass pass:password | nc 1337

    If that’s too much overhead, you could always use gzip(1):

    # nc -l 1337 | gunzip | dd of=/dev/sda bs=4k

    Then on the client:

    # dd if=/dev/sda bs=4k | gzip | nc 1337

  7. Alexey

    Back in 2007 I was playing with web servers with bash and netcat:

    :;while [ $? -eq 0 ];do nc -vlp 8080 -c'(r=read;e=echo;$r a b c;z=$r;while [ ${#z} -gt 2 ];do $r z;done;f=`$e $b|sed 's/[^a-z0-9_.-]//gi'`;h="HTTP/1.0";o="$h 200 OK\r\n";c="Content";if [ -z "$f" ];then ($e $o;(for n in *;do if [ -f "$n" ]; then $e "`ls -gh \"$n\"`";fi;done););elif [ -f "$f" ];then $e "$o$c-Type: `file -ib \"$f\"`\n$c-Length: `stat -c%s \"$f\"`";$e;$e $f>&2;cat "$f";else $e -e "$h 404 Not Found\n\n404\n";fi)';done

    If you want to run in on modern debian/ubuntu, you should install more powerful version of netcat (with Hobbit’s patch that adds -c option) that was default that days (it painless procedure):

    sudo apt-get install netcat-traditional
    sudo update-alternatives --set nc /bin/nc.traditional

    More info: Code in plain text:

  8. drhowarddrfine

    Understand that netcat is a Unix utility that runs on any Unix or Unix-like system, including BSD and it also happens to run on Linux. It is not a Linux-only utility.

  9. brijesh sinha

    hi very very useful command for any person .

    thank you

  10. Muthu

    How to disable this netcat feature for a particular server?

  11. Alex

    Thanks for the info, but I need help with the following scenario:

    Multiple Boxes in different networks (ex.,,, all of those IP addresses I can access, ping, etc form my PC (ex all of the example addresses outputs raw data on port 3333
    so I can do: —-> nc 3333 | pv -b > backup.txt <—-and works perfectly.

    but I need to listen to all boxes at the same time

    I need to be able to store the data from port 3333 of all PCs to backup.txt or second option destination file can be backup1,txt, backup2.txt, etc.

    Thanks in advance


Leave a Reply

Your email address will not be published. Required fields are marked *