¿Cómo copio un archivo de varios servidores a mi sistema local?

11

Tenemos una implementación múltiple de una aplicación en servidores como app00, app01, etc. Necesito copiar un solo archivo de registro de todos estos servidores en mi Mac local para poder realizar algunas tareas de grep y corte.

Utilicé csshX para ver este archivo pero no puedo encontrar un equivalente para scp. Básicamente quiero dos cosas:

  1. Posibilidad de conectarse a n números de dichos servidores y copiar el archivo
  2. Evite los conflictos de nomenclatura localmente, tal vez con el prefijo del archivo de registro con el nombre de host del servidor

¿Cómo hago esto?

Gaurav
fuente
1
Probablemente escribiría un guión para mí. ¿No es esa una opción?
Bernhard
Estoy haciendo eso ahora mismo Bernhard. :) Solo esperaba que hubiera algo como csshX para esto también.
Gaurav

Respuestas:

18

Esto es trivial con un pequeño guión. Por ejemplo:

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

Lo anterior copiará el archivo de cada uno de los servidores secuencialmente y lo nombrará SERVERNAME_file. Entonces, el archivo app0será, app0_fileetc. Obviamente, puede cambiar los nombres a lo que desee.

terdon
fuente
3
Ponga &al final del scpcomando y waita al final, y tendrá concurrencia sin costo adicional.
10 de
3
@ l0b0 No sé si eso se desea. Me gusta este enfoque porque puedo saber si y qué archivos no se pudieron copiar. Buen consejo, gracias.
terdon
12

Use GNU paralelo :

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

A diferencia de las soluciones que usan a for, esto ejecutará todas las descargas en paralelo

Submarino alado
fuente
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
fuente
Muchas gracias, soy nuevo en la programación de bash y escribí algo así, mucho más sucio. :)
Gaurav
0

Esto funciono para mi

#!/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"
usuario170232
fuente