#!/bin/bash # the first wide name that actually makes sense # IMPLEMENT CACHE # TEST TO SEE IF SORTING FUCKS SHIT UP # A LOTTA ERROR HANDLING, ESPECIALLY BEFORE THE CONNECT # SWITCH PROTOCOLS TO CASE STATEMENT # TEST MULTIPLE RDP CONNECTIONS AT THE SAME TIME # set -e export TERM=rxvt-unicode CMD_RDP=( remmina --no-tray-icon -c ) CMD_SSH=( ssh ) CMD_NEW_TERMINAL=( urxvt -e bash -rcfile "$HOME/.bashrc.JUMP" ) FZF_FLAGS="--cycle --layout=reverse --border=double --ansi --color=fg:white,bg:black,bg+:magenta,hl:yellow,hl+:green,fg+:white,border:blue,info:green,prompt:green" SPAWN_NEW_TERMINAL=0 RE_CACHE=0 while [ $# -gt 0 ]; do case $1 in -h | --help) echo -e "usage: $0 [-h help] [--spawn-new-terminal] [--regenerate-cache]" exit 0 ;; --spawn-new-terminal) SPAWN_NEW_TERMINAL=1 ;; --regenerate-cache) RE_CACHE=1 ;; *) echo "Invalid option: $1" >&2 echo -e "usage: $0 [-h help] [--spawn-new-terminal] [--regenerate-cache]" exit 1 ;; esac shift done CACHE="/tmp/serverlist.txt" declare CMD="" declare SERVER="" declare SERVER_ITEM="" declare SERVER_ADDRESS="" declare SERVER_NAME="" declare -a server_list=() function cache_list () { [[ -s "${CACHE}.tmp" ]] && truncate -s 0 $CACHE item_list=$( pass grep "^connection_address:" | grep ":$" | sed -r "s|(\\x1b)?\\[[0-9;]*m||g; s|:$||g" | sort ) for item in ${item_list[@]}; do name=$( get_from_pass "$item" "connection_name" ) address=$( get_from_pass "$item" "connection_address" ) echo "${item} ===> ${address} (${name})" >> "${CACHE}.tmp" done cat "${CACHE}.tmp" | column -t | sed 's/\( *\) /\1/g' > $CACHE rm -f "${CACHE}.tmp" } function get_from_pass () { pass show "$1" | grep "^$2:" | sed -r "s|^$2: ||g" } [[ -s $CACHE && $RE_CACHE -eq 0 ]] || cache_list mapfile -t server_list < $CACHE # pick server SERVER=$( printf '%s\n' "${server_list[@]}" | fzf $FZF_FLAGS ) [[ -z $SERVER ]] && echo "Error: No server selected. Exiting..." >&2 && exit -2 SERVER_ITEM=$( echo "$SERVER" | sed -r "s|^([^ ]*)\s+===>\s+([^ ]*)\s+\(([^ ]*)\)$|\1|g" ) SERVER_ADDRESS=$( echo "$SERVER" | sed -r "s|^([^ ]*)\s+===>\s+([^ ]*)\s+\(([^ ]*)\)$|\2|g" ) SERVER_NAME=$( echo "$SERVER" | sed -r "s|^([^ ]*)\s+===>\s+([^ ]*)\s+\(([^ ]*)\)$|\3|g" ) # connect to server based on protocol SERVER_CONNECTION_TYPE=$( get_from_pass "$SERVER_ITEM" "connection_type" ) if [[ $SERVER_CONNECTION_TYPE == "SSH" ]]; then CMD=$CMD_SSH PAM_LOGIN_ACCOUNT=$( get_from_pass "$SERVER_ITEM" "PAM_username" ) SERVER_CONNECTION_PAM_ACCESS_ACCOUNT=$( get_from_pass "$SERVER_ITEM" "connection_PAM_username" ) [[ -n $PAM_LOGIN_ACCOUNT && -n $SERVER_CONNECTION_PAM_ACCESS_ACCOUNT ]] && CMD+=( -l "${PAM_LOGIN_ACCOUNT}#${SERVER_CONNECTION_PAM_ACCESS_ACCOUNT}" ) SERVER_CONNECTION_USER=$( get_from_pass "$SERVER_ITEM" "connection_username" ) [[ -n $SERVER_CONNECTION_USER ]] && CMD+=( -l "$SERVER_CONNECTION_USER" ) [[ -n $PAM_LOGIN_ACCOUNT && -n $SERVER_CONNECTION_PAM_ACCESS_ACCOUNT && -n $SERVER_CONNECTION_USER ]] && echo "ERROR: Multiple login methods detected. Please edit the password item to contain only one" && exit -2 SERVER_CONNECTION_KEYPATH=$( get_from_pass "$SERVER_ITEM" "connection_key_path" ) [[ -n $SERVER_CONNECTION_KEYPATH ]] && CMD+=( -i "$SERVER_CONNECTION_KEYPATH" ) SERVER_CONNECTION_PORT=$( get_from_pass "$SERVER_ITEM" "connection_port" ) [[ -z "$SERVER_CONNECTION_PORT" ]] && SERVER_CONNECTION_PORT=22 CMD+=( -p "$SERVER_CONNECTION_PORT" ) [[ -n $PAM_LOGIN_ACCOUNT && -n $SERVER_CONNECTION_PAM_ACCESS_ACCOUNT && -n $SERVER_CONNECTION_USER ]] CMD+=( "$SERVER_ADDRESS" ) elif [[ $SERVER_CONNECTION_TYPE == "RDP" ]]; then CMD=$CMD_RDP SERVER_CONNECTION_PORT=$( get_from_pass "$SERVER_ITEM" "connection_port" ) [[ -z "$SERVER_CONNECTION_PORT" ]] && SERVER_CONNECTION_PORT=3389 SERVER_CONNECTION_USER=$( get_from_pass "$SERVER_ITEM" "connection_username" ) SERVER_CONNECTION_DOMAIN=$( get_from_pass "$SERVER_ITEM" "connection_domain" ) [[ -n "$SERVER_CONNECTION_DOMAIN" ]] && SERVER_CONNECTION_USER="${SERVER_CONNECTION_DOMAIN}\\${SERVER_CONNECTION_USER}" SERVER_CONNECTION_ENCRYPTED_PASSWORD="$( pass show "$SERVER_ITEM" | head -n1 | remmina --encrypt-password --no-tray-icon 2>/dev/null | grep "^Encrypted password: " | sed -r "s|^Encrypted password: ||g" )" CMD+=( "rdp://${SERVER_CONNECTION_USER}:${SERVER_CONNECTION_ENCRYPTED_PASSWORD}@${SERVER_ADDRESS}:${SERVER_CONNECTION_PORT}" ) else exit -1 fi echo ${CMD[*]} if [[ $SPAWN_NEW_TERMINAL -eq 1 ]]; then cat "$HOME/.bashrc" > "$HOME/.bashrc.JUMP" echo "export TERM=$TERM" >> "$HOME/.bashrc.JUMP" echo ${CMD[*]} >> "$HOME/.bashrc.JUMP" pass -c "$SERVER_ITEM" && "${CMD_NEW_TERMINAL[@]}" 2>/dev/null else pass -c "$SERVER_ITEM" && "${CMD[@]}" fi