私は3人の異なるユーザーを使用して複数のサーバーに接続するスクリプトを作成しています。
#!/bin/ksh
server1=("abc1" "abc2")
server2=("abc3" "abc4")
server3=("abc5" "abc6")
for i in "${server1[@]}"
do ssh sam@$i "some command"
done
for i in "${server2[@]}"
do ssh danny@$i "some command"
done
for i in "${server3[@]}"
do ssh robert@$i "some command"
done
for
3つのループをすべて1つにまとめる方法はありますか?実際、私は複数の接続のためにSSHを書きたいと思います。
すべてのサーバーを1つの配列に配置し、ユーザーを別の配列に配置してみました。
servers=("abc1" "abc2" "abc3" "abc4" "abc5" "abc6")
users=("sam" "Danny" "Robert")
for i in ${servers[@]}
do
ssh ${users[@]}@$i "some command"
done
ただし、これによりスクリプトはすべてのユーザーをすべてのサーバーに配置し、最終的にサービスアカウントをロックします。
Sam
私が望むのは、すべてのサーバーとユーザーを繰り返し、ユーザーと配列、ユーザーserver1
とdanny
配列server2
、ユーザーrobert
と配列のみを一致させるスクリプトですserver3
。きれいでより良い方法で正しいユーザーを正しいサーバーに接続するより良い方法はありますか?
ベストアンサー1
Bashを仮定すると、タグが示すように(shebangで言うkshではない)、次のものを使用できます。名前参照指定された整数識別子に対応する配列変数を使用します。
users=(. userxyz user123 user221)
for n in 1 2 3
do
declare -n server=server$n
for i in "${server[@]}"
do ssh "${users[$n]}@$i" "some command"
done
done
適切なを使用すると、echo
元のスクリプトと同じ出力を取得できます。
ssh userxyz@abc1 some command
ssh userxyz@abc2 some command
ssh user123@abc3 some command
ssh user123@abc4 some command
ssh user221@abc5 some command
ssh user221@abc6 some command
Korn シェルに適応するには、次のものが必要です。nameref
組み込みコマンドの使用変えるdeclare -n
。
より簡単なアプローチでは、ユーザー名/ホスト名を一緒に検討できます。
servers=("userxyz@abc1" "userxyz@abc2"
"user123@abc3" "user123@abc4"
"user221@abc5" "user221@abc6")
for i in "${servers[@]}"
do ssh "$i" "some command"
done