99 lines
1.7 KiB
Bash
99 lines
1.7 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
set -o errexit
|
|
set -o nounset
|
|
set -o pipefail
|
|
|
|
progname=$0
|
|
|
|
error() {
|
|
for line in "$@"; do
|
|
printf '%s\n' "$progname: $line" 1>&2
|
|
done
|
|
|
|
exit 1
|
|
}
|
|
|
|
args=$(getopt --options p:P:vc: --longoptions=port:,path:,verbose,compress: --name "$progname" -- "$@")
|
|
|
|
eval set -- "$args"
|
|
|
|
port=1337
|
|
path=.
|
|
tarflags=()
|
|
ncflags=()
|
|
while true; do
|
|
case $1 in
|
|
(-p | --port)
|
|
port=$2
|
|
shift 2
|
|
;;
|
|
(-P | --path)
|
|
path=$2
|
|
shift 2
|
|
;;
|
|
(-v | --verbose)
|
|
tarflags+=(--verbose)
|
|
ncflags+=(-v)
|
|
shift
|
|
;;
|
|
(-c | --compress)
|
|
algo=$2
|
|
case $algo in
|
|
(none)
|
|
;;
|
|
(xz)
|
|
tarflags+=(--xz)
|
|
;;
|
|
(zstd)
|
|
tarflags+=(--zstd)
|
|
;;
|
|
(*)
|
|
error 'invalid compression algorithm'
|
|
;;
|
|
esac
|
|
shift 2
|
|
;;
|
|
(--)
|
|
shift
|
|
break
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if (( $# == 0 )); then
|
|
error 'a subcommand is required'
|
|
fi
|
|
|
|
subcommand=$1
|
|
|
|
case $subcommand in
|
|
(send)
|
|
shift
|
|
|
|
if (( $# < 1 )); then
|
|
error 'the destination address is required'
|
|
fi
|
|
|
|
if (( $# > 1 )); then
|
|
error 'too many arguments'
|
|
fi
|
|
|
|
dest=$1
|
|
|
|
tar --create "${tarflags[@]}" -- "$path" | nc -q 1 "${ncflags[@]}" -- "$dest" "$port"
|
|
;;
|
|
(recv | receive)
|
|
shift
|
|
|
|
if (( $# > 0 )); then
|
|
error 'too many arguments'
|
|
fi
|
|
|
|
nc -q 1 -l -p "$port" "${ncflags[@]}" | tar --extract "${tarflags[@]}"
|
|
;;
|
|
(*)
|
|
error 'invalid subcommand'
|
|
;;
|
|
esac
|