1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
|
#!/bin/bash
# afssh -- wrapper around ssh-agent-filter and ssh
#
# Copyright (C) 2013 Timo Weingärtner <timo@tiwe.de>
#
# 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 <http://www.gnu.org/licenses/>.
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 "$@"
|