Linux netcat

From Ever changing code
Jump to navigation Jump to search

Netcat in slow translation is the network version of cat command.

Send a string over a network

Start listening for a connection. The command below listen on TCP port 4444 for a new connections and displays any incoming data to a screen (default STDOUT) then it stops when the connection closes. Use -k to continue listening after a transfer completes.

listen@server1# nc -l 4444 

Send string to the listening server by redirecting the string(data) into nc

send@server2# echo "Hello Tom!" | nc server1.example.com 4444

Send Files through Netcat

This example will redirect any incoming data to a file

listen@server1# nc -l 4444 > file1.txt

Simple one-shoot off web server

This creates a simple web server

listen@server1:$ nc -kl 8080 < index.html #works in Chrome
listen@server1:$ { echo -ne "HTTP/1.0 200 OK\r\nContent-Length: $(wc -c <index.html)\r\n\r\n"; cat index.html; } | nc -l 8080
listen@server1:$ { echo -ne "HTTP/1.0 200 OK\r\n\r\n"; cat index.html; } | nc -l -p 8080 #improved version to correctly respond to a single HTTP1.1 request

This is a simple index.html file

cat >> index.html <<EOL
<html>
    <head>
        <title>Test Page</title>
    </head>
    <body>
       <nowiki><h1>Level 1 header</h1></nowiki>
       <nowiki><h2>Subheading</h2></nowiki>
       <nowiki><p>Normal text here</p></nowiki>
    </body>
</html>
EOL

Please be aware that nc is not aware of HTTP1.1 specification and is not sending 200 Ok, therefore it will not work out of box in curl, wget or lynx. Therefore please try this in a full flagged web browser like Chrome.

client@server2:$ curl -v --noproxy "server1.example.com" http://server1.example.com:8080 #don't use proxy to access "server1"
client@server2:$ lynx http://server1.example.com:8080

PHP simple web server

Since version 5.4.0 PHP also has a built-in web server. If you use an IP address the website will be available over a network

$ sudo -E apt-get install php5-cli #install PHP
$ php -S localhost:8000            #start a web server with a default index.html as a home page

Check UDP ports (-u) 80-90 are open using zero mode I/O (-z)

nc -vzu 192.168.0.1 <nowiki>80-90</nowiki>

Note that UDP tests will always show as "open". The -uz argument is useless.

Test if UDP port is open: simple UDP server and client

This test is useful if you have shell access to the server that should be tested, but you do not know whether there is a firewall blocking a specific UDP port on the server. On the server listening host

nc -u -l -p 5140
# note: some of 'nc' instances do not accept -ul syntax
#       some of 'nc' instances do require '-p' <PORT> before port number


On the client sending host, note that fluentd.monitoring.svc.cluster.local is the hostname of the listening host:

nc -u fluentd.monitoring.svc.cluster.local 5140


If text typed on the sending host (type something and hit enter) is displayed also on the listening host, then the UDP port 7000 is open. If it is not open, you will get an error such as "Connection refused".

There is a caveat. On some machines, IPv6 may be the default IP version to use by netcat. Thus, the host specified by the hostname is contacted using IPv6, and the user might not know about this. Ports may appear closed in the test, even though they would be open when using IPv4. This can be difficult to notice and may cause the false impression that the port is blocked, while it is actually open. You can force the use of IPv4 by using adding -4 to the options of the nc commands.

References