各ユーザーと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}
シェルにのみ適用され、zsh
2つの配列と2つの配列を交互にして要素のリストを生成します。上記の例では、リストが生成されます。users
hosts
user1 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