#!/bin/zsh set -ef 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 local sessionkey logins login id sessionkey=$(get_saved_sessionkey) if [[ -z $sessionkey ]] ; then sessionkey=$(bw unlock --raw) save_sessionkey $sessionkey else echo "Using the existing session key from $sessionfile" echo "" fi # Search for passwords using the search term if [[ -z $searchterm ]] ; then echo "Searchterm can't be empty" exit 1 fi echo "Searching for '$searchterm'..." logins=$(bw list items --search $searchterm --session $sessionkey) 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 login="$(jq ".[] | select(.id == \"$id\")" <<< $logins)" copy_data $id $login $sessionkey else echo "No entry found..." fi } main "$@"