저는 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
만 연관되어 있는 경우 ,server1a
server1b
user2
server2a
server2b
server2c
#!/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
작동할 것입니다 .ksh
bash
위의 코드가 주어지면 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