This commit is contained in:
yosh 2023-05-04 19:45:28 -04:00
parent cac59ddf59
commit 43f05b0c93
2 changed files with 66 additions and 14 deletions

View File

@ -1,2 +1,35 @@
# agetar # agetar
actual description and development pending... I am lazy `agetar` is a simple wrapper around `tar` and `age` to easily pack files into an encrypted tar archive or extract files from an encrypted tar archive.
## dependencies
- a posix-compliant shell
- either `bsdtar` or `tar` (`bsdtar` takes priority)
- [age](https://github.com/FiloSottile/age)
# usage
```
usage:
agetar -e (-r RECIPIENT | -R PATH)... [-a] [-o OUTPUT] [--] FILES...
agetar -e -p [-a] [-o OUTPUT] [--] FILES...
agetar -d [-i PATH]... [-o OUTPUT] [--] FILES...
options:
-e encrypt the input files to an output tar
-d decrypt the input tar to output files
-o OUTPUT encrypting: write output tar to OUTPUT. stdout if omitted
decrypting: directory to extract to. PWD if omitted
-a encrypt to a PEM encoded format
-p encrypt with a passphrase
-r RECIPIENT encrypt to the specified RECIPIENT. can be repeated
-R PATH encrypt to the recipients listed at PATH. can be repeated
-i PATH decrypt using the identity file at PATH. can be repeated
at least one FILE is required for both encrypting and decrypting
if multiple are present, each will be processed with the same identities
you probably want an OUTPUT when encrypting, even if it's not required
(age will yet at you for that anyway unless you also use -a)
most of these options are passed directly to age(1). see its man page for
more details.
```

45
agetar
View File

@ -1,17 +1,13 @@
#!/bin/sh #!/bin/sh
# I can't believe I'm making this RED="$(printf '\033[38;5;9m')"
RESET="$(printf '\033[m')"
RED="$(tput setaf 9)" || RED="$(tput setf 4)"
GREEN="$(tput setaf 10)" || GREEN="$(tput setf 2)"
YELLOW="$(tput setaf 11)" || YELLOW="$(tput setf 6)"
RESET="$(tput sgr0)"
set -euf set -euf
BN="${0##*/}" BN="${0##*/}"
export POSIXLY_CORRECT=1 export POSIXLY_CORRECT=1
if [ "${NO_COLOR:-}" ]; then if [ "${NO_COLOR:-}" ]; then
RED="" GREEN="" YELLOW="" RESET="" RED="" RESET=""
fi fi
errecho() { errecho() {
@ -22,11 +18,34 @@ fail() {
errecho "${RED}error: $BN: $RESET$*" errecho "${RED}error: $BN: $RESET$*"
exit 1 exit 1
} }
_type() { type >/dev/null 2>&1 ; }
usage() { usage() {
cat >&2 <<-EOF cat >&2 <<-EOF
usage: usage:
$BN $BN -e (-r RECIPIENT | -R PATH)... [-a] [-o OUTPUT] [--] FILES...
$BN -e -p [-a] [-o OUTPUT] [--] FILES...
$BN -d [-i PATH]... [-o OUTPUT] [--] FILES...
options:
-e encrypt the input files to an output tar
-d decrypt the input tar to output files
-o OUTPUT encrypting: write output tar to OUTPUT. stdout if omitted
decrypting: directory to extract to. PWD if omitted
-a encrypt to a PEM encoded format
-p encrypt with a passphrase
-r RECIPIENT encrypt to the specified RECIPIENT. can be repeated
-R PATH encrypt to the recipients listed at PATH. can be repeated
-i PATH decrypt using the identity file at PATH. can be repeated
at least one FILE is required for both encrypting and decrypting
if multiple are present, each will be processed with the same identities
you probably want an OUTPUT when encrypting, even if it's not required
(age will yet at you for that anyway unless you also use -a)
most of these options are passed directly to age(1). see its man page for
more details.
EOF EOF
} }
@ -56,8 +75,8 @@ shift $((OPTIND - 1))
TAR="$(mktemp)" TAR="$(mktemp)"
trap 'rm "$TAR"' INT HUP QUIT EXIT trap 'rm "$TAR"' INT HUP QUIT EXIT
if [ "$TYPE" = "e" ]; then if [ "$TYPE" = "e" ]; then
{ type bsdtar && CMD="bsdtar -rL -f"; } || \ { _type bsdtar && CMD="bsdtar -rL -f"; } || \
{ type tar && CMD="tar -rh -f"; } || \ { _type tar && CMD="tar -rh -f"; } || \
fail "can't find tar command!" fail "can't find tar command!"
for f; do for f; do
if [ -f "$f" ] || [ -d "$f" ]; then if [ -f "$f" ] || [ -d "$f" ]; then
@ -68,12 +87,12 @@ if [ "$TYPE" = "e" ]; then
done done
eval 'age $AGEOPTS ${OUTPUT:+-o "$OUTPUT"} '"$RECIPIENTS $RECIPIENTS_FILES $IDENTITIES"' "$TAR"' eval 'age $AGEOPTS ${OUTPUT:+-o "$OUTPUT"} '"$RECIPIENTS $RECIPIENTS_FILES $IDENTITIES"' "$TAR"'
else else
{ type bsdtar && CMD="bsdtar -x -f"; } || \ { _type bsdtar && CMD="bsdtar -x -f"; } || \
{ type tar && CMD="tar -x -f"; } || \ { _type tar && CMD="tar -x -f"; } || \
fail "can't find tar command!" fail "can't find tar command!"
for f; do for f; do
eval 'age $AGEOPTS -o "$TAR" '"$RECIPIENTS $RECIPIENTS_FILES $IDENTITIES"' "$f"' eval 'age $AGEOPTS -o "$TAR" '"$RECIPIENTS $RECIPIENTS_FILES $IDENTITIES"' "$f"'
[ ! -d "${OUTPUT:=$PWD}" ] && mkdir -p "$OUTPUT" [ ! -d "${OUTPUT:="$PWD"}" ] && mkdir -p "$OUTPUT"
$CMD "$TAR" -C "$OUTPUT" $CMD "$TAR" -C "$OUTPUT"
done done
fi fi