Created
October 2, 2013 08:31
-
-
Save somian/6790687 to your computer and use it in GitHub Desktop.
Karl Runge's rx11vnc script
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment