#!/bin/zsh set -ef local scriptname=$(basename "$0") local sessionfile="$HOME/.bitwarden_session" get_saved_sessionkey () { sudo touch $sessionfile echo $(sudo cat $sessionfile) } save_sessionkey () { local sessionkey=$1 sudo sh -c "echo $sessionkey > $sessionfile" sudo chmod 600 $sessionfile } process_item () { local id=$1 local login=$2 local sessionkey=$3 echo "" echo "$(jq -r ".id" <<< $login)" echo "$(jq -r ".name" <<< $login)" echo "" local username="$(jq -r ".login.username" <<< $login)" echo $username | xclip -sel clip echo "Username \"$username\" copied to clipboard." read -s -k $'?Press any key to copy the password...\n' jq -r ".login.password" <<< $login | xclip -sel clip echo "Password copied to clipboard." local totp=$(jq -r ".login.totp" <<< $login) if [[ $totp != "null" ]]; then read -s -k $'?Press any key to copy the TOTP Token...\n' bw get totp $id --session $sessionkey | xclip -sel clip echo "Token copied to clipboard." fi } main() { # Check the search term local searchterm=$1 if [[ -z $searchterm ]] ; then echo "Usage: $scriptname " exit 1 fi # Check the session key 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 # Get a list of matching items echo "Searching for '$searchterm'..." local logins=$(bw list items --search $searchterm --session $sessionkey) # Pick one with the fzf 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 # Process the selected item local login="$(jq ".[] | select(.id == \"$id\")" <<< $logins)" process_item $id $login $sessionkey else echo "No entry found. You might want to run 'bw sync' and try again." fi } main "$@"