aboutsummaryrefslogtreecommitdiff
path: root/scripts/rexec.sh
blob: 3efe64d0ea2c9fb2e1936ada164cf12528b7e544 (plain)
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
#!/bin/bash

ARGC=$#
ARGV=($@)

SSH_IDENTITY=~/.ssh/id_rsa
SSH_PORT=22
SSH_HOST=

SSH_OPTIONS="-o NumberOfPasswordPrompts=0 -o StrictHostKeyChecking=no"
SSH="ssh $SSH_OPTIONS"

SCRIPT_FILE=
SCRIPT_INTERPRETER=/bin/sh

function parse_args() {
	for (( i=0; i < $ARGC;i++ )); do
		local ARGREGEX="^-.*"
		if [[ ! ${ARGV[$i]} =~ $ARGREGEX ]]; then
			[ -z $SSH_HOST ] && SSH_HOST=${ARGV[$i]} && continue
			[ -z $SCRIPT_FILE ] && SCRIPT_FILE=${ARGV[$i]} && continue
			
			print_help 1
		fi

		case ${ARGV[$i]} in
			-p)
				i=$((i+1))
				SSH_PORT=${ARGV[$i]};;
			-s)
				i=$((i+1))
				SSH=${ARGV[$i]} $SSH_OPTIONS;;
			-i)
				i=$((i+1))
				SSH_IDENTITY=${ARGV[$i]};;
			-h)
				print_help 0;;
			*)
				echo Invalid Argument ${ARGV[$i]}
				echo $0 -h for help
				exit 1;;
		esac

	done
	
	[ -z $SSH_HOST ] && echo No host specified && exit 1
	[ -z $SCRIPT_FILE ] && echo No script specified && exit 1
}

function print_help() {
	cat << EOF
Execute a script on a remote host via SSH

Usage:
$0 [OPTIONS] [USER@]HOST SCRIPT
	-p <PORT>	SSH port (default: 22)
	-s <SSH>	Custom SSH program
	-i <IDENTITY>	SSH Identity file (default: ~/.ssh/id_rsa.pub)
	-h		Print this help text
EOF
	exit $1
}

parse_args

[ ! -f $SCRIPT_FILE ] && echo \"$SCRIPT_FILE\" not found && exit 1

INTERPRETER_STRING=$(head -n 1 $SCRIPT_FILE)
INTERPRETER_REGEX="^#!.*"
[[ $INTERPRETER_STRING =~ $INTERPRETER_REGEX ]] && SCRIPT_INTERPRETER=$(tail -c +3 <<< $INTERPRETER_STRING)

cat $SCRIPT_FILE | $SSH -p $SSH_PORT -i $SSH_IDENTITY $SSH_HOST $SCRIPT_INTERPRETER