rx11vnc 3.07 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
#!/bin/sh
#
# usage: rx11vnc [-s] <host>:<xdisplay>
#        rx11vnc [-s] <host>            (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