#!/bin/bash # # Load a key from a menu. # # Parameters BASENAME="`basename $0`" KEYS="$HOME/.ssh/keys" # Check if [ ! -d "$KEYS" ]; then echo "$BASENAME: folder not found: $KEYS" exit 1 fi # Get available keys function __query { ( cd $KEYS && find -name '*.pub' | sed -e 's/.pub$//' | grep -v decomissioned ) } # List available keys function __list { n="0" __query | sort | uniq | while read key; do echo -en "$n. $key" echo "" let ++n done | column -t -c 6 } # Display the keys available in the agent function __loaded { echo "Current loaded keys:" echo "" ssh-add -L | cut -d ' ' -f 3 | sed -e 's/^/\t/' } # Key chooser mennu function __chooser { echo "Available keys" echo "" __list | sed -e 's/^/\t/' echo "" __loaded echo "" read -rep "Choose key: " n # Check the selected option if [ ! -z "$n" ]; then key="$(__list | grep -E "(^$n.| $n:)" | sed -e "s/^[0-9]*. //" | cut -d : -f 1)" if [ ! -z "$key" ]; then __load $key fi fi } # Load a key function __load { KEY="$KEYS/$1" # Check if the selected option has a custom procedure (monkeysphere, keyringer, etc) if [ -x "$KEY.askpass" ]; then # SSH-ADD(1) says: "Note that on some machines it may be necessary to redirect the input from /dev/null to make this work". SSH_ASKPASS="$KEY.askpass" ssh-add $KEY < /dev/null else ssh-add $KEY fi } # Dispatch __chooser