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