Linux netcat
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
- Netcat Wikipedia