aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pars.sh65
1 files changed, 50 insertions, 15 deletions
diff --git a/pars.sh b/pars.sh
index f6741b7..5839690 100644
--- a/pars.sh
+++ b/pars.sh
@@ -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
+}