各ユーザーとSSH複数のホスト

各ユーザーとSSH複数のホスト

各ユーザーとSSHを使用して複数のリモートサーバーを繰り返し、いくつかのコマンドを実行しようとしています。私はシェルスクリプトのようなものを試しました。

#!/bin/bash
Q_HOST=host1 host2 host3  #list of hosts
Q_USER=user1 user2 user3  #list of users
for host in Q_HOST; user in Q_USER;
do
ssh $user@host df -h
done

しかし、これがこれを繰り返す正しい方法ではないようです。これを達成する方法を案内してもらえますか?

答え1

ホストごとにユーザーが1人だけだとすると、リストを次の場所に配置できます。ソートそして、配列の1つのインデックスを繰り返します(どの配列かは関係ありません)。

#!/bin/bash

Q_HOST=(host1 host2 host3)  #array of hosts
Q_USER=(user1 user2 user3)  #array of users

for i in ${!Q_HOST[@]}; do
  host="${Q_HOST[i]}"
  user="${Q_USER[i]}"

  ssh "$user"@"$host" "df -h"

done

これを行うには、parallel-ssh()を確認してください。pssh

答え2

配列に割り当てる構文が少し間違っているため、ループが見えませんbash。実際に作成したループは次のとおりです。ほぼシェルでできることと同じですzsh。変数を二重引用符で囲むのも忘れました。


zshソリューションの場合:

#!/usr/bin/zsh

hosts=( host1 host2 host3 host4 )    # array of hosts
users=( user1 user2 user3 user4 )    # array of users

# loop over these and do the ssh thing
for user host in ${users:^hosts}; do
    ssh $user@$host df -h
done

引数置換は ${users:^hosts}シェルにのみ適用され、zsh2つの配列と2つの配列を交互にして要素のリストを生成します。上記の例では、リストが生成されます。usershostsuser1 host1 user2 host2 user3 host3 user4 host4

ループは複数の個別の変数をfor設定できるため、zshこれを使用してユーザー名とホスト名のペアを選択して呼び出しますssh

zshデフォルトでは、シェルは変数をスペースに分割したりファイル名のグロービングを実行したりしないため、シェルから変数を引用する必要はありません。


一方bash通行:

#!/bin/bash

hosts=( host1 host2 host3 host4 )    # array of hosts
users=( user1 user2 user3 user4 )    # array of users

# set the positional parameters to the hosts
set -- "${hosts[@]}"

# Loop over the users.
# In each iteration, ssh to $1 for $user, then
# shift the next host into $1 when done.
for user in "${users[@]}"; do
        ssh "$user@$1" df -h
        shift
done

これにより、2つの配列の要素をペアで連結するために配列インデックスを処理する必要がなくなります。位置引数リストに格納されている他の配列の連続要素を移動しながら、配列の1つの要素を繰り返してこれを行います。

答え3

#!/bin/bash
Q_HOST="host1 host2 host3"
#list of hosts. 
Q_USER="user1 user2 user3"
#list of users 
for host in Q_HOST; do
  for user in Q_USER; do
    echo "${user}@${host}"
   ssh ${user}@${host} df -h
  done
done 

関連情報