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