#!/bin/bash # rexec.sh # ltask lightweight remote task execution # Copyright (C) 2020 Jonas Gunz # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . 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_FILES=() SCRIPT_INTERPRETER=/bin/sh FILES="" 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 SCRIPT_FILES+=(${ARGV[$i]}) continue 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]};; -f) i=$((i+1)) FILES="${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 [ ${#SCRIPT_FILES[@]} -eq 0 ] && 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 SSH port (default: 22) -s Custom SSH program -i SSH Identity file (default: ~/.ssh/id_rsa.pub) -f FILE Copy FILE to target before execution -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) [ ! -z "$FILES" ] && scp -S "$SSH" -i $SSH_IDENTITY -P $SSH_PORT $FILES $SSH_HOST: cat ${SCRIPT_FILES[@]} | $SSH -p $SSH_PORT -i $SSH_IDENTITY $SSH_HOST "/bin/bash"