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