#!/bin/bash parssh () { while [[ "$1" == -* ]]; do case ${1#-} in [0-9]*) [[ "${1#-}" != *[^0-9]* ]] && { local parssh_concurrency=${1#-} shift } ;; fo|fouter) [[ -f "$2" ]] || { echo "'$2': invalid file name" return 99 } local parssh_fouter="$2" shift shift ;; esac done [[ -z "$parssh_fouter" ]] && { exec 9<&0 } || { echo "reading $parssh_fouter" exec 9<"$parssh_fouter" } while read host; do while (( $(jobs -pr | wc -l) >= ${parssh_concurrency:-4} )); do sleep 1; done; ssh -no StrictHostKeyChecking=no $host "$@" & done <&9 exec 9>&- }