Bir dosyayı birden çok sunucudan yerel sistemime nasıl kopyalarım?


11

Bir uygulamanın app00, app01 ve benzeri sunucularda çoklu dağıtımını yapıyoruz. Tüm bu sunuculardan tek bir günlük dosyasını yerel mac'uma kopyalamam gerekiyor, böylece biraz selamlama ve kesme yapabilirim.

Bu dosyayı görüntülemek için csshX kullandım ama scp için eşdeğer bulamıyorum. Temelde iki şey istiyorum:

  1. Bu tür sunucuların n numarasına bağlanma ve dosyayı kopyalama özelliği
  2. Günlük dosyasına sunucu ana bilgisayar adının önüne ekleyerek çakışmaları yerel olarak adlandırmaktan kaçının

Bunu nasıl yaparım?


1
Muhtemelen bunun için bir senaryo yazardım. Bu bir seçenek değil mi?
Bernhard

Bunu şimdi yapıyorum Bernhard. :) Sadece bunun için csshX gibi bir şey olmasını umuyordum.
Gaurav

Yanıtlar:


18

Bu küçük bir senaryo ile yapmak önemsizdir. Örneğin:

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

Yukarıdakiler dosyayı her bir sunucudan sırayla kopyalar ve adlandırır SERVERNAME_file. Yani, dosya vb app0olacaktır app0_file. Açıkça isimleri istediğiniz gibi değiştirebilirsiniz.


3
Komutun &sonuna ve a'nın sonuna koyun ve ekstra ücret ödemeden eşzamanlılığınız vardır. scpwait
l0b0

3
@ l0b0 Bunun istenip istenmediğini bilmiyorum. Bu yaklaşımı seviyorum, çünkü hangi dosyaların kopyalanıp kopyalanamayacağını öğrenebilirim. İyi bir ipucu olsa, teşekkürler.
terdon

12

GNU paralel kullanın :

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

A kullanan çözümlerin aksine for, bu tüm indirmeleri paralel olarak çalıştıracaktır


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

Çok teşekkürler, ben bash programlamaya yeniyim ve böyle bir şey yazdım, sadece çok daha kirli. :)
Gaurav


0

Bu benim için çalıştı

#!/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"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.