rx11vnc revision a430b2b5ca4f0967836f5820e8f03adc17fc0a24
1#!/bin/sh 2# 3# usage: rx11vnc [-s] <host>:<xdisplay> 4# rx11vnc [-s] <host> (assumes xdisplay is 0) 5# 6# -s means use ssh instead of rsh. 7# -S tries to tunnel the vnc traffic thru ssh. (experimental...) 8# 9#set -xv 10 11# 12# Place your x11vnc cmd + options here (must have -bg and -display 13# with -display as the last one) 14# 15cmd="x11vnc -nap -q -bg -display" 16viewer="vncviewer" 17rsh=rsh 18 19# 20# The following two settings are only used under -S (ssh tunnel) 21# 22# Unfortunately, we have to set up the ssh port redirection *before* 23# x11vnc has started and selected its listening port. 24# tunnel_ports is a list of ports we expect/hope to be free on both 25# the local and remote machines: 26# 27tunnel_ports="5900 5901 5902 5903" 28# 29# VNC has a poor default in that if the client appears to be emanating 30# from the local machine, then raw encoding is preferred. With ssh port 31# redirection we appear to be coming from the localhost, but we are not. 32# We pass this encoding list to the viewer to give lowest preference to 33# raw encoding: 34# 35tunnel_encodings="copyrect tight zrle hextile zlib corre rre" 36 37if [ "$USER" = "runge" ]; then 38 cmd="x11vnc.expt -nap -q -bg -rfbauth .vnc/passwd -display" 39 viewer="vncviewerz" 40fi 41 42if [ "X$1" = "X-s" ]; then 43 shift 44 rsh=ssh 45elif [ "X$1" = "X-S" ]; then 46 shift 47 rsh=ssh 48 tunnel=1 49 cmd=`echo "$cmd" | sed -e 's/ / -localhost /'` 50fi 51 52remote=$1 53if echo "$remote" | grep ':' > /dev/null; then 54 : 55else 56 remote="$remote:0" 57fi 58 59host=`echo "$remote" | awk -F: '{print $1}'` 60disp=`echo "$remote" | awk -F: '{print $2}'` 61disp=":$disp" 62if [ "X$host" = "X" ]; then 63 echo "bad host." 64 exit 1 65fi 66 67# start the remote x11vnc: 68if [ $tunnel ]; then 69 # much more kludgy for tunnelling: 70 tmp=/tmp/rx11vnc.$$ 71 redir="" 72 used_ports=`netstat -an | egrep '(ESTABLISHED|LISTEN) *$' \ 73 | sed -e 's/^[ ]*//' -e 's/^tcp[ 0-9][ 0-9]*//' \ 74 -e 's/[ ].*$//' -e 's/^.*[^0-9]//' | sort -nu` 75 for p in $tunnel_ports 76 do 77 ok=1 78 for u in $used_ports 79 do 80 if [ "X$p" = "X$u" ]; then 81 echo "port $u is in use. skipping it" 82 ok= 83 break 84 fi 85 done 86 if [ $ok ]; then 87 redir="$redir -L $p:localhost:$p" 88 fi 89 done 90 # 91 # Have ssh put the command in the bg, then we look for PORT= 92 # in the tmp file. The sleep at the end is to give us enough 93 # time to connect thru the port redir, otherwise ssh will exit 94 # before we can connect. 95 # 96 time=15 97 $rsh -t -f $redir $host "$cmd $disp; echo END; sleep $time" > $tmp 98 99 i=0 100 while [ $i -lt $time ] 101 do 102 sleep 1 103 if grep '^PORT=' $tmp > /dev/null; then 104 port=`grep '^PORT=' $tmp | sed -e 's/PORT=//'` 105 if [ "X$port" != "X" ]; then 106 break 107 fi 108 fi 109 i=`expr $i + 1` 110 done 111 cat $tmp 112 rm -f $tmp 113else 114 port=`$rsh $host "$cmd $disp" | grep '^PORT=' | sed -e 's/PORT=//'` 115fi 116 117echo "x11vnc port is '$port'" 118 119# now start up the viewer on this end: 120if echo "$port" | grep '^[0-9][0-9]*$' > /dev/null; then 121 if [ $port -lt 6000 -a $port -ge 5900 ]; then 122 # vncviewer special cases 0-99 123 port=`expr $port - 5900` 124 fi 125 if [ $tunnel ]; then 126 $viewer -encodings "$tunnel_encodings" "localhost:$port" 127 else 128 $viewer "$host:$port" 129 fi 130else 131 echo "bad port." 132 exit 1 133fi 134