#!/bin/bash -e # lifetime, in minutes lifetime=15 keysuffix=root hostopt="" [ -z "$hostopt" ] && hostopt="${HOSTNAME}" [ -z "$hostopt" ] && hostopt=`uname -n 2>/dev/null || echo unknown` function usage { echo "Usage: $0 [-H hostname] [-k keysuffix] [-l lifetime] command" echo echo "Available commands:" echo " add" echo " list" echo " destroy" echo " shell" echo " ssh [args]" echo " [cmd]" } while getopts ":H:k:l:h" opt; do case "$opt" in H) hostopt="$OPTARG";; k) keysuffix="$OPTARG";; l) lifetime="$OPTARG";; h) usage; exit 0;; \?) usage >&2; exit 1;; esac done shift $(($OPTIND - 1)) keys="$HOME/.ssh/id_rsa_$keysuffix" keychain_host="$hostopt-$keysuffix" function with-keys { unset SSH_AUTH_SOCK SSH_AGENT_PID vars=$(keychain --timeout "$lifetime" --eval --host "$keychain_host" $keys) eval "$vars" export SSHROOT=1 exec "$@" } function with-agent { unset SSH_AUTH_SOCK SSH_AGENT_PID vars=$(keychain --timeout "$lifetime" --eval --host "$keychain_host") eval "$vars" export SSHROOT=1 echo with-agent: Running: "$@" exec "$@" } command="$1" shift case "$command" in init) echo "Loading default keys (lifetime $lifetime)..." with-agent ssh-add -t "${lifetime}m" "$@" $keys ;; add) echo "Loading keys (lifetime $lifetime):" "$@" with-agent ssh-add -t "${lifetime}m" "$@" ;; list) with-agent ssh-add -l ;; destroy) with-agent ssh-add -D ;; shell) with-keys "$SHELL" "$@" ;; ssh) #with-keys ssh -l root "$@" with-keys ssh "$@" ;; *) if [ -z "$command" ]; then usage >&2 else echo Executing: "$command" "$@" with-agent "$command" "$@" fi ;; esac