| #!/bin/sh | 
 | # | 
 | # Program:  RemoteRunSafely.sh | 
 | # | 
 | # Synopsis: This script simply runs another program remotely using ssh. | 
 | #           It always returns the another program exit code or exit with | 
 | #           code 255 which indicates that the program could not be executed. | 
 | # | 
 | # Syntax:  | 
 | # | 
 | #   RemoteRunSafely.sh <hostname> [-l <login_name>] [-p <port>] | 
 | #                <program> <args...> | 
 | # | 
 | #   where: | 
 | #     <hostname>    is the remote host to execute the program, | 
 | #     <login_name>  is the username on the remote host, | 
 | #     <port>        is the port used by the remote client, | 
 | #     <program>     is the path to the program to run, | 
 | #     <args...>     are the arguments to pass to the program. | 
 | # | 
 |  | 
 | printUsageAndExit() | 
 | { | 
 |   echo "Usage:" | 
 |   echo "./RemoteRunSafely.sh <hostname> [-l <login_name>] [-p <port>] " \ | 
 |        "<program> <args...>" | 
 |   exit 255 | 
 | } | 
 |  | 
 | moreArgsExpected() | 
 | { | 
 |   # $1 - remaining number of arguments | 
 |   # $2 - number of arguments to shift | 
 |   if [ $1 -lt $2 ] | 
 |   then | 
 |     echo "Error: Wrong number of argumants." | 
 |     printUsageAndExit | 
 |   fi | 
 | } | 
 |  | 
 | # Save a copy of the original arguments in a string before we | 
 | # clobber them with the shift command. | 
 | ORIG_ARGS="$*" | 
 | #DEBUG: echo 'GOT: '$ORIG_ARGS | 
 |  | 
 | moreArgsExpected $# 1 | 
 | RHOST=$1 | 
 | shift 1 | 
 |  | 
 | RUSER=`id -un` | 
 | RCLIENT=ssh | 
 | RPORT= | 
 | WORKING_DIR= | 
 |  | 
 | moreArgsExpected $# 1 | 
 | if [ $1 = "-l" ]; then | 
 |   moreArgsExpected $# 2 | 
 |   RUSER=$2 | 
 |   shift 2 | 
 | fi | 
 | moreArgsExpected $# 1 | 
 | if [ $1 = "-p" ]; then | 
 |   moreArgsExpected $# 2 | 
 |   RPORT="-p $2" | 
 |   shift 2 | 
 | fi | 
 |  | 
 | moreArgsExpected $# 1 | 
 | PROGRAM=$(basename $1) | 
 | WORKING_DIR=$(dirname $1) | 
 | shift 1 | 
 |  | 
 | #DEBUG: echo 'DIR='${0%%`basename $0`} | 
 | #DEBUG: echo 'RHOST='$RHOST | 
 | #DEBUG: echo 'RUSER='$RUSER | 
 | #DEBUG: echo 'PROGRAM='$PROGRAM | 
 | #DEBUG: echo 'WORKING_DIR='$WORKING_DIR | 
 | #DEBUG: echo 'ARGS='$* | 
 |  | 
 | # Sanity check | 
 | if [ "$RHOST" = "" -o "$PROGRAM" = "" ]; then | 
 |   printUsageAndExit | 
 | fi | 
 |  | 
 | # Local program file must exist and be execuatble | 
 | local_program=$WORKING_DIR"/"$PROGRAM | 
 | if [ ! -x "$local_program" ]; then | 
 |   echo "File "$local_program" does not exist or is not an executable.." | 
 |   exit 255 | 
 | fi | 
 |  | 
 | connection=$RUSER'@'$RHOST | 
 | remote="./"$PROGRAM | 
 | ( | 
 |   cat $local_program |        \ | 
 |   $RCLIENT $connection $RPORT \ | 
 |    'rm -f '$remote' ; '       \ | 
 |    'cat > '$remote' ; chmod +x '$remote' ; '$remote' '$*' ; ' \ | 
 |    'err=$? ; rm -f '$remote' ; exit $err' | 
 | ) | 
 | err=$? | 
 |  | 
 | #DEBUG: echo script exit $err | 
 | exit $err | 
 |  |