#!/bin/sh # puss.sh version 7 # # Based on: # # # pusswordstore - jan6's simple, *nix password manager # name comes from combining "pus" with "passwordstore", as it's # inspired from passwordstore.org, but without the unneeded complexity # should work with any posix shell, in any posix-ish environment, with # any encryption tool list() { find "$puss_dir" -type f | sed \ -e "s|^$puss_dir/||" \ -e "/^\$/d" \ -e "s/\.${puss_ext##.}$//" } # en-/decryption wrapper # use whatever tool you want, gpg, scrypt, age, openssl enc, you name it puss_crypt() { case "$1" in ("-e") # encryption, $2 is the filename to encrypt, # encrypted file should be same as original filename # you most likely need an intermediary file, else you'll # corrupt or trunctate it (unless you read into memory first) # scrypt enc "$2" >"$2.new" && recip=$(cat $puss_dir/.gpg-id) if [ -z "$recip" ] then echo "Couldn't find GPG encryption id in $puss_dir/.gpg-id" exit -1 fi gpg2 -e -r "$recip" --quiet --compress-algo=none \ --no-encrypt-to --pinentry-mode loopback -o "$2.new" "$2" cat "$2.new" >"$2" && rm -f "$2.new" ;; ("-d") # decryption, print to stdout # scrypt dec "$2" gpg2 -d --quiet --compress-algo=none --no-encrypt-to \ --pinentry-mode loopback "$2" ;; ("-c") # decryption, non-stdout, "copy to clipboard" or similar puss_crypt "$@" | xclip ;; esac } puss() { puss_dir="$(readlink -f ${puss_dir:-~/.pusswordstore})" puss_ext=".gpg" mkdir -p "$puss_dir" pw="$puss_dir/$2$puss_ext" case "$1" in ("add"|"insert") read -r i echo $i >"$pw" && puss_crypt -e "$pw" ;; ("del"|"rm") rm "$pw" ;; ("edit") t="$(mktemp)" cp -p "$pw" "$t" puss_crypt -d "$pw" >"$t" if [ $? -eq 0 ] then "${EDITOR:-vi}" "$t" && puss_crypt -e "$t" mv "$t" "$pw" fi ;; ("read") puss_crypt -d "$pw" ;; ("search") list | grep -i "$2" ;; (""|"ls"|"list") list ;; ("--help"|"-h") echo "usage: $0 add password | del password | edit password | [read] password | list" ;; (*) pw="$puss_dir/$1$puss_ext" puss_crypt -d "$pw" ;; esac } puss "$@"