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