#!/bin/sh # # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. # usage() { echo "Usage: $0 [options] command. Run a command on each host in \$HOSTS. Options: -l USER passed to ssh - run as USER. -t passed to ssh - create a terminal. -b run in background, wait for commands to complete. -d run in background, don't wait for commands to complete. -s SECONDS sleep between starting commands. -q don't print banner lines for each host. -o SUFFIX log output of each command to .SUFFIX " exit 1 } while getopts "tl:bs:dqo:" opt; do case $opt in l) SSHOPTS="-l$OPTARG $SSHOPTS" ;; t) SSHOPTS="-t $SSHOPTS" ;; b) BACKGROUND=1 ;; d) BACKGROUND=1; DISOWN=1 ;; s) SLEEP="sleep $OPTARG" ;; q) NOBANNER=1 ;; o) SUFFIX=$OPTARG ;; *) usage;; esac done shift `expr $OPTIND - 1` test "$*" || usage; OK_FILE=`mktemp` # Will be deleted if anything goes wrong. trap "rm -f $OK_FILE" EXIT do_ssh() { h=$1; shift if test $SUFFIX ; then ssh $SSHOPTS $h "$@" &> $h.$SUFFIX else ssh $SSHOPTS $h "$@"; fi || rm -rf $OK_FILE; } for h in $HOSTS ; do test "$NOBANNER" || echo "== ssh $SSHOPTS $h $@ ==" if [ "$BACKGROUND" = 1 ]; then do_ssh $h "$@" & CHILDREN="$! $CHILDREN" else do_ssh $h "$@" fi $SLEEP done if [ "$DISOWN" = 1 ]; then for c in $CHILDREN; do disown $c; done else wait fi test -f $OK_FILE