각 사용자와 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

호스트당 사용자가 한 명뿐이라고 가정하면 목록을 다음 위치에 넣을 수 있습니다.정렬그리고 배열 중 하나의 인덱스를 반복합니다(어느 배열인지는 중요하지 않습니다).

#!/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두 배열과 두 배열을 번갈아가며 요소 목록을 생성합니다. 위의 예에서는 목록이 생성됩니다.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

이렇게 하면 두 배열의 요소를 쌍으로 연결하기 위해 배열 인덱스를 처리하지 않아도 됩니다. 위치 인수 목록에 저장된 다른 배열의 연속 요소를 이동하면서 배열 중 하나의 요소를 반복하여 이를 수행합니다.

답변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 

관련 정보