forked from llvm-mirror/llvm
-
Notifications
You must be signed in to change notification settings - Fork 0
/
RemoteRunSafely.sh
105 lines (92 loc) · 2.29 KB
/
RemoteRunSafely.sh
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
#!/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