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?


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.


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


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

Merci beaucoup, je suis nouveau dans la programmation bash et j'ai écrit quelque chose comme ça, juste beaucoup plus sale. :)
Gaurav


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"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.