From 59873118094ef8238ba73b7720493dd855cf7af8 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 20 Feb 2026 23:03:46 +0800 Subject: hehe --- backup.sh | 24 ------------------------ tarship.sh | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 24 deletions(-) delete mode 100755 backup.sh create mode 100755 tarship.sh diff --git a/backup.sh b/backup.sh deleted file mode 100755 index 6e54e8e..0000000 --- a/backup.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash -set -e - -[ $# -ne 3 ] && echo "Usage: $0 " && exit 1 - -SRC="$1" -NAME="$2" -DEST="$3" - -[ ! -d "$SRC" ] && echo "Error: '$SRC' is not a directory" && exit 1 - -TARFILE="$(pwd)/${NAME}.tar.gz" - -echo "Compressing $SRC → $TARFILE" -tar -czf "$TARFILE" -C "$(dirname "$SRC")" "$(basename "$SRC")" - -SIZE=$(du -h "$TARFILE" | cut -f1) -echo "Size: $SIZE" - -echo "Sending to $DEST" -rsync -avP "$TARFILE" "$DEST/" - -rm -f "$TARFILE" -echo "Done" diff --git a/tarship.sh b/tarship.sh new file mode 100755 index 0000000..661d77b --- /dev/null +++ b/tarship.sh @@ -0,0 +1,35 @@ +#!/bin/bash +set -e +USAGE="Usage: $0 {backup /dir [user@host:]/dest | restore file.tar.gz}" +dnf install -y tar pigz pv openssh-clients &>/dev/null || exit 1 + +case "${1:?$USAGE}" in +backup) + SRC="${2:?$USAGE}" DEST="${3:?$USAGE}" NAME="$(basename "$SRC").tar.gz" + [ ! -d "$SRC" ] && echo "Error: not a directory: $SRC" && exit 1 + du -sh "$SRC"; SIZE=$(du -sb "$SRC" | awk '{print $1}'); LHASH=$(mktemp); trap "rm -f $LHASH" EXIT + if [[ "$DEST" == *:* ]]; then # remote: tar+pigz stream over ssh, tee hash both sides + H="${DEST%%:*}" D="${DEST#*:}"; echo "→ ${H}:${D}/${NAME}" + RHASH=$(tar cf - "$SRC" | pv -s "$SIZE" | pigz -1 | tee >(sha256sum | awk '{print $1}' > "$LHASH") | ssh "$H" "h=\$(tee ${D}/${NAME} | sha256sum | awk '{print \$1}'); echo \$h > ${D}/${NAME}.sha256; echo \$h") + L=$(cat "$LHASH"); echo "Local: $L"; echo "Remote: $RHASH" + [ "$L" = "$RHASH" ] && echo "Checksum OK" || { echo "CHECKSUM MISMATCH!"; exit 1; } + echo "Verify: ssh $H \"sha256sum ${D}/${NAME}\"" + else # local: tar+pigz to file, write .sha256 sidecar + echo "→ $DEST/$NAME" + tar cf - "$SRC" | pv -s "$SIZE" | pigz -1 > "$DEST/$NAME" + sha256sum "$DEST/$NAME" | awk '{print $1}' > "$DEST/$NAME.sha256" + echo "Checksum: $(cat "$DEST/$NAME.sha256")" + echo "Verify: sha256sum $DEST/$NAME" + fi ;; +restore) + FILE="${2:?$USAGE}" + [[ "$FILE" == *.tar.gz ]] && [ -f "$FILE" ] || { echo "Error: not a .tar.gz file: $FILE"; exit 1; } + echo "$FILE ($(numfmt --to=iec $(stat -c%s "$FILE"))) → $(pwd)" + if [ -f "$FILE.sha256" ]; then # verify checksum before extracting + echo "Verifying..."; EXP=$(cat "$FILE.sha256"); ACT=$(sha256sum "$FILE" | awk '{print $1}') + [ "$EXP" = "$ACT" ] && echo "Checksum OK" || { echo "CHECKSUM MISMATCH!"; exit 1; } + else echo "Warning: no .sha256 file, skipping verification"; fi + pv "$FILE" | pigz -d | tar xf - ;; +*) echo "$USAGE"; exit 1 ;; +esac +echo "Done" -- cgit