1#!/bin/sh 2# 3# Program: RemoteRunSafely.sh 4# 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. 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 22printUsageAndExit() 23{ 24 echo "Usage:" 25 echo "./RemoteRunSafely.sh <hostname> [-l <login_name>] [-p <port>] " \ 26 "<program> <args...>" 27 exit 255 28} 29 30moreArgsExpected() 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. 43ORIG_ARGS="$*" 44#DEBUG: echo 'GOT: '$ORIG_ARGS 45 46moreArgsExpected $# 1 47RHOST=$1 48shift 1 49 50RUSER=`id -un` 51RCLIENT=ssh 52RPORT= 53WORKING_DIR= 54 55moreArgsExpected $# 1 56if [ $1 = "-l" ]; then 57 moreArgsExpected $# 2 58 RUSER=$2 59 shift 2 60fi 61moreArgsExpected $# 1 62if [ $1 = "-p" ]; then 63 moreArgsExpected $# 2 64 RPORT="-p $2" 65 shift 2 66fi 67 68moreArgsExpected $# 1 69PROGRAM=$(basename $1) 70WORKING_DIR=$(dirname $1) 71shift 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 81if [ "$RHOST" = "" -o "$PROGRAM" = "" ]; then 82 printUsageAndExit 83fi 84 85# Local program file must exist and be execuatble 86local_program=$WORKING_DIR"/"$PROGRAM 87if [ ! -x "$local_program" ]; then 88 echo "File "$local_program" does not exist or is not an executable.." 89 exit 255 90fi 91 92connection=$RUSER'@'$RHOST 93remote="./"$PROGRAM 94( 95 cat $local_program | \ 96 $RCLIENT $connection $RPORT \ 97 'rm -f '$remote' ; ' \ 98 'cat > '$remote' ; chmod +x '$remote' ; '$remote' '$*' ; ' \ 99 'err=$? ; rm -f '$remote' ; exit $err' 100) 101err=$? 102 103#DEBUG: echo script exit $err 104exit $err 105 106