106 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Bash
		
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Bash
		
	
	
	
#!/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
 | 
						|
 |