summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYour Name <you@example.com>2026-02-20 23:03:46 +0800
committerYour Name <you@example.com>2026-02-20 23:03:46 +0800
commit59873118094ef8238ba73b7720493dd855cf7af8 (patch)
tree5416cab2c7c45843282d04368a0899b985ba6e7e
parentbe5699a8da55d30fa309743a03a8aca2d1662403 (diff)
hehe
-rwxr-xr-xbackup.sh24
-rwxr-xr-xtarship.sh35
2 files changed, 35 insertions, 24 deletions
diff --git a/backup.sh b/backup.sh
deleted file mode 100755
index 6e54e8e..0000000
--- a/backup.sh
+++ /dev/null
@@ -1,24 +0,0 @@
1#!/bin/bash
2set -e
3
4[ $# -ne 3 ] && echo "Usage: $0 <dir-to-backup> <tarfile-name> <user@host:/remote/dir>" && exit 1
5
6SRC="$1"
7NAME="$2"
8DEST="$3"
9
10[ ! -d "$SRC" ] && echo "Error: '$SRC' is not a directory" && exit 1
11
12TARFILE="$(pwd)/${NAME}.tar.gz"
13
14echo "Compressing $SRC → $TARFILE"
15tar -czf "$TARFILE" -C "$(dirname "$SRC")" "$(basename "$SRC")"
16
17SIZE=$(du -h "$TARFILE" | cut -f1)
18echo "Size: $SIZE"
19
20echo "Sending to $DEST"
21rsync -avP "$TARFILE" "$DEST/"
22
23rm -f "$TARFILE"
24echo "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 @@
1#!/bin/bash
2set -e
3USAGE="Usage: $0 {backup /dir [user@host:]/dest | restore file.tar.gz}"
4dnf install -y tar pigz pv openssh-clients &>/dev/null || exit 1
5
6case "${1:?$USAGE}" in
7backup)
8 SRC="${2:?$USAGE}" DEST="${3:?$USAGE}" NAME="$(basename "$SRC").tar.gz"
9 [ ! -d "$SRC" ] && echo "Error: not a directory: $SRC" && exit 1
10 du -sh "$SRC"; SIZE=$(du -sb "$SRC" | awk '{print $1}'); LHASH=$(mktemp); trap "rm -f $LHASH" EXIT
11 if [[ "$DEST" == *:* ]]; then # remote: tar+pigz stream over ssh, tee hash both sides
12 H="${DEST%%:*}" D="${DEST#*:}"; echo "→ ${H}:${D}/${NAME}"
13 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")
14 L=$(cat "$LHASH"); echo "Local: $L"; echo "Remote: $RHASH"
15 [ "$L" = "$RHASH" ] && echo "Checksum OK" || { echo "CHECKSUM MISMATCH!"; exit 1; }
16 echo "Verify: ssh $H \"sha256sum ${D}/${NAME}\""
17 else # local: tar+pigz to file, write .sha256 sidecar
18 echo "→ $DEST/$NAME"
19 tar cf - "$SRC" | pv -s "$SIZE" | pigz -1 > "$DEST/$NAME"
20 sha256sum "$DEST/$NAME" | awk '{print $1}' > "$DEST/$NAME.sha256"
21 echo "Checksum: $(cat "$DEST/$NAME.sha256")"
22 echo "Verify: sha256sum $DEST/$NAME"
23 fi ;;
24restore)
25 FILE="${2:?$USAGE}"
26 [[ "$FILE" == *.tar.gz ]] && [ -f "$FILE" ] || { echo "Error: not a .tar.gz file: $FILE"; exit 1; }
27 echo "$FILE ($(numfmt --to=iec $(stat -c%s "$FILE"))) → $(pwd)"
28 if [ -f "$FILE.sha256" ]; then # verify checksum before extracting
29 echo "Verifying..."; EXP=$(cat "$FILE.sha256"); ACT=$(sha256sum "$FILE" | awk '{print $1}')
30 [ "$EXP" = "$ACT" ] && echo "Checksum OK" || { echo "CHECKSUM MISMATCH!"; exit 1; }
31 else echo "Warning: no .sha256 file, skipping verification"; fi
32 pv "$FILE" | pigz -d | tar xf - ;;
33*) echo "$USAGE"; exit 1 ;;
34esac
35echo "Done"