#!/bin/bash _help() { echo " sbean: Spilling the beans, a keepassxc cli wrapper commands: install apt install keepassxc db-create create database --key Path-to-keyfile --db short-name --path Path-to-database.kdbx Rest of the commands: --db [name, defaults to first in config] db-ls list databases ls list entries add add new entry --entry entry-name --user user-name get-user returns username --entry entry-name get-password returns password --entry entry-name open open database using cli openx open database using keepassxc look for ~/.config/sbean/rc for using multiple db " exit } _exit() { clear exit } _error() { echo "$@" >/dev/stderr exit 1 } _install() { dpkg -l keepassxc && return sudo apt-get install keepassxc } _create() { echo Creating new database set -e if [[ ! -e "$CONFIG" ]]; then mkdir -p $( dirname "$CONFIG" ) fi if [[ -z "$DB" ]]; then _error "--db required"; fi if [[ -z "$KEY" ]]; then _error "--key required"; fi if [[ -z "$DBPATH" ]]; then _error "--path required"; fi DB=$( echo $DB | tr -c -d [a-zA-Z0-9-] ) if [[ -e "$DBPATH" ]]; then _error "File $DBPATH already exists"; fi if [[ -e "$KEY" ]]; then _error "File $KEY already exists"; fi EXISTINGDB=$( _get_config DB $DB ) if [[ -n "$EXISTINGDB" ]]; then _error "DB $DB already exists"; fi KEY=$( readlink -m "$KEY" ) DBPATH=$( readlink -m "$DBPATH" ) keepassxc-cli db-create -k "$KEY" "$DBPATH" _set_config DB "$DB" "$DBPATH" _set_config KEY "$DB" "$KEY" echo Created DB $DB >/dev/stderr } _db_ls() { grep ^DB_ "$CONFIG" | sed 's/DB_\([^=]\+\)=\(.*\)/\1: \2/' } _ls() { _set_default_db echo DB: $DB >/dev/stderr keepassxc-cli ls -k "$DBKEY" --no-password -R -f "$DBPATH" } _add() { _set_default_db if [[ -z "$ENTRY" ]]; then _error "--entry required"; fi if [[ -z "$ENTRY_USER" ]]; then _error "--user required"; fi echo DB: $DB >/dev/stderr keepassxc-cli add -k "$DBKEY" --no-password "$DBPATH" -p -u "$ENTRY_USER" "$ENTRY" } _get_user() { _set_default_db keepassxc-cli show -k "$DBKEY" --no-password -a username "$DBPATH" "$ENTRY" } _get_pass() { _set_default_db keepassxc-cli show -k "$DBKEY" --no-password -a password "$DBPATH" "$ENTRY" } _open() { _set_default_db echo DB: $DB keepassxc-cli open -k "$DBKEY" --no-password "$DBPATH" } _openx() { _set_default_db echo DB: $DB keepassxc --keyfile "$DBKEY" "$DBPATH" } _set_config() { echo "$1"_"$2"=$3 >> "$CONFIG" } _set_default_db() { if [[ -z "$DB" ]]; then DB=$( grep ^DB_ "$CONFIG" | sed 's/DB_\([^=]\+\)=\(.*\)/\1/' | head -n 1 ) fi DBPATH=$( _get_config DB "$DB" ) DBKEY=$( _get_config KEY "$DB" ) } _get_config() { if [[ ! -e "$CONFIG" ]]; then return fi grep ^"$1"_"$2"= "$CONFIG" | sed 's/[^=]*=//' } CONFIG=$HOME/.config/sbean/rc for (( i=1; i<=$#; i++ )); do value=${!i} j=$(( i + 1 )) [[ "${value}" = "-"* ]] && { [[ "$value" =~ -h ]] && { _help; } [[ "$value" =~ --help ]] && { _help; } [[ "$value" =~ --db ]] && { DB="${!j}"; } [[ "$value" =~ --key ]] && { KEY="${!j}"; } [[ "$value" =~ --path ]] && { DBPATH="${!j}"; } [[ "$value" =~ --entry ]] && { ENTRY="${!j}"; } [[ "$value" =~ --user ]] && { ENTRY_USER="${!j}"; } i=$j continue } if [[ -z "$CMD" ]]; then CMD="$value" else _error "Only one command allowed" fi done which keepassxc-cli &> /dev/null || { echo Missing keepassxc-cli exit 1 } case $CMD in install) _install;; db-create) _create;; db-ls) _db_ls;; ls) _ls;; add) _add;; get-user) _get_user;; get-pass*) _get_pass;; open) _open;; openx) _openx;; *) _help;; esac