다양한 사용자를 위한 다중 SSH 세션

다양한 사용자를 위한 다중 SSH 세션

저는 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세 개의 루프를 모두 하나로 결합하는 방법이 있습니까 ? 실제로 저는 여러 연결을 위해 SSH를 작성하고 싶습니다.

모든 서버를 하나의 배열에 배치하고 사용자를 다른 배열에 배치해 보았습니다.

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

답변2

및 등과 user1만 연관되어 있는 경우 ,server1aserver1buser2server2aserver2bserver2c

#!/bin/sh

set -- \
    user1 server1a server1b -- \
    user2 server2a server2b server2c -- \
    user3 server3a --

while [ "$#" -ne 0 ]; do
    user=$1; shift

    until [ "$1" = -- ]; do
        ssh "$user@$1" 'some command'
        shift
    done

    # Shift off that "--" delimiter
    shift
done

이는 위치 매개변수를 사용하여 사용자 이름과 해당 서버 목록을 저장합니다. 이는 단일 문자열 목록이므로 목록에서 사용자 이름과 서버 이름이 포함된 부분을 구분하여 --새 사용자 이름이 필요하거나 목록 끝에 도달한 시기를 쉽게 확인할 수 있습니다.

외부 루프는 목록의 일부를 반복하고 사용자 이름을 변수에 할당하는 user반면, 내부 루프는 서버 이름을 반복하고 ssh문자열을 찾을 때까지 호출합니다.--

스크립트는 을 위해 작성되었으므로 및 에서도 /bin/sh작동할 것입니다 .kshbash

위의 코드가 주어지면 ssh다음 명령이 실행됩니다.

ssh user1@server1a 'some command'
ssh user1@server1b 'some command'
ssh user2@server2a 'some command'
ssh user2@server2b 'some command'
ssh user2@server2c 'some command'
ssh user3@server3a 'some command'

초기 명령을 제거하면 set다음과 같이 명령줄에서 스크립트를 호출하여 동일한 효과를 얻을 수 있습니다.

$ ./script user1 server1a server1b -- user2 server2a server2b server2c -- user3 server3a --

내부 루프에서 추가 검사( )를 수행하여 명령줄에서 || [ "$#" -eq 0 ]마지막 검사를 생략 할 수 있습니다.--


하고 싶은 일이 신청이라면건조 원리코드의 단일 지점에서만 호출 한 ssh다음 해당 비트를 함수로 추출합니다. 이를 위해 수정된 코드는 다음과 같습니다.

#!/bin/ksh

server1=("abc1" "abc2")
server2=("abc3" "abc4")
server3=("abc5" "abc6")

process () {
    ssh "$1@$2" 'some command'
}

for server in "${server1[@]}"; do
    process sam "$server"
done

for server in "${server2[@]}"; do
    process danny "$server"
done

for server in "${server3[@]}"; do
    process robert "$server"
done

관련 정보