#!/bin/bash # afssh -- wrapper around ssh-agent-filter and ssh # # Copyright (C) 2013 Timo Weingärtner # # This file is part of ssh-agent-filter. # # ssh-agent-filter is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # ssh-agent-filter is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with ssh-agent-filter. If not, see . set -e usage () { echo "normal usage: afssh [ssh-agent-filter options] -- [ssh arguments]" echo "interactive: afssh -- [ssh arguments]" echo "$SAF" --help echo ssh exit } interactive_selection () { ssh-add -l | { declare -a arr while read size hash comment; do arr+=("$hash" "$comment" "off") done "$DIALOG" --separate-output --title "afssh: key selection" --checklist "Which keys do you want to be forwarded?" 0 0 0 "${arr[@]}" 3>&1 1>&2 2>&3 3>&- | while read hash; do printf '%s\n%s\n' "-f" "$hash" done } } if ! ssh-add -l > /dev/null; then echo "no keys in your ssh-agent or ssh-agent not running" >&2 exit 1 fi declare -a agent_filter_args if [ -x "${BASH_SOURCE%/*}/ssh-agent-filter" ]; then type realpath >/dev/null 2>&1 || realpath () { readlink -f "$@"; } SAF=$(realpath "${BASH_SOURCE%/*}/ssh-agent-filter") else SAF=$(which ssh-agent-filter) fi if [ $# -le 1 ] || [ "$1" = "-h" ] || [ "$1" = "--help" ]; then usage elif [ "$1" = "--" ]; then shift if ! DIALOG=$(which whiptail) && ! DIALOG=$(which dialog); then echo "neither whiptail nor dialog found in \$PATH, interactive mode doesn't work without one of them" >&2 exit 1 fi agent_filter_args=( $(interactive_selection) ) else while true; do if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then usage elif [ "$1" = "--" ]; then shift break else agent_filter_args+=("$1") shift fi done fi # safeguard to not kill the real ssh-agent unset SSH_AGENT_PID trap 'kill "$SSH_AGENT_PID"; rm -r "$TEMPDIR"' EXIT TEMPDIR=$(mktemp -d) if [ -t 1 ]; then eval $(cd "$TEMPDIR"; "$SAF" "${agent_filter_args[@]}" || echo exit $?) ssh-add -l else eval $(cd "$TEMPDIR"; "$SAF" "${agent_filter_args[@]}" || echo exit $?) > /dev/null fi ssh -A "$@"