ARCHIVE=false DESTINATION_LOCAL_DIR="./" if [[ "$1" == "--archive" ]]; then ARCHIVE=true shift fi if [[ $# -lt 2 ]]; then echo "Usage: $0 [--archive] user@host remote_source_dir [local_destination_dir]" exit 1 fi USER_HOST="$1" REMOTE_USER="${USER_HOST%@*}" HOST="${USER_HOST#*@}" REMOTE_SOURCE_DIR="$2" if [[ -n "$3" ]]; then DESTINATION_LOCAL_DIR="$3" fi if [[ "$REMOTE_SOURCE_DIR" = /* ]]; then IS_ABSOLUTE=true else IS_ABSOLUTE=false fi echo "ARCHIVE=$ARCHIVE" echo "REMOTE_USER=$REMOTE_USER" echo "HOST=$HOST" echo "REMOTE_SOURCE_DIR=$REMOTE_SOURCE_DIR" echo "DESTINATION_LOCAL_DIR=$DESTINATION_LOCAL_DIR" REMOTE_BASE_DIR="" if $IS_ABSOLUTE; then REMOTE_BASE_DIR="/" else REMOTE_BASE_DIR=/home/$REMOTE_USER fi # Example that works # ssh debian@gurgul.org "tar --zstd -cf - -C /home/debian .dat" | tar --zstd -xf - -C . # get debian@gurgul.org .dat # get --archive debian@gurgul.org /etc TAR_COMMAND="tar --zstd -cf - -C $REMOTE_BASE_DIR $REMOTE_SOURCE_DIR" if $ARCHIVE; then ssh $REMOTE_USER@$HOST $TAR_COMMAND > "$DESTINATION_LOCAL_DIR/$(basename "$REMOTE_SOURCE_DIR")-$(date +"%d-%m-%Y").tar.zst" else ssh $REMOTE_USER@$HOST $TAR_COMMAND | tar --zstd -xf - -C $DESTINATION_LOCAL_DIR fi