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