You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
libtdevnc/x11vnc/misc/rx11vnc

134 lines
3.1 KiB

#!/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 -t -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