diff options
| author | Your Name <you@example.com> | 2026-02-20 23:05:02 +0800 |
|---|---|---|
| committer | Your Name <you@example.com> | 2026-02-20 23:05:02 +0800 |
| commit | 53ff71f41a2722db4cf7e384a3ae36102f40ef59 (patch) | |
| tree | 990cb4859ade43d6ac92c9162d6baa779356b1b3 /tarship.sh | |
| parent | 59873118094ef8238ba73b7720493dd855cf7af8 (diff) | |
hehe
Diffstat (limited to 'tarship.sh')
| -rwxr-xr-x | tarship.sh | 9 |
1 files changed, 6 insertions, 3 deletions
| @@ -8,13 +8,15 @@ backup) | |||
| 8 | SRC="${2:?$USAGE}" DEST="${3:?$USAGE}" NAME="$(basename "$SRC").tar.gz" | 8 | SRC="${2:?$USAGE}" DEST="${3:?$USAGE}" NAME="$(basename "$SRC").tar.gz" |
| 9 | [ ! -d "$SRC" ] && echo "Error: not a directory: $SRC" && exit 1 | 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 | 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 | 11 | # remote: tar+pigz stream over ssh, tee hash both sides |
| 12 | if [[ "$DEST" == *:* ]]; then | ||
| 12 | H="${DEST%%:*}" D="${DEST#*:}"; echo "→ ${H}:${D}/${NAME}" | 13 | 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 | 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=$(cat "$LHASH"); echo "Local: $L"; echo "Remote: $RHASH" |
| 15 | [ "$L" = "$RHASH" ] && echo "Checksum OK" || { echo "CHECKSUM MISMATCH!"; exit 1; } | 16 | [ "$L" = "$RHASH" ] && echo "Checksum OK" || { echo "CHECKSUM MISMATCH!"; exit 1; } |
| 16 | echo "Verify: ssh $H \"sha256sum ${D}/${NAME}\"" | 17 | echo "Verify: ssh $H \"sha256sum ${D}/${NAME}\"" |
| 17 | else # local: tar+pigz to file, write .sha256 sidecar | 18 | # local: tar+pigz to file, write .sha256 sidecar |
| 19 | else | ||
| 18 | echo "→ $DEST/$NAME" | 20 | echo "→ $DEST/$NAME" |
| 19 | tar cf - "$SRC" | pv -s "$SIZE" | pigz -1 > "$DEST/$NAME" | 21 | tar cf - "$SRC" | pv -s "$SIZE" | pigz -1 > "$DEST/$NAME" |
| 20 | sha256sum "$DEST/$NAME" | awk '{print $1}' > "$DEST/$NAME.sha256" | 22 | sha256sum "$DEST/$NAME" | awk '{print $1}' > "$DEST/$NAME.sha256" |
| @@ -25,7 +27,8 @@ restore) | |||
| 25 | FILE="${2:?$USAGE}" | 27 | FILE="${2:?$USAGE}" |
| 26 | [[ "$FILE" == *.tar.gz ]] && [ -f "$FILE" ] || { echo "Error: not a .tar.gz file: $FILE"; exit 1; } | 28 | [[ "$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)" | 29 | echo "$FILE ($(numfmt --to=iec $(stat -c%s "$FILE"))) → $(pwd)" |
| 28 | if [ -f "$FILE.sha256" ]; then # verify checksum before extracting | 30 | # verify checksum before extracting |
| 31 | if [ -f "$FILE.sha256" ]; then | ||
| 29 | echo "Verifying..."; EXP=$(cat "$FILE.sha256"); ACT=$(sha256sum "$FILE" | awk '{print $1}') | 32 | echo "Verifying..."; EXP=$(cat "$FILE.sha256"); ACT=$(sha256sum "$FILE" | awk '{print $1}') |
| 30 | [ "$EXP" = "$ACT" ] && echo "Checksum OK" || { echo "CHECKSUM MISMATCH!"; exit 1; } | 33 | [ "$EXP" = "$ACT" ] && echo "Checksum OK" || { echo "CHECKSUM MISMATCH!"; exit 1; } |
| 31 | else echo "Warning: no .sha256 file, skipping verification"; fi | 34 | else echo "Warning: no .sha256 file, skipping verification"; fi |
