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