aboutsummaryrefslogtreecommitdiff
path: root/afssh
blob: 3899fbad2fa44bd3cb987d5a4b47537db2e21482 (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
97
98
#!/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

type realpath >/dev/null 2>&1 || realpath () { readlink -f "$@"; }

if [ -x "${BASH_SOURCE%/*}/ssh-agent-filter" ]; then
	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 "$@"