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