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