]> andersk Git - openssh.git/blob - regress/test-exec.sh
652bd49d33072f423b2b908f74cde505925219ec
[openssh.git] / regress / test-exec.sh
1 #       $OpenBSD: test-exec.sh,v 1.35 2008/06/28 13:57:25 djm Exp $
2 #       Placed in the Public Domain.
3
4 #SUDO=sudo
5
6 # Unbreak GNU head(1)
7 _POSIX2_VERSION=199209
8 export _POSIX2_VERSION
9
10 case `uname -s 2>/dev/null` in
11 OSF1*)
12         BIN_SH=xpg4
13         export BIN_SH
14         ;;
15 esac
16
17 if [ ! -z "$TEST_SSH_PORT" ]; then
18         PORT="$TEST_SSH_PORT"
19 else
20         PORT=4242
21 fi
22
23 if [ -x /usr/ucb/whoami ]; then
24         USER=`/usr/ucb/whoami`
25 elif whoami >/dev/null 2>&1; then
26         USER=`whoami`
27 elif logname >/dev/null 2>&1; then
28         USER=`logname`
29 else
30         USER=`id -un`
31 fi
32
33 OBJ=$1
34 if [ "x$OBJ" = "x" ]; then
35         echo '$OBJ not defined'
36         exit 2
37 fi
38 if [ ! -d $OBJ ]; then
39         echo "not a directory: $OBJ"
40         exit 2
41 fi
42 SCRIPT=$2
43 if [ "x$SCRIPT" = "x" ]; then
44         echo '$SCRIPT not defined'
45         exit 2
46 fi
47 if [ ! -f $SCRIPT ]; then
48         echo "not a file: $SCRIPT"
49         exit 2
50 fi
51 if $TEST_SHELL -n $SCRIPT; then
52         true
53 else
54         echo "syntax error in $SCRIPT"
55         exit 2
56 fi
57 unset SSH_AUTH_SOCK
58
59 SRC=`dirname ${SCRIPT}`
60
61 # defaults
62 SSH=ssh
63 SSHD=sshd
64 SSHAGENT=ssh-agent
65 SSHADD=ssh-add
66 SSHKEYGEN=ssh-keygen
67 SSHKEYSCAN=ssh-keyscan
68 SFTP=sftp
69 SFTPSERVER=/usr/libexec/openssh/sftp-server
70 SCP=scp
71
72 # Interop testing
73 PLINK=/usr/local/bin/plink
74 PUTTYGEN=/usr/local/bin/puttygen
75 CONCH=/usr/local/bin/conch
76
77 if [ "x$TEST_SSH_SSH" != "x" ]; then
78         SSH="${TEST_SSH_SSH}"
79 fi
80 if [ "x$TEST_SSH_SSHD" != "x" ]; then
81         SSHD="${TEST_SSH_SSHD}"
82 fi
83 if [ "x$TEST_SSH_SSHAGENT" != "x" ]; then
84         SSHAGENT="${TEST_SSH_SSHAGENT}"
85 fi
86 if [ "x$TEST_SSH_SSHADD" != "x" ]; then
87         SSHADD="${TEST_SSH_SSHADD}"
88 fi
89 if [ "x$TEST_SSH_SSHKEYGEN" != "x" ]; then
90         SSHKEYGEN="${TEST_SSH_SSHKEYGEN}"
91 fi
92 if [ "x$TEST_SSH_SSHKEYSCAN" != "x" ]; then
93         SSHKEYSCAN="${TEST_SSH_SSHKEYSCAN}"
94 fi
95 if [ "x$TEST_SSH_SFTP" != "x" ]; then
96         SFTP="${TEST_SSH_SFTP}"
97 fi
98 if [ "x$TEST_SSH_SFTPSERVER" != "x" ]; then
99         SFTPSERVER="${TEST_SSH_SFTPSERVER}"
100 fi
101 if [ "x$TEST_SSH_SCP" != "x" ]; then
102         SCP="${TEST_SSH_SCP}"
103 fi
104 if [ "x$TEST_SSH_PLINK" != "x" ]; then
105         # Find real binary, if it exists
106         case "${TEST_SSH_PLINK}" in
107         /*) PLINK="${TEST_SSH_PLINK}" ;;
108         *) PLINK=`which ${TEST_SSH_PLINK} 2>/dev/null` ;;
109         esac
110 fi
111 if [ "x$TEST_SSH_PUTTYGEN" != "x" ]; then
112         # Find real binary, if it exists
113         case "${TEST_SSH_PUTTYGEN}" in
114         /*) PUTTYGEN="${TEST_SSH_PUTTYGEN}" ;;
115         *) PUTTYGEN=`which ${TEST_SSH_PUTTYGEN} 2>/dev/null` ;;
116         esac
117 fi
118 if [ "x$TEST_SSH_CONCH" != "x" ]; then
119         CONCH="${TEST_SSH_CONCH}"
120 fi
121
122 # Path to sshd must be absolute for rexec
123 case "$SSHD" in
124 /*) ;;
125 *) SSHD=`which sshd` ;;
126 esac
127
128 if [ "x$TEST_SSH_LOGFILE" = "x" ]; then
129         TEST_SSH_LOGFILE=/dev/null
130 fi
131
132 # these should be used in tests
133 export SSH SSHD SSHAGENT SSHADD SSHKEYGEN SSHKEYSCAN SFTP SFTPSERVER SCP
134 #echo $SSH $SSHD $SSHAGENT $SSHADD $SSHKEYGEN $SSHKEYSCAN $SFTP $SFTPSERVER $SCP
135
136 # helper
137 echon()
138 {
139        if [ "x`echo -n`" = "x" ]; then
140                echo -n "$@"
141        elif [ "x`echo '\c'`" = "x" ]; then
142                echo "$@\c"
143        else
144                fatal "Don't know how to echo without newline."
145        fi
146 }
147
148 have_prog()
149 {
150         saved_IFS="$IFS"
151         IFS=":"
152         for i in $PATH
153         do
154                 if [ -x $i/$1 ]; then
155                         IFS="$saved_IFS"
156                         return 0
157                 fi
158         done
159         IFS="$saved_IFS"
160         return 1
161 }
162
163 cleanup ()
164 {
165         if [ -f $PIDFILE ]; then
166                 pid=`cat $PIDFILE`
167                 if [ "X$pid" = "X" ]; then
168                         echo no sshd running
169                 else
170                         if [ $pid -lt 2 ]; then
171                                 echo bad pid for ssd: $pid
172                         else
173                                 $SUDO kill $pid
174                         fi
175                 fi
176         fi
177 }
178
179 trace ()
180 {
181         echo "trace: $@" >>$TEST_SSH_LOGFILE
182         if [ "X$TEST_SSH_TRACE" = "Xyes" ]; then
183                 echo "$@"
184         fi
185 }
186
187 verbose ()
188 {
189         echo "verbose: $@" >>$TEST_SSH_LOGFILE
190         if [ "X$TEST_SSH_QUIET" != "Xyes" ]; then
191                 echo "$@"
192         fi
193 }
194
195
196 fail ()
197 {
198         echo "FAIL: $@" >>$TEST_SSH_LOGFILE
199         RESULT=1
200         echo "$@"
201 }
202
203 fatal ()
204 {
205         echo "FATAL: $@" >>$TEST_SSH_LOGFILE
206         echon "FATAL: "
207         fail "$@"
208         cleanup
209         exit $RESULT
210 }
211
212 RESULT=0
213 PIDFILE=$OBJ/pidfile
214
215 trap fatal 3 2
216
217 # create server config
218 cat << EOF > $OBJ/sshd_config
219         StrictModes             no
220         Port                    $PORT
221         AddressFamily           inet
222         ListenAddress           127.0.0.1
223         #ListenAddress          ::1
224         PidFile                 $PIDFILE
225         AuthorizedKeysFile      $OBJ/authorized_keys_%u
226         LogLevel                VERBOSE
227         AcceptEnv               _XXX_TEST_*
228         AcceptEnv               _XXX_TEST
229         Subsystem       sftp    $SFTPSERVER
230 EOF
231
232 if [ ! -z "$TEST_SSH_SSHD_CONFOPTS" ]; then
233         trace "adding sshd_config option $TEST_SSH_SSHD_CONFOPTS"
234         echo "$TEST_SSH_SSHD_CONFOPTS" >> $OBJ/sshd_config
235 fi
236
237 # server config for proxy connects
238 cp $OBJ/sshd_config $OBJ/sshd_proxy
239
240 # allow group-writable directories in proxy-mode
241 echo 'StrictModes no' >> $OBJ/sshd_proxy
242
243 # create client config
244 cat << EOF > $OBJ/ssh_config
245 Host *
246         Hostname                127.0.0.1
247         HostKeyAlias            localhost-with-alias
248         Port                    $PORT
249         User                    $USER
250         GlobalKnownHostsFile    $OBJ/known_hosts
251         UserKnownHostsFile      $OBJ/known_hosts
252         RSAAuthentication       yes
253         PubkeyAuthentication    yes
254         ChallengeResponseAuthentication no
255         HostbasedAuthentication no
256         PasswordAuthentication  no
257         BatchMode               yes
258         StrictHostKeyChecking   yes
259 EOF
260
261 if [ ! -z "$TEST_SSH_SSH_CONFOPTS" ]; then
262         trace "adding ssh_config option $TEST_SSH_SSHD_CONFOPTS"
263         echo "$TEST_SSH_SSH_CONFOPTS" >> $OBJ/ssh_config
264 fi
265
266 rm -f $OBJ/known_hosts $OBJ/authorized_keys_$USER
267
268 trace "generate keys"
269 for t in rsa rsa1; do
270         # generate user key
271         rm -f $OBJ/$t
272         ${SSHKEYGEN} -b 1024 -q -N '' -t $t  -f $OBJ/$t ||\
273                 fail "ssh-keygen for $t failed"
274
275         # known hosts file for client
276         (
277                 echon 'localhost-with-alias,127.0.0.1,::1 '
278                 cat $OBJ/$t.pub
279         ) >> $OBJ/known_hosts
280
281         # setup authorized keys
282         cat $OBJ/$t.pub >> $OBJ/authorized_keys_$USER
283         echo IdentityFile $OBJ/$t >> $OBJ/ssh_config
284
285         # use key as host key, too
286         $SUDO cp $OBJ/$t $OBJ/host.$t
287         echo HostKey $OBJ/host.$t >> $OBJ/sshd_config
288
289         # don't use SUDO for proxy connect
290         echo HostKey $OBJ/$t >> $OBJ/sshd_proxy
291 done
292 chmod 644 $OBJ/authorized_keys_$USER
293
294 # Activate Twisted Conch tests if the binary is present
295 REGRESS_INTEROP_CONCH=no
296 if test -x "$CONCH" ; then
297         REGRESS_INTEROP_CONCH=yes
298 fi
299
300 # If PuTTY is present and we are running a PuTTY test, prepare keys and
301 # configuration
302 REGRESS_INTEROP_PUTTY=no
303 if test -x "$PUTTYGEN" -a -x "$PLINK" ; then
304         REGRESS_INTEROP_PUTTY=yes
305 fi
306 case "$SCRIPT" in
307 *putty*)        ;;
308 *)              REGRESS_INTEROP_PUTTY=no ;;
309 esac
310
311 if test "$REGRESS_INTEROP_PUTTY" = "yes" ; then
312         mkdir -p ${OBJ}/.putty
313
314         # Add a PuTTY key to authorized_keys
315         rm -f ${OBJ}/putty.rsa2
316         puttygen -t rsa -o ${OBJ}/putty.rsa2 < /dev/null > /dev/null
317         puttygen -O public-openssh ${OBJ}/putty.rsa2 \
318             >> $OBJ/authorized_keys_$USER
319
320         # Convert rsa2 host key to PuTTY format
321         ${SRC}/ssh2putty.sh 127.0.0.1 $PORT $OBJ/rsa > \
322             ${OBJ}/.putty/sshhostkeys
323         ${SRC}/ssh2putty.sh 127.0.0.1 22 $OBJ/rsa >> \
324             ${OBJ}/.putty/sshhostkeys
325
326         # Setup proxied session
327         mkdir -p ${OBJ}/.putty/sessions
328         rm -f ${OBJ}/.putty/sessions/localhost_proxy
329         echo "Hostname=127.0.0.1" >> ${OBJ}/.putty/sessions/localhost_proxy
330         echo "PortNumber=$PORT" >> ${OBJ}/.putty/sessions/localhost_proxy
331         echo "ProxyMethod=5" >> ${OBJ}/.putty/sessions/localhost_proxy
332         echo "ProxyTelnetCommand=sh ${SRC}/sshd-log-wrapper.sh ${SSHD} ${TEST_SSH_LOGFILE} -i -f $OBJ/sshd_proxy" >> ${OBJ}/.putty/sessions/localhost_proxy 
333
334         REGRESS_INTEROP_PUTTY=yes
335 fi
336
337 # create a proxy version of the client config
338 (
339         cat $OBJ/ssh_config
340         echo proxycommand ${SUDO} sh ${SRC}/sshd-log-wrapper.sh ${SSHD} ${TEST_SSH_LOGFILE} -i -f $OBJ/sshd_proxy
341 ) > $OBJ/ssh_proxy
342
343 # check proxy config
344 ${SSHD} -t -f $OBJ/sshd_proxy   || fatal "sshd_proxy broken"
345
346 start_sshd ()
347 {
348         # start sshd
349         $SUDO ${SSHD} -f $OBJ/sshd_config "$@" -t || fatal "sshd_config broken"
350         $SUDO ${SSHD} -f $OBJ/sshd_config -e "$@" >>$TEST_SSH_LOGFILE 2>&1
351
352         trace "wait for sshd"
353         i=0;
354         while [ ! -f $PIDFILE -a $i -lt 10 ]; do
355                 i=`expr $i + 1`
356                 sleep $i
357         done
358
359         test -f $PIDFILE || fatal "no sshd running on port $PORT"
360 }
361
362 # source test body
363 . $SCRIPT
364
365 # kill sshd
366 cleanup
367 if [ $RESULT -eq 0 ]; then
368         verbose ok $tid
369 else
370         echo failed $tid
371 fi
372 exit $RESULT
This page took 0.053572 seconds and 3 git commands to generate.