Come copio un file da più server sul mio sistema locale?


11

Abbiamo una distribuzione multipla di un'applicazione su server come app00, app01 e così via. Ho bisogno di copiare un singolo file di registro da tutti questi server sul mio mac locale in modo da poter eseguire un po 'di grepping e taglio.

Ho usato csshX per visualizzare questo file ma non riesco a trovare un equivalente per SCP. In pratica voglio due cose:

  1. Possibilità di connettersi a n numeri di tali server e copiare il file
  2. Evitare conflitti di denominazione a livello locale, forse prefissando il file di registro con il nome host del server

Come faccio a fare questo?


1
Probabilmente scriverei una sceneggiatura per me stesso. Non è un'opzione?
Bernhard,

Lo sto facendo proprio ora Bernhard. :) Speravo solo che ci fosse qualcosa come csshX anche per questo.
Gaurav,

Risposte:


18

Questo è banale da fare con una piccola sceneggiatura. Per esempio:

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

Quanto sopra copierà il file da ciascuno dei server in sequenza e lo nominerà SERVERNAME_file. Quindi, il file da app0sarà app0_fileecc. Puoi ovviamente cambiare i nomi come preferisci.


3
Metti &alla fine del scpcomando e waitalla fine e avrai la concorrenza senza costi aggiuntivi.
l0b0

3
@ l0b0 Non so se sia desiderato. Mi piace questo approccio perché posso sapere se e quali file non sono stati copiati. Un buon consiglio però, grazie.
terdon

12

Usa GNU parallelo :

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

A differenza delle soluzioni che utilizzano a for, questo eseguirà tutti i download in parallelo


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

Grazie mille, sono nuovo alla programmazione bash e ho scritto qualcosa del genere, solo molto più sporco. :)
Gaurav,


0

Questo ha funzionato per me

#!/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"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.