xref: /freebsd/crypto/openssh/regress/test-exec.sh (revision d37ea99837e6ad50837fd9fe1771ddf1c3ba6002)
1#	$OpenBSD: test-exec.sh,v 1.15 2004/02/24 16:56:30 markus Exp $
2#	Placed in the Public Domain.
3
4PORT=4242
5#SUDO=sudo
6
7if [ -x /usr/ucb/whoami ]; then
8	USER=`/usr/ucb/whoami`
9elif whoami >/dev/null 2>&1; then
10	USER=`whoami`
11else
12	USER=`id -un`
13fi
14
15OBJ=$1
16if [ "x$OBJ" = "x" ]; then
17	echo '$OBJ not defined'
18	exit 2
19fi
20if [ ! -d $OBJ ]; then
21	echo "not a directory: $OBJ"
22	exit 2
23fi
24SCRIPT=$2
25if [ "x$SCRIPT" = "x" ]; then
26	echo '$SCRIPT not defined'
27	exit 2
28fi
29if [ ! -f $SCRIPT ]; then
30	echo "not a file: $SCRIPT"
31	exit 2
32fi
33if $TEST_SHELL -n $SCRIPT; then
34	true
35else
36	echo "syntax error in $SCRIPT"
37	exit 2
38fi
39unset SSH_AUTH_SOCK
40
41# defaults
42SSH=ssh
43SSHD=sshd
44SSHAGENT=ssh-agent
45SSHADD=ssh-add
46SSHKEYGEN=ssh-keygen
47SSHKEYSCAN=ssh-keyscan
48SFTP=sftp
49SFTPSERVER=/usr/libexec/openssh/sftp-server
50
51if [ "x$TEST_SSH_SSH" != "x" ]; then
52	SSH="${TEST_SSH_SSH}"
53fi
54if [ "x$TEST_SSH_SSHD" != "x" ]; then
55	SSHD="${TEST_SSH_SSHD}"
56fi
57if [ "x$TEST_SSH_SSHAGENT" != "x" ]; then
58	SSHAGENT="${TEST_SSH_SSHAGENT}"
59fi
60if [ "x$TEST_SSH_SSHADD" != "x" ]; then
61	SSHADD="${TEST_SSH_SSHADD}"
62fi
63if [ "x$TEST_SSH_SSHKEYGEN" != "x" ]; then
64	SSHKEYGEN="${TEST_SSH_SSHKEYGEN}"
65fi
66if [ "x$TEST_SSH_SSHKEYSCAN" != "x" ]; then
67	SSHKEYSCAN="${TEST_SSH_SSHKEYSCAN}"
68fi
69if [ "x$TEST_SSH_SFTP" != "x" ]; then
70	SFTP="${TEST_SSH_SFTP}"
71fi
72if [ "x$TEST_SSH_SFTPSERVER" != "x" ]; then
73	SFTPSERVER="${TEST_SSH_SFTPSERVER}"
74fi
75
76# these should be used in tests
77export SSH SSHD SSHAGENT SSHADD SSHKEYGEN SSHKEYSCAN SFTP SFTPSERVER
78#echo $SSH $SSHD $SSHAGENT $SSHADD $SSHKEYGEN $SSHKEYSCAN $SFTP $SFTPSERVER
79
80# helper
81echon()
82{
83       if [ "x`echo -n`" = "x" ]; then
84               echo -n "$@"
85       elif [ "x`echo '\c'`" = "x" ]; then
86               echo "$@\c"
87       else
88               fatal "Don't know how to echo without newline."
89       fi
90}
91
92have_prog()
93{
94	saved_IFS="$IFS"
95	IFS=":"
96	for i in $PATH
97	do
98		if [ -x $i/$1 ]; then
99			IFS="$saved_IFS"
100			return 0
101		fi
102	done
103	IFS="$saved_IFS"
104	return 1
105}
106
107cleanup ()
108{
109	if [ -f $PIDFILE ]; then
110		pid=`cat $PIDFILE`
111		if [ "X$pid" = "X" ]; then
112			echo no sshd running
113		else
114			if [ $pid -lt 2 ]; then
115				echo bad pid for ssd: $pid
116			else
117				$SUDO kill $pid
118			fi
119		fi
120	fi
121}
122
123trace ()
124{
125	if [ "X$TEST_SSH_TRACE" = "Xyes" ]; then
126		echo "$@"
127	fi
128}
129
130verbose ()
131{
132	if [ "X$TEST_SSH_QUIET" != "Xyes" ]; then
133		echo "$@"
134	fi
135}
136
137
138fail ()
139{
140	RESULT=1
141	echo "$@"
142}
143
144fatal ()
145{
146	echon "FATAL: "
147	fail "$@"
148	cleanup
149	exit $RESULT
150}
151
152RESULT=0
153PIDFILE=$OBJ/pidfile
154
155trap fatal 3 2
156
157# create server config
158cat << EOF > $OBJ/sshd_config
159	Port			$PORT
160	ListenAddress		127.0.0.1
161	#ListenAddress		::1
162	PidFile			$PIDFILE
163	AuthorizedKeysFile	$OBJ/authorized_keys_%u
164	LogLevel		QUIET
165	StrictModes		no
166EOF
167
168# server config for proxy connects
169cp $OBJ/sshd_config $OBJ/sshd_proxy
170
171# allow group-writable directories in proxy-mode
172echo 'StrictModes no' >> $OBJ/sshd_proxy
173
174# create client config
175cat << EOF > $OBJ/ssh_config
176Host *
177	Hostname		127.0.0.1
178	HostKeyAlias		localhost-with-alias
179	Port			$PORT
180	User			$USER
181	GlobalKnownHostsFile	$OBJ/known_hosts
182	UserKnownHostsFile	$OBJ/known_hosts
183	RSAAuthentication	yes
184	PubkeyAuthentication	yes
185	ChallengeResponseAuthentication	no
186	HostbasedAuthentication	no
187	PasswordAuthentication	no
188	RhostsRSAAuthentication	no
189	BatchMode		yes
190	StrictHostKeyChecking	yes
191EOF
192
193rm -f $OBJ/known_hosts $OBJ/authorized_keys_$USER
194
195trace "generate keys"
196for t in rsa rsa1; do
197	# generate user key
198	rm -f $OBJ/$t
199	${SSHKEYGEN} -q -N '' -t $t  -f $OBJ/$t ||\
200		fail "ssh-keygen for $t failed"
201
202	# known hosts file for client
203	(
204		echon 'localhost-with-alias,127.0.0.1,::1 '
205		cat $OBJ/$t.pub
206	) >> $OBJ/known_hosts
207
208	# setup authorized keys
209	cat $OBJ/$t.pub >> $OBJ/authorized_keys_$USER
210	echo IdentityFile $OBJ/$t >> $OBJ/ssh_config
211
212	# use key as host key, too
213	$SUDO cp $OBJ/$t $OBJ/host.$t
214	echo HostKey $OBJ/host.$t >> $OBJ/sshd_config
215
216	# don't use SUDO for proxy connect
217	echo HostKey $OBJ/$t >> $OBJ/sshd_proxy
218done
219chmod 644 $OBJ/authorized_keys_$USER
220
221# create a proxy version of the client config
222(
223	cat $OBJ/ssh_config
224	echo proxycommand ${SUDO} ${SSHD} -i -f $OBJ/sshd_proxy
225) > $OBJ/ssh_proxy
226
227# check proxy config
228${SSHD} -t -f $OBJ/sshd_proxy	|| fatal "sshd_proxy broken"
229
230start_sshd ()
231{
232	# start sshd
233	$SUDO ${SSHD} -f $OBJ/sshd_config -t	|| fatal "sshd_config broken"
234	$SUDO ${SSHD} -f $OBJ/sshd_config
235
236	trace "wait for sshd"
237	i=0;
238	while [ ! -f $PIDFILE -a $i -lt 10 ]; do
239		i=`expr $i + 1`
240		sleep $i
241	done
242
243	test -f $PIDFILE || fatal "no sshd running on port $PORT"
244}
245
246# source test body
247. $SCRIPT
248
249# kill sshd
250cleanup
251if [ $RESULT -eq 0 ]; then
252	verbose ok $tid
253else
254	echo failed $tid
255fi
256exit $RESULT
257