Jak skopiować plik z wielu serwerów do mojego systemu lokalnego?


11

Mamy wiele wdrożeń aplikacji na serwerach takich jak app00, app01 i tak dalej. Muszę skopiować pojedynczy plik dziennika ze wszystkich tych serwerów na mój lokalny komputer Mac, aby móc wykonać grepowanie i wycinanie.

Użyłem csshX do przeglądania tego pliku, ale nie mogę znaleźć odpowiednika dla scp. Zasadniczo chcę dwóch rzeczy:

  1. Możliwość podłączenia do n numerów takich serwerów i skopiowania pliku
  2. Unikaj lokalnych konfliktów nazw, być może poprzedzając plik dziennika nazwą hosta serwera

Jak mam to zrobic?


1
Prawdopodobnie sam bym napisał skrypt. Czy to nie jest opcja?
Bernhard

Robię to teraz, Bernhard. :) Miałem tylko nadzieję, że jest w tym coś podobnego do csshX.
Gaurav

Odpowiedzi:


18

Jest to trywialne w przypadku małego skryptu. Na przykład:

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

Powyższe spowoduje skopiowanie pliku z każdego serwera sekwencyjnie i nadanie mu nazwy SERVERNAME_file. Plik app0będzie więc app0_fileitd. Możesz oczywiście zmienić nazwy na cokolwiek chcesz.


3
Umieścić &na końcu scppolecenia i waitna końcu, a masz współbieżność bez dodatkowych kosztów.
l0b0

3
@ l0b0 Nie wiem, czy to jest pożądane. Podoba mi się to podejście, ponieważ mogę wiedzieć, czy i które pliki nie zostały skopiowane. Dobra wskazówka, dzięki.
terdon

12

Użyj GNU równolegle :

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

W przeciwieństwie do rozwiązań wykorzystujących a for, wszystkie pliki będą pobierane równolegle


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

Wielkie dzięki, jestem nowy w bash programowania i napisałem coś takiego, po prostu o wiele bardziej brudne. :)
Gaurav


0

To zadziałało dla mnie

#!/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"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.