Wie kopiere ich eine Datei von mehreren Servern auf mein lokales System?

11

Wir haben eine mehrfache Bereitstellung einer Anwendung auf Servern wie app00, app01 und so weiter. Ich muss eine einzelne Protokolldatei von all diesen Servern auf meinen lokalen Mac kopieren, damit ich etwas greifen und schneiden kann.

Ich habe csshX zum Anzeigen dieser Datei verwendet, aber ich kann kein Äquivalent für scp finden. Grundsätzlich möchte ich zwei Dinge:

  1. Möglichkeit, eine Verbindung zu n Nummern solcher Server herzustellen und die Datei zu kopieren
  2. Vermeiden Sie lokale Namenskonflikte, indem Sie der Protokolldatei möglicherweise den Server-Hostnamen voranstellen

Wie mache ich das?

Gaurav
quelle
1
Ich würde wahrscheinlich selbst ein Skript dafür schreiben. Ist das keine Option?
Bernhard
Das mache ich gerade Bernhard. :) Ich hatte nur gehofft, dass es auch dafür so etwas wie csshX gibt.
Gaurav

Antworten:

18

Dies ist trivial, um mit einem kleinen Skript zu tun. Beispielsweise:

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

Das Obige kopiert die Datei nacheinander von jedem Server und benennt sie SERVERNAME_file. Die Datei von app0wird also app0_fileusw. sein . Sie können die Namen natürlich beliebig ändern.

terdon
quelle
3
Setzen Sie &am Ende des scpBefehls und waitam Ende ein, und Sie haben Parallelität ohne zusätzliche Kosten.
10.
3
@ l0b0 Ich weiß nicht, ob das gewünscht ist. Ich mag diesen Ansatz, weil ich wissen kann, ob und welche Dateien nicht kopiert werden konnten. Guter Tipp, danke.
Terdon
12

Verwenden Sie GNU parallel :

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

Im Gegensatz zu Lösungen, die a verwenden for, werden alle Downloads parallel ausgeführt

wingedsubmariner
quelle
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
Hauke ​​Laging
quelle
Vielen Dank, ich bin neu in der Bash-Programmierung und habe so etwas geschrieben, nur viel schmutziger. :)
Gaurav
0

Wenn Sie in der Lage sind, Python zu verwenden, gibt es ein interessantes Modul, das die maschinenverwaltungsbezogenen Aufgaben namens Fabric vereinfachen soll: http://docs.fabfile.org/en/latest/tutorial.html

Ich wollte es benutzen, bin aber nicht dazu gekommen

Paul
quelle
0

Das hat bei mir funktioniert

#!/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"
user170232
quelle