서버 세트에 디렉토리를 복사하는 방법

서버 세트에 디렉토리를 복사하는 방법

텍스트 파일(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 키를 설정했다고 가정합니다(그렇지 않으면 각 서버에 대한 비밀번호를 묻습니다).

관련 정보