aboutsummaryrefslogtreecommitdiffstats
path: root/pars.sh
diff options
context:
space:
mode:
Diffstat (limited to 'pars.sh')
-rw-r--r--pars.sh70
1 files changed, 60 insertions, 10 deletions
diff --git a/pars.sh b/pars.sh
index 5839690..93b8ca6 100644
--- a/pars.sh
+++ b/pars.sh
@@ -5,9 +5,14 @@ parssh () {
_parssh_usage
return $?
}
- local origopts=$-
+
+ local _parssh_origopts=$-
set -m
+
+ local _parssh_outfun=_parssh_out
local _parssh_prepend_host=true
+ local _parssh_ssh=_parssh_ssh
+
while [[ "$1" == -* ]]; do
case ${1#-} in
[0-9]*)
@@ -29,11 +34,30 @@ parssh () {
return 98
}
local _parssh_rinput="$2"
+ local _parssh_ssh=_parssh_ssh_rinput
shift
;;
b|-bare)
unset _parssh_prepend_host
;;
+ o|-out)
+ touch "${2}.{out,err}" || {
+ echo "'${2}.{out,err}': unable to write / modify file"
+ return 97
+ }
+ local _parssh_outprefix="$2"
+ local _parssh_outfun=_parssh_out_redirect
+ shift
+ ;;
+ t|-tee)
+ touch "${2}.{out,err}" || {
+ echo "'${2}.{out,err}': unable to write / modify file"
+ return 96
+ }
+ local _parssh_outprefix="$2"
+ local _parssh_outfun=_parssh_out_copy
+ shift
+ ;;
h|-help)
_parssh_usage
return $?
@@ -52,17 +76,23 @@ parssh () {
while (( $(jobs -pr | wc -l) >= ${_parssh_concurrency:-4} )); do
sleep 1
done
- if [[ -z "$_parssh_rinput" ]]; then
- ssh -no StrictHostKeyChecking=no $host "$@" |\
- _parssh_host_prepend &
- else
- ssh -To StrictHostKeyChecking=no $host "$@" < "$_parssh_rinput" |\
- _parssh_host_prepend &
- fi
- done <&9
+ $_parssh_ssh "$@" 2> >(_parssh_host_prepend >&2) |\
+ _parssh_host_prepend &
+ done <&9 2> >($_parssh_outfun err >&2) |\
+ $_parssh_outfun out
+
wait
+
exec 9>&-
- [[ "${origopts//[^m]/}" == "m" ]] || set +m
+ [[ "${_parssh_origopts//[^m]/}" == "m" ]] || set +m
+}
+
+_parssh_ssh () {
+ ssh -no StrictHostKeyChecking=no $host "$@"
+}
+
+_parssh_ssh_rinput () {
+ ssh -To StrictHostKeyChecking=no $host "$@" < "$_parssh_rinput"
}
_parssh_host_prepend ()
@@ -70,8 +100,24 @@ _parssh_host_prepend ()
printf "${_parssh_prepend_host+$host: }%s\n" "$REPLY"
done
+_parssh_out () {
+ cat -
+}
+
+_parssh_out_redirect () {
+ local _parssh_out_stream="$1"
+ cat - > "${_parssh_outprefix}.${_parssh_out_stream}"
+}
+
+_parssh_out_copy () {
+ local _parssh_out_stream="$1"
+ tee "${_parssh_outprefix}.${_parssh_out_stream}"
+}
+
_parssh_usage () {
printf ' %s\n'\
+ "parssh: Parallel SSH orchestration in a Bash session."\
+ ""\
"SYNOPSIS"\
"parssh [-NUM] [-r|--rinput FILE] [-s|--servers FILE] [-b|--bare] [COMMANDS] [< SERVERS]"\
""\
@@ -86,6 +132,10 @@ _parssh_usage () {
" (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."\
+ " -o PREFIX, --out PREFIX (default: unset/inactive)"\
+ " Redirect STDOUT / STDERR to PREFIX.out / PREFIX.err, respectively."\
+ " -t PREFIX, --tee PREFIX (default: unset/inactive)"\
+ " Copy STDOUT / STDERR to PREFIX.out / PREFIX.err, respectively."\
" COMMANDS"\
" The list of commands to be executed remotely by SSH on each SERVER."\
" < SERVERS"\