텍스트 파일(hostfile)에 나열된 다른 서버에 디렉터리를 복사해야 합니다.
scp로 이와 같은 작업을 수행할 수 있는 방법을 찾지 못했습니다.
scp -r --hostfile ~/directory to_all@servers:~/
하나의 서버에 대해 이 작업을 수행하는 방법을 알고 있지만 scp -r directory one@server:~/
여러 서버에 대해 수행하는 방법은 모르겠습니다. 서버 수는 다양하지만 모든 서버에 동일한 사용자 이름을 사용합니다.
답변1
가장 쉬운 방법은 쉘 for
루프를 사용하는 것입니다. 예를 들어:
for s in server1 server2 server3 ... serverN ; do
scp -r directory/ $s:~/
done
작은 변화는 예를 들어 파일의 서버를 server-list.txt
한 줄에 하나씩 나열하고 다음과 같이 수행하는 것입니다.
for s in $(cat servers.txt) ; do
scp -r directory/ $s:~/
done
파일에 주석을 지원하기 위한 작은 변경 사항도 있습니다 #
(서버 호스트 이름 주석 포함) servers.txt
.
for s in $(sed -e 's/#.*//' servers.txt) ; do
scp -r directory/ $s:~/
done
서버 목록을 가져오거나 생성하는 다른 방법은 셀 수 없이 많습니다. 예를 들어 데이터베이스에서 목록을 가져오기 위해 실행하거나 mysql
쿼리 psql
하고, text/plain
웹 서버에서 파일을 가져오고, json
웹 서버에서 파일을 가져와 사용하거나 jq
구문 분석하는 python -mjson.tool
등의 방법이 있습니다. 더 많은 것이 있습니다. 기본 접근 방식은 동일하게 유지됩니다.
다른 파일/디렉토리에 대해 이 작업을 자주 수행해야 하거나 동시에 여러 서버에서 셸 명령을 병렬로 실행해야 하는 경우 다음을 설치하는 것이 좋습니다.PDSHpdcp
(병렬 분산 복사본) 및 pdsh
(병렬 분산 셸) 명령 과 함께 패키지되어 사용됩니다 . pdsh
대부분의 배포판용으로 패키지되어 있습니다.
여기에서 검색하세요 pdsh
. 이에 대한 몇 가지 질문과 답변이 있습니다.
답변2
while read server; do scp -r ~/directory to_all@$server: ; done < hostfile
원격 사용자가 다음과 같다고 가정합니다.진짜call 을 입력 to_all
하고 SSH 키를 설정했다고 가정합니다(그렇지 않으면 각 서버에 대한 비밀번호를 묻습니다).