A simple password manager using GPG written in POSIX sh
.
pash
ββ dev/
β ββ github
ββ internet/
β ββ graalians
β ββ pixeljoint
β ββ nixers
ββββ
gpg
orgpg2
Clipboard Support:
xclip
(can be customized throughPASH_CLIP
).
Examples: pash add web/gmail
, pash list
, pash del google
, pash show github
, pash copy github
.
SYNOPSIS
pash [ add|del|show|list|copy ] [name]
COMMANDS
[a]dd [name] - Create a new password entry.
[c]opy [name] - Copy entry to the clipboard.
[d]el [name] - Delete a password entry.
[l]ist - List all entries.
[s]how [name] - Show password for an entry.
I was looking for a CLI password manager (written in shell) and wasn't happy with the options I had found. They either had multiple instances of eval
(on user inputted data), lots of unsafe bash
(nowhere near being shellcheck
compliant.) or they were overly complex. The opposites for what I'd want in a password manager.
I decided to write my own. pash
is written in POSIX sh
and the codebase is minimal (100~ lines). gpg
is used to generate passwords and store them in encrypted files.
The passwords are stored in GPG encrypted files located at ${XDG_DATA_HOME:=$HOME/.local/share}/pash}
.
Set the environment variable PASH_KEYID
to the ID of the key you'd like to encrypt and decrypt passwords with.
Example:
# Default: 'unset'.
export PASH_KEYID=XXXXXXXX
# This can also be an email.
export PASH_KEYID=dylan.araps@gmail.com
# This can also be used as a one-off.
PASH_KEYID=XXXXXXXX pash add github
Set the environment variable PASH_LENGTH
to a valid integer.
Example:
# Default: '50'.
export PASH_LENGTH=50
# This can also be used as a one-off.
PASH_LENGTH=10 pash add github
Set the environment variable PASH_DIR
to a directory.
# Default: '~/.local/share/pash'.
export PASH_DIR=~/.local/share/pash
# This can also be used as a one-off.
PASH_DIR=/mnt/drive/pash pash list
It's a file! Standard UNIX utilities can be used here.
A shell function can be used to add new commands and functionality to pash
. The following example adds pash git
to execute git
commands on the password store.
pash() {
case $1 in
g*)
cd "${PASH_DIR:=${XDG_DATA_HOME:=$HOME/.local/share}/pash}"
shift
git "$@"
;;
*)
command pash "$@"
;;
esac
}
Set the environment variable PASH_CLIP
to a command.
# Default: 'xclip -selection clipboard'.
export PASH_DIR='xclip -selection clipboard'