#!/bin/zsh set -ef local scriptname=$(basename "$0") local sessionfile='/tmp/bw_session' copy_data () { local id=$1 local login=$2 local sessionkey=$3 local totp echo "Name: $(jq -r ".name" <<< $login), ID: $(jq -r ".id" <<< $login)" # Copy the username to the clipboard echo "> Copying Username" jq -r ".login.username" <<< $login | xclip -sel clip # Wait for user input before coping the password echo "> Press Enter to copy password..." read # Copy the password to the clipboard echo "> Copying Password" jq -r ".login.password" <<< $login | xclip -sel clip # Copy a TOTP Token if available totp=$(jq -r ".login.totp" <<< $login) if [[ $totp != "null" ]]; then # Wait for user input before coping the totp token echo "> Press any key to copy TOTP Token..." read echo "> Copying TOTP Token" bw get totp $id --session $sessionkey | xclip -sel clip fi } function get_saved_sessionkey () { sudo touch $sessionfile echo $(sudo cat $sessionfile) } function save_sessionkey () { local sessionkey=$1 sudo sh -c "echo $sessionkey > $sessionfile" sudo chmod 600 $sessionfile } main() { local searchterm=$1 if [[ -z $searchterm ]] ; then echo "Usage: $scriptname " exit 1 fi local sessionkey=$(get_saved_sessionkey) if [[ -z $sessionkey ]] ; then # Get and save a new session key sessionkey=$(bw unlock --raw) save_sessionkey $sessionkey else echo "Using the existing session key from $sessionfile" fi # Search for passwords using the search term echo "Searching for '$searchterm'..." local logins=$(bw list items --search $searchterm --session $sessionkey) local id=$( jq -r '.[] | "\(.name)\t\(.login.username)\t\(.id)"' <<< $logins \ | fzf --reverse --with-nth=1,2 --delimiter="\t" --select-1 --exit-0 \ | awk -F"\t" '{print $3}' ) if [[ -n $id ]]; then local login="$(jq ".[] | select(.id == \"$id\")" <<< $logins)" copy_data $id $login $sessionkey else echo "No entry found" fi } main "$@"