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?


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.


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


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

Vielen Dank, ich bin neu in der Bash-Programmierung und habe so etwas geschrieben, nur viel schmutziger. :)
Gaurav


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"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.