#!/bin/bash # # shell script to make netcat+tar file transfer similar to scp printUsage() { cat </dev/null if [ $? -ne 0 ]; then echo "ERROR : cannot connect to $ip" exit 1 fi which pv &>/dev/null if [ $? -ne 0 ]; then echo "ERROR : please install 'pv' on src before using this script" exit 1 fi ssh $user@$ip 'which screen' &>/dev/null if [ $? -ne 0 ]; then echo "ERROR : please install 'screen' on destination before using this script" exit 1 fi for i in "${src[@]}"; do if [[ (! -d "$i") && (! -f "$i") ]]; then echo "ERROR : $i : no such file or directory" exit 1 fi done ssh $user@$ip "ls $dest" &>/dev/null if [ $? -ne 0 ]; then ssh $user@$ip "mkdir -p $dest" &>/dev/null if [ $? -ne 0 ]; then echo "unable to create directory $dest at destination" exit 1 fi echo "created directory $dest" fi echo "sanity checks complete..." # transfer data for i in "${src[@]}"; do # start netcat at destination if [ $enable_compression -eq 0 ]; then echo "nc -l -p 12345 | tar xf - -C $dest" > /tmp/nct.sh scp /tmp/nct.sh $user@$ip:/tmp/ &>/dev/null ssh -f $user@$ip "screen -dm -S netcat sh /tmp/nct.sh" else echo "nc -l -p 12345 | tar xzf - -C $dest" > /tmp/nct.sh scp /tmp/nct.sh $user@$ip:/tmp/ &>/dev/null ssh -f $user@$ip "screen -dm -S netcat sh /tmp/nct.sh" fi if [ $? -ne 0 ]; then echo "ERROR : unable to start netcat at destination" exit 1 fi echo "started netcat at destination" sleep 2 # transfer data echo "[$i] data transfer in progress..." dn=$(dirname "$i") bn=$(basename "$i") cd "$dn" if [ $enable_compression -eq 0 ]; then tar cf - "$bn" | pv -s $(du -sb "$bn" | awk '{print $1}') | nc $ip 12345 &>/dev/null else tar czf - "$bn" | pv -s $(du -sb "$bn" | awk '{print $1}') | nc $ip 12345 &>/dev/null fi if [ $? -ne 0 ]; then echo "ERROR : something went wrong at src" ssh $user@$ip "killall nc; killall screen; killall tar" &>/dev/null exit 1 fi echo "[$i] data transfer completed..." sleep 2 done