1*4f52dfbbSDag-Erling Smørgrav# $OpenBSD: dynamic-forward.sh,v 1.13 2017/09/21 19:18:12 markus Exp $ 2ce3adf43SDag-Erling Smørgrav# Placed in the Public Domain. 3ce3adf43SDag-Erling Smørgrav 4ce3adf43SDag-Erling Smørgravtid="dynamic forwarding" 5ce3adf43SDag-Erling Smørgrav 6ce3adf43SDag-Erling SmørgravFWDPORT=`expr $PORT + 1` 7ce3adf43SDag-Erling Smørgrav 8ce3adf43SDag-Erling Smørgravif have_prog nc && nc -h 2>&1 | grep "proxy address" >/dev/null; then 9ce3adf43SDag-Erling Smørgrav proxycmd="nc -x 127.0.0.1:$FWDPORT -X" 10ce3adf43SDag-Erling Smørgravelif have_prog connect; then 11ce3adf43SDag-Erling Smørgrav proxycmd="connect -S 127.0.0.1:$FWDPORT -" 12ce3adf43SDag-Erling Smørgravelse 13ce3adf43SDag-Erling Smørgrav echo "skipped (no suitable ProxyCommand found)" 14ce3adf43SDag-Erling Smørgrav exit 0 15ce3adf43SDag-Erling Smørgravfi 16ce3adf43SDag-Erling Smørgravtrace "will use ProxyCommand $proxycmd" 17ce3adf43SDag-Erling Smørgrav 18ce3adf43SDag-Erling Smørgravstart_sshd 19ce3adf43SDag-Erling Smørgrav 20*4f52dfbbSDag-Erling Smørgravfor d in D R; do 21ce3adf43SDag-Erling Smørgrav n=0 22ce3adf43SDag-Erling Smørgrav error="1" 23ce3adf43SDag-Erling Smørgrav trace "start dynamic forwarding, fork to background" 24*4f52dfbbSDag-Erling Smørgrav 25ce3adf43SDag-Erling Smørgrav while [ "$error" -ne 0 -a "$n" -lt 3 ]; do 26ce3adf43SDag-Erling Smørgrav n=`expr $n + 1` 27*4f52dfbbSDag-Erling Smørgrav ${SSH} -F $OBJ/ssh_config -f -$d $FWDPORT -q \ 28ce3adf43SDag-Erling Smørgrav -oExitOnForwardFailure=yes somehost exec sh -c \ 29ce3adf43SDag-Erling Smørgrav \'"echo \$\$ > $OBJ/remote_pid; exec sleep 444"\' 30ce3adf43SDag-Erling Smørgrav error=$? 31ce3adf43SDag-Erling Smørgrav if [ "$error" -ne 0 ]; then 32*4f52dfbbSDag-Erling Smørgrav trace "forward failed attempt $n err $error" 33ce3adf43SDag-Erling Smørgrav sleep $n 34ce3adf43SDag-Erling Smørgrav fi 35ce3adf43SDag-Erling Smørgrav done 36ce3adf43SDag-Erling Smørgrav if [ "$error" -ne 0 ]; then 37*4f52dfbbSDag-Erling Smørgrav fatal "failed to start dynamic forwarding" 38ce3adf43SDag-Erling Smørgrav fi 39ce3adf43SDag-Erling Smørgrav 40ce3adf43SDag-Erling Smørgrav for s in 4 5; do 41ce3adf43SDag-Erling Smørgrav for h in 127.0.0.1 localhost; do 42*4f52dfbbSDag-Erling Smørgrav trace "testing ssh socks version $s host $h (-$d)" 43ce3adf43SDag-Erling Smørgrav ${SSH} -F $OBJ/ssh_config \ 44ce3adf43SDag-Erling Smørgrav -o "ProxyCommand ${proxycmd}${s} $h $PORT" \ 45*4f52dfbbSDag-Erling Smørgrav somehost cat ${DATA} > ${COPY} 46*4f52dfbbSDag-Erling Smørgrav test -f ${COPY} || fail "failed copy ${DATA}" 47*4f52dfbbSDag-Erling Smørgrav cmp ${DATA} ${COPY} || fail "corrupted copy of ${DATA}" 48ce3adf43SDag-Erling Smørgrav done 49ce3adf43SDag-Erling Smørgrav done 50ce3adf43SDag-Erling Smørgrav 51ce3adf43SDag-Erling Smørgrav if [ -f $OBJ/remote_pid ]; then 52ce3adf43SDag-Erling Smørgrav remote=`cat $OBJ/remote_pid` 53ce3adf43SDag-Erling Smørgrav trace "terminate remote shell, pid $remote" 54ce3adf43SDag-Erling Smørgrav if [ $remote -gt 1 ]; then 55ce3adf43SDag-Erling Smørgrav kill -HUP $remote 56ce3adf43SDag-Erling Smørgrav fi 57ce3adf43SDag-Erling Smørgrav else 58ce3adf43SDag-Erling Smørgrav fail "no pid file: $OBJ/remote_pid" 59ce3adf43SDag-Erling Smørgrav fi 60*4f52dfbbSDag-Erling Smørgrav 61ce3adf43SDag-Erling Smørgravdone 62