Làm cách nào để sao chép một tập tin từ nhiều máy chủ vào hệ thống cục bộ của tôi?


11

Chúng tôi có nhiều triển khai một ứng dụng trên các máy chủ như app00, app01, v.v. Tôi cần sao chép một tệp nhật ký từ tất cả các máy chủ này vào máy mac cục bộ của mình để tôi có thể thực hiện một số thao tác cắt và cắt.

Tôi đã sử dụng csshX để xem tệp này nhưng tôi không thể tìm thấy một tương đương cho scp. Về cơ bản tôi muốn hai điều:

  1. Khả năng kết nối với n số máy chủ đó và sao chép tệp
  2. Tránh đặt tên xung đột cục bộ có lẽ bằng cách thêm tiền tố vào tệp nhật ký với tên máy chủ

Làm thế nào để tôi làm điều này?


1
Tôi có thể sẽ tự viết một kịch bản cho nó. Đó không phải là một lựa chọn?
Bernhard

Tôi đang làm điều đó ngay bây giờ Bernhard. :) Tôi chỉ hy vọng có một cái gì đó giống như csshX cho điều này cũng.
Gaurav

Câu trả lời:


18

Điều này là tầm thường để làm với một kịch bản nhỏ. Ví dụ:

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

Ở trên sẽ sao chép tệp từ mỗi máy chủ một cách tuần tự và đặt tên cho nó SERVERNAME_file. Vì vậy, các tập tin từ app0sẽ được app0_filevv Bạn rõ ràng có thể thay đổi tên thành bất cứ điều gì bạn muốn.


3
Đặt &ở cuối scplệnh và waitcuối cùng, và bạn có đồng thời mà không mất thêm chi phí.
l0b0

3
@ l0b0 Tôi không biết nếu muốn. Tôi thích cách tiếp cận này vì tôi có thể biết nếu và tập tin nào không thể sao chép. Mẹo tốt mặc dù, cảm ơn.
terdon

12

Sử dụng GNU song song :

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

Không giống như các giải pháp sử dụng a for, điều này sẽ chạy song song tất cả các tải xuống


5
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

Cảm ơn rất nhiều, tôi mới biết lập trình bash và đã viết một cái gì đó như thế, chỉ là bẩn hơn rất nhiều. :)
Gaurav


0

Điều này làm việc cho tôi

#!/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"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.