diff options
-rw-r--r-- | pars.sh | 65 |
1 files changed, 50 insertions, 15 deletions
@@ -1,52 +1,63 @@ #!/bin/bash parssh () { + (( $# )) || { + _parssh_usage + return $? + } local origopts=$- set -m + local _parssh_prepend_host=true while [[ "$1" == -* ]]; do case ${1#-} in [0-9]*) [[ "${1#-}" != *[^0-9]* ]] && { - local parssh_concurrency=${1#-} + local _parssh_concurrency=${1#-} } ;; - fo|fouter) + s|-servers) [[ -r "$2" ]] || { echo "'$2': invalid file name or permissions issue" return 99 } - local parssh_fouter="$2" + local _parssh_servers="$2" shift ;; - fi|finner) + r|-rinput) [[ -r "$2" ]] || { echo "'$2': invalid file name or permissions issue" return 98 } - local parssh_finner="$2" + local _parssh_rinput="$2" shift ;; - p|prepend_host) - local parssh_prepend_host=true + b|-bare) + unset _parssh_prepend_host + ;; + h|-help) + _parssh_usage + return $? ;; esac shift done - [[ -z "$parssh_fouter" ]] && { + [[ -z "$_parssh_servers" ]] && { exec 9<&0 } || { - exec 9<"$parssh_fouter" + exec 9<"$_parssh_servers" } while read host; do - while (( $(jobs -pr | wc -l) >= ${parssh_concurrency:-4} )); do + while (( $(jobs -pr | wc -l) >= ${_parssh_concurrency:-4} )); do sleep 1 done - if [[ -z "$parssh_finner" ]]; then - ssh -no StrictHostKeyChecking=no $host "$@" | host_prepend & + if [[ -z "$_parssh_rinput" ]]; then + ssh -no StrictHostKeyChecking=no $host "$@" |\ + _parssh_host_prepend & else - ssh -To StrictHostKeyChecking=no $host "$@" < "$parssh_finner" | host_prepend & + ssh -To StrictHostKeyChecking=no $host "$@" < "$_parssh_rinput" |\ + _parssh_host_prepend & fi done <&9 wait @@ -54,7 +65,31 @@ parssh () { [[ "${origopts//[^m]/}" == "m" ]] || set +m } -host_prepend () +_parssh_host_prepend () while read -r; do - printf "${parssh_prepend_host+$host: }%s\n" "$REPLY" + printf "${_parssh_prepend_host+$host: }%s\n" "$REPLY" done + +_parssh_usage () { + printf ' %s\n'\ + "SYNOPSIS"\ + "parssh [-NUM] [-r|--rinput FILE] [-s|--servers FILE] [-b|--bare] [COMMANDS] [< SERVERS]"\ + ""\ + "DESCRIPTION"\ + " -NUM (default: 4)"\ + " Number of concurrent ssh connections to maintain. E.g. '-40'."\ + " -r FILE, --rinput FILE (default: unset/inactive)"\ + " File to send as STDIN redirection on remote servers."\ + " (Can be used as replacement for or in conjunction with COMMANDS)."\ + " -s FILE, --servers FILE (default: unset/inactive)"\ + " File to use as list of servers to run COMMANDS on."\ + " (Cannot be used in conjunction with a server list on STDIN)."\ + " -b, --bare (default: unset/inactive)"\ + " Disable prepending of hostname to each output line returned by COMMANDS on SERVERS."\ + " COMMANDS"\ + " The list of commands to be executed remotely by SSH on each SERVER."\ + " < SERVERS"\ + " Unless '-s' flag is used, STDIN will be used as list of remote servers."\ + " (Deliniated by whitespace)." + return 1 +} |