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