#!/bin/sh # # usage: rx11vnc [-s] : # rx11vnc [-s] (assumes xdisplay is 0) # # -s means use ssh instead of rsh. # -S tries to tunnel the vnc traffic thru ssh. (experimental...) # #set -xv # # Place your x11vnc cmd + options here (must have -bg and -display # with -display as the last one) # cmd="x11vnc -nap -q -bg -display" viewer="vncviewer" rsh=rsh # # The following two settings are only used under -S (ssh tunnel) # # Unfortunately, we have to set up the ssh port redirection *before* # x11vnc has started and selected its listening port. # tunnel_ports is a list of ports we expect/hope to be free on both # the local and remote machines: # tunnel_ports="5900 5901 5902 5903" # # VNC has a poor default in that if the client appears to be emanating # from the local machine, then raw encoding is preferred. With ssh port # redirection we appear to be coming from the localhost, but we are not. # We pass this encoding list to the viewer to give lowest preference to # raw encoding: # tunnel_encodings="copyrect tight zrle hextile zlib corre rre" if [ "$USER" = "runge" ]; then cmd="x11vnc.expt -nap -q -bg -rfbauth .vnc/passwd -display" viewer="vncviewerz" fi if [ "X$1" = "X-s" ]; then shift rsh=ssh elif [ "X$1" = "X-S" ]; then shift rsh=ssh tunnel=1 cmd=`echo "$cmd" | sed -e 's/ / -localhost /'` fi remote=$1 if echo "$remote" | grep ':' > /dev/null; then : else remote="$remote:0" fi host=`echo "$remote" | awk -F: '{print $1}'` disp=`echo "$remote" | awk -F: '{print $2}'` disp=":$disp" if [ "X$host" = "X" ]; then echo "bad host." exit 1 fi # start the remote x11vnc: if [ $tunnel ]; then # much more kludgy for tunnelling: tmp=/tmp/rx11vnc.$$ redir="" used_ports=`netstat -an | egrep '(ESTABLISHED|LISTEN) *$' \ | sed -e 's/^[ ]*//' -e 's/^tcp[ 0-9][ 0-9]*//' \ -e 's/[ ].*$//' -e 's/^.*[^0-9]//' | sort -nu` for p in $tunnel_ports do ok=1 for u in $used_ports do if [ "X$p" = "X$u" ]; then echo "port $u is in use. skipping it" ok= break fi done if [ $ok ]; then redir="$redir -L $p:localhost:$p" fi done # # Have ssh put the command in the bg, then we look for PORT= # in the tmp file. The sleep at the end is to give us enough # time to connect thru the port redir, otherwise ssh will exit # before we can connect. # time=15 $rsh -f $redir $host "$cmd $disp; echo END; sleep $time" > $tmp i=0 while [ $i -lt $time ] do sleep 1 if grep '^PORT=' $tmp > /dev/null; then port=`grep '^PORT=' $tmp | sed -e 's/PORT=//'` if [ "X$port" != "X" ]; then break fi fi i=`expr $i + 1` done cat $tmp rm -f $tmp else port=`$rsh $host "$cmd $disp" | grep '^PORT=' | sed -e 's/PORT=//'` fi echo "x11vnc port is '$port'" # now start up the viewer on this end: if echo "$port" | grep '^[0-9][0-9]*$' > /dev/null; then if [ $port -lt 6000 -a $port -ge 5900 ]; then # vncviewer special cases 0-99 port=`expr $port - 5900` fi if [ $tunnel ]; then $viewer -encodings "$tunnel_encodings" "localhost:$port" else $viewer "$host:$port" fi else echo "bad port." exit 1 fi