blob: 3b9d84f6df55c5ae5db501af1116c31ec13e45df (
plain)
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
|
#!/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 --help
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
SAF=$(readlink -f "${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 "$@"
|