각 사용자와 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
두 배열과 두 배열을 번갈아가며 요소 목록을 생성합니다. 위의 예에서는 목록이 생성됩니다.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
이렇게 하면 두 배열의 요소를 쌍으로 연결하기 위해 배열 인덱스를 처리하지 않아도 됩니다. 위치 인수 목록에 저장된 다른 배열의 연속 요소를 이동하면서 배열 중 하나의 요소를 반복하여 이를 수행합니다.
답변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