app00, app01 등의 서버에 여러 애플리케이션이 배포되어 있습니다. grep 및 cut 작업을 수행하려면 이러한 모든 서버의 단일 로그 파일을 로컬 Mac으로 복사해야 합니다.
이 파일을 보기 위해 csshX를 사용했지만 scp에 해당하는 프로그램을 찾을 수 없습니다. 나는 주로 두 가지를 원합니다.
- n개의 서버에 연결하고 파일을 복사할 수 있음
- 로그 파일에서 서버 호스트 이름 앞에 접두사를 추가하면 로컬 이름 지정 충돌을 방지할 수 있습니다.
어떻게 해야 하나요?
답변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"