여러 서버의 파일을 로컬 시스템으로 복사하는 방법은 무엇입니까?

여러 서버의 파일을 로컬 시스템으로 복사하는 방법은 무엇입니까?

app00, app01 등의 서버에 여러 애플리케이션이 배포되어 있습니다. grep 및 cut 작업을 수행하려면 이러한 모든 서버의 단일 로그 파일을 로컬 Mac으로 복사해야 합니다.

이 파일을 보기 위해 csshX를 사용했지만 scp에 해당하는 프로그램을 찾을 수 없습니다. 나는 주로 두 가지를 원합니다.

  1. n개의 서버에 연결하고 파일을 복사할 수 있음
  2. 로그 파일에서 서버 호스트 이름 앞에 접두사를 추가하면 로컬 이름 지정 충돌을 방지할 수 있습니다.

어떻게 해야 하나요?

답변1

이는 작은 스크립트에서는 사소한 일입니다. 예를 들어:

for server in app0 app1 app4 app5 appN; do
    scp user@$server:/path/to/log/file /local/path/to/"$server"_file
done

위의 방법은 각 서버에서 순차적으로 파일을 복사하고 이름을 지정합니다 SERVERNAME_file. 따라서 파일은 다음과 app0같습니다 . app0_file물론 이름은 원하는 대로 변경할 수 있습니다.

답변2

사용GNU 병렬:

parallel -j0 scp {}:/remote_path file_from_{} ::: host1 host2 host3 # and so on

사용된 솔루션과 달리 for이는 모든 다운로드를 병렬로 실행합니다.

답변3

remote_path="/path/to/file"
local_target_dir="/path/to/dir"
hosts=(app00 app01)
for host in "${hosts[@]}"; do
    scp "$host":"$remote_path" "$local_target_dir"/filename."$host"
done

답변4

이것은 나에게 효과적입니다

#!/bin/bash
#Expect script
/usr/bin/expect -<<EOD 

set SERVERS {1 2 3 .. N}

foreach SERVER \$SERVERS {
    spawn scp user@\$SERVER:remote local/"\$SERVER"RESWeb.log
    expect {
      -re ".*es.*o.*" {
        exp_send "yes\r"
        exp_continue
      }
      -re ".*sword.*" {
        exp_send "pswrd\r"
      }
    }
    expect eof 
}
EOD

echo "completed"

관련 정보