Viktor Kutuzov | a266b5f | 2009-07-14 20:08:45 +0000 | [diff] [blame] | 1 | #!/bin/sh |
| 2 | # |
| 3 | # Program: RemoteRunSafely.sh |
| 4 | # |
Viktor Kutuzov | fc2271f | 2009-07-18 18:39:24 +0000 | [diff] [blame] | 5 | # Synopsis: This script simply runs another program remotely using ssh. |
| 6 | # It always returns the another program exit code or exit with |
| 7 | # code 255 which indicates that the program could not be executed. |
Viktor Kutuzov | a266b5f | 2009-07-14 20:08:45 +0000 | [diff] [blame] | 8 | # |
| 9 | # Syntax: |
| 10 | # |
| 11 | # RemoteRunSafely.sh <hostname> [-l <login_name>] [-p <port>] |
| 12 | # <program> <args...> |
| 13 | # |
| 14 | # where: |
| 15 | # <hostname> is the remote host to execute the program, |
| 16 | # <login_name> is the username on the remote host, |
| 17 | # <port> is the port used by the remote client, |
| 18 | # <program> is the path to the program to run, |
| 19 | # <args...> are the arguments to pass to the program. |
| 20 | # |
| 21 | |
| 22 | printUsageAndExit() |
| 23 | { |
| 24 | echo "Usage:" |
| 25 | echo "./RemoteRunSafely.sh <hostname> [-l <login_name>] [-p <port>] " \ |
Viktor Kutuzov | fc2271f | 2009-07-18 18:39:24 +0000 | [diff] [blame] | 26 | "<program> <args...>" |
| 27 | exit 255 |
Viktor Kutuzov | a266b5f | 2009-07-14 20:08:45 +0000 | [diff] [blame] | 28 | } |
| 29 | |
| 30 | moreArgsExpected() |
| 31 | { |
| 32 | # $1 - remaining number of arguments |
| 33 | # $2 - number of arguments to shift |
| 34 | if [ $1 -lt $2 ] |
| 35 | then |
| 36 | echo "Error: Wrong number of argumants." |
| 37 | printUsageAndExit |
| 38 | fi |
| 39 | } |
| 40 | |
| 41 | # Save a copy of the original arguments in a string before we |
| 42 | # clobber them with the shift command. |
| 43 | ORIG_ARGS="$*" |
| 44 | #DEBUG: echo 'GOT: '$ORIG_ARGS |
| 45 | |
| 46 | moreArgsExpected $# 1 |
| 47 | RHOST=$1 |
| 48 | shift 1 |
| 49 | |
| 50 | RUSER=`id -un` |
| 51 | RCLIENT=ssh |
| 52 | RPORT= |
| 53 | WORKING_DIR= |
| 54 | |
| 55 | moreArgsExpected $# 1 |
| 56 | if [ $1 = "-l" ]; then |
| 57 | moreArgsExpected $# 2 |
| 58 | RUSER=$2 |
| 59 | shift 2 |
| 60 | fi |
| 61 | moreArgsExpected $# 1 |
| 62 | if [ $1 = "-p" ]; then |
| 63 | moreArgsExpected $# 2 |
| 64 | RPORT="-p $2" |
| 65 | shift 2 |
| 66 | fi |
| 67 | |
| 68 | moreArgsExpected $# 1 |
| 69 | PROGRAM=$(basename $1) |
| 70 | WORKING_DIR=$(dirname $1) |
| 71 | shift 1 |
| 72 | |
| 73 | #DEBUG: echo 'DIR='${0%%`basename $0`} |
| 74 | #DEBUG: echo 'RHOST='$RHOST |
| 75 | #DEBUG: echo 'RUSER='$RUSER |
| 76 | #DEBUG: echo 'PROGRAM='$PROGRAM |
| 77 | #DEBUG: echo 'WORKING_DIR='$WORKING_DIR |
| 78 | #DEBUG: echo 'ARGS='$* |
| 79 | |
| 80 | # Sanity check |
| 81 | if [ "$RHOST" = "" -o "$PROGRAM" = "" ]; then |
| 82 | printUsageAndExit |
| 83 | fi |
| 84 | |
| 85 | # Local program file must exist and be execuatble |
| 86 | local_program=$WORKING_DIR"/"$PROGRAM |
| 87 | if [ ! -x "$local_program" ]; then |
| 88 | echo "File "$local_program" does not exist or is not an executable.." |
Viktor Kutuzov | fc2271f | 2009-07-18 18:39:24 +0000 | [diff] [blame] | 89 | exit 255 |
Viktor Kutuzov | a266b5f | 2009-07-14 20:08:45 +0000 | [diff] [blame] | 90 | fi |
| 91 | |
| 92 | connection=$RUSER'@'$RHOST |
| 93 | remote="./"$PROGRAM |
| 94 | ( |
| 95 | cat $local_program | \ |
| 96 | $RCLIENT $connection $RPORT \ |
| 97 | 'rm -f '$remote' ; ' \ |
| 98 | 'cat > '$remote' ; chmod +x '$remote' ; '$remote' '$*' ; ' \ |
Viktor Kutuzov | fc2271f | 2009-07-18 18:39:24 +0000 | [diff] [blame] | 99 | 'err=$? ; rm -f '$remote' ; exit $err' |
Viktor Kutuzov | a266b5f | 2009-07-14 20:08:45 +0000 | [diff] [blame] | 100 | ) |
Viktor Kutuzov | fc2271f | 2009-07-18 18:39:24 +0000 | [diff] [blame] | 101 | err=$? |
Viktor Kutuzov | a266b5f | 2009-07-14 20:08:45 +0000 | [diff] [blame] | 102 | |
Viktor Kutuzov | a266b5f | 2009-07-14 20:08:45 +0000 | [diff] [blame] | 103 | #DEBUG: echo script exit $err |
Viktor Kutuzov | fc2271f | 2009-07-18 18:39:24 +0000 | [diff] [blame] | 104 | exit $err |
Viktor Kutuzov | a266b5f | 2009-07-14 20:08:45 +0000 | [diff] [blame] | 105 | |