From: Egbert Eich Date: Tue Feb 11 19:10:37 2014 +0100 Subject: [PATCH]Add ssh support to 'xon' Patch-Mainline: to be upstreamed Git-commit: e967f71f0432cdd9b4ffb25bca5ad8dff7295c22 Git-repo: References: Signed-off-by: Egbert Eich 'xon' has been around for ages, it's a small script that can be used to start any xclient remotely. It did so by opening a shell connection using 'rsh' or 'rcmd' to connect to the remote system. Today (hopefully) nobody has rsh installed any more for security reasons. 'ssh' has become the remote login tool of chioce which also allows to tunnel the X protocol over a secure channel. This patch adds ssh support to xon to make it useful again. Signed-off-by: Egbert Eich --- xon | 61 ++++++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 48 insertions(+), 13 deletions(-) diff --git a/xon b/xon index 772b357..959e0e7 100644 --- a/xon +++ b/xon @@ -32,20 +32,27 @@ target=$1 shift label=$target resource=xterm-$label -if [ -f /usr/bin/remsh ]; then +if [ -x /usr/bin/ssh ]; then + rsh=/usr/bin/ssh +elif [ -f /usr/bin/remsh ]; then rsh=/usr/bin/remsh elif [ -f /usr/bin/rcmd ]; then rsh=/usr/bin/rcmd else rsh=rsh fi -rcmd="$rsh $target -n" -case $DISPLAY in +case $rsh in + *ssh) rcmd_args="-Y $target" ;; + *) rcmd_args="$target -n" ;; +esac + +display=$DISPLAY +case $display in unix:*) - DISPLAY=`echo $DISPLAY | sed 's/unix//'` + display=`echo $display | sed 's/unix//'` ;; esac -case $DISPLAY in +case $display in :*) case `uname` in Linux*) @@ -61,10 +68,10 @@ case $DISPLAY in esac hostname=`echo $fullname | sed 's/\..*$//'` if [ $hostname = $target ] || [ $fullname = $target ]; then - DISPLAY=$DISPLAY + display=$display rcmd="sh -c" else - DISPLAY=$fullname$DISPLAY + display=$fullname$display fi ;; esac @@ -79,17 +86,23 @@ x) xpath='HOME=${HOME-`pwd`} XUSERFILESEARCHPATH=${XUSERFILESEARCHPATH-"'"$XUSERFILESEARCHPATH"'"} ' ;; esac -redirect=" < /dev/null > /dev/null 2>&1 &" +debug=n command= ls=-ls continue=: +remote_background= +rcmd_background_arg= + while $continue; do case $1 in -remote) shift if [ $rsh != "sh" ]; then rsh="$1" - rcmd="$rsh $target -n" + case $rsh in + *ssh) rcmd_args="-fY $target" ;; + *) rcmd_args="$target -n" ;; + esac fi shift;; -user) @@ -102,7 +115,10 @@ while $continue; do username="-l $1" label="$target $1" - rcmd="$rsh $target $username -n" + case $rsh in + *ssh) rcmd_args="-Y ${username}@${target}" ;; + *) rcmd_args="$rsh $target $username -n" ;; + esac shift case x$XAUTHORITY in x) @@ -139,7 +155,7 @@ while $continue; do ;; -debug) shift - redirect= + debug=y ;; -screen) shift @@ -149,7 +165,7 @@ while $continue; do usage "-screen option requires an argument" fi - DISPLAY=`echo $DISPLAY | sed 's/:\\([0-9][0-9]*\\)\\.[0-9]/:\1/'`.$1 + display=`echo $display | sed 's/:\\([0-9][0-9]*\\)\\.[0-9]/:\1/'`.$1 shift ;; *) @@ -171,7 +187,26 @@ x*) sess_mangr="SESSION_MANAGER=$SESSION_MANAGER " ;; esac -vars='PATH=${PATH:+$PATH:}/usr/X11R6/bin '"$xpath$xauth$sess_mangr"DISPLAY="$DISPLAY" +vars='PATH=${PATH:+$PATH:}/usr/X11R6/bin '"$xpath$xauth$sess_mangr" +case $rsh in + *ssh) + rcmd_background_arg="-f " + ;; + *) + remote_background="&"; + DISPLAY=$display + vars=${vars}DISPLAY="$DISPLAY" + ;; +esac + +if [ "$debug" = "n" ] +then + rcmd_args=$rcmd_background_arg$rcmd_args + redirect=" < /dev/null > /dev/null 2>&1 $remote_background" +fi + +[ "z" = "z$rcmd" ] && rcmd="$rsh $rcmd_args" + case $# in 0) $rcmd 'sh -c '"'$vars"' xterm '$ls' -name "'"$resource"'" -T "'"$label"'" -n "'"$label"'" '"$redirect'"