Yesterday I wanted to move an 2.3 GiByte VMware image from one Ubuntu System to another. At first I tried SFTP but
it's more than slow (1 MiByte/s on a 100 MBit/s connection). The next logical step would have been to use Samba or
NFS but I don't like both of them…
This is where netcat
comes in handy. netcat
is a small Unix/Linux command line tool that lets you pipe data over a
network connection (among many other things). The cool thing: it's quite simple.
First listen on the server
netcat -l -w 2 1111 > vm.zip
The -l
parameter makes netcat
listen for incoming data while -w 2
tells netcat
to automatically close the
connection 2 seconds after data stopped coming in. 1111
at last is the port number where netcat
actually listens.
All data received is then stored in the file vm.zip
.
Then send the data from the client
netcat 192.168.0.1 1111 < vm.zip
This one's straight forward: give netcat
the IP address and port where the other system's listening
(192.168.0.1 1111
) and feed it with data (< vm.zip
).
This's it
This little trick gave me a transfer rate from about 7 to 9 MiByte/s. Much better than SFTP.
Of course this netcat styles of data transfer has it's drawbacks. Theres no real protocol involved so it's somewhat vague.
On the positive side attackers will have a hard time to figure out what the heck you're sending. It's also not possible to
transfer multiple files with netcat
alone but tar
can help us here:
Server:
netcat -l -w 2 1111 | tar -xz
Client:
tar -cz * | netcat 192.168.0.1 1111
It's basically piping a tar archive over the network. -c
for creating the archive and -x
for extracting it. The z
parameter
of tar
gives us data compression for free. Pretty nice and basic.
On the fly check with MD5
Some Unix piping goodes makes it possible to check the data transfer on the fly with MD5. For those who don't trust netcat
. :)
Again, server:
netcat -l -w 2 1111 | tee >( md5sum > /dev/stderr ) | tar -xz
Then client:
tar -cz * | tee >( md5sum > /dev/stderr ) | netcat 127.0.0.1 1111
This transfers the data over the network and outputs an MD5 checksum afterwards. Just compare the checksums and you
know your data wasn't hurt on the way.
These commands use tee
and the bash
process substitution feature to redirect the tar archive to the md5sum
program
and netcat
on the same time (taken from Redirect output to multiple processes). It's a bit complex though so it's
better suited for shell scripts I think.