reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
#!/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