Comment copier un fichier de plusieurs serveurs sur mon système local?

11

Nous avons le déploiement multiple d'une application sur des serveurs tels que app00, app01 et ainsi de suite. J'ai besoin de copier un seul fichier journal de tous ces serveurs sur mon Mac local afin que je puisse effectuer des opérations de grepping et de découpe.

J'ai utilisé csshX pour visualiser ce fichier mais je ne trouve pas d'équivalent pour scp. Je veux essentiellement deux choses:

  1. Possibilité de se connecter à n numéros de ces serveurs et de copier le fichier
  2. Évitez de nommer les conflits localement, peut-être en préfixant le fichier journal avec le nom d'hôte du serveur

Comment puis-je faire cela?

Gaurav
la source
1
J'écrirais probablement un script pour cela moi-même. N'est-ce pas une option?
Bernhard
C'est ce que je fais en ce moment, Bernhard. :) J'espérais juste qu'il y avait quelque chose comme csshX pour cela aussi.
Gaurav

Réponses:

18

C'est trivial à faire avec un petit script. Par exemple:

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

Ce qui précède copiera le fichier de chacun des serveurs séquentiellement et le nommera SERVERNAME_file. Ainsi, le fichier de app0sera app0_fileetc. Vous pouvez évidemment changer les noms en ce que vous voulez.

terdon
la source
3
Mettez &à la fin de la scpcommande et un waità la fin, et vous avez la concurrence sans frais supplémentaires.
l0b0
3
@ l0b0 Je ne sais pas si c'est souhaité. J'aime cette approche car je peux savoir si et quels fichiers n'ont pas pu être copiés. Bon conseil cependant, merci.
terdon
12

Utilisez GNU parallèle :

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

Contrairement aux solutions qui utilisent un for, cela exécutera tous les téléchargements en parallèle

wingedsubmariner
la source
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
la source
Merci beaucoup, je suis nouveau dans la programmation bash et j'ai écrit quelque chose comme ça, juste beaucoup plus sale. :)
Gaurav
0

Si vous pouvez utiliser python, il existe un module intéressant qui cherche à simplifier les tâches d'administration de la machine appelées fabric: http://docs.fabfile.org/en/latest/tutorial.html

J'ai voulu l'utiliser mais je ne l'ai pas trop

Paul
la source
0

Cela a fonctionné pour moi

#!/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
la source