scp un fichier unique à plusieurs emplacements


28

Pouvez-vous scpun fichier à plusieurs emplacements dans la même commande?

Par exemple:

scp file.txt user@ip-1.com:, user@ip2.com:

Ou serait-il plus pratique de créer un script bash qui contient déjà tous les hôtes et qui prendrait simplement un fichier comme argument?

Réponses:


24

Disons que vous avez un fichier ( destfile.txt) avec des user@hostvaleurs -un, un sur chaque ligne. Ensuite, vous pourriez faire comme ceci:

while IFS= read -r dest; do
  scp ourfile.txt "$dest:remote/path/"
done <destfile.txt

Cela marche! Encore une poignée à taper cependant. Il y a peut-être un moyen de simplifier cela.
Andrew

2
@Andrew, si vous changez la forboucle en while read dest; do, elle lira à partir de l'entrée standard. Mettez-le dans un script et alimentez-le destfile.txt(par exemple, ./thescript.sh <destfile.txt).
Kusalananda

Je fais le premier, mais avec rsync et certains de mes nœuds ne sont pas mis à jour. Une idée pourquoi?
Soubriquet

7

Ressemble à un travail pour parallel-scp (n) (t) - cela implémente un ensemble de commandes qui permettent aux commandes scp d'être exécutées sur plusieurs systèmes à la fois. Il permettra la copie de fichiers en parallèle sur un ensemble de machines.


4
cat file.txt | tee >(ssh user@ip1.com "cat > file.txt") \
                   >(ssh user@ip2.com "cat > file.txt")

tar cz file1 file2 file3 | tee >(ssh user@ip1.com "tar xz") \
                               >( ... )

0

Une autre alternative (et une ligne) serait d'utiliser à la place pdsh pour se connecter à chaque nœud cible et déclencher un get à partir de là:

pdsh -w^destfile.txt scp hostname:/path/to/file /path/to/destfile

Bien sûr, cela nécessite une information supplémentaire (l'hôte local) et différents droits d'utilisateur, mais vous évitez de boucler en bash et d'utiliser l'indirection pour lire le fichier.


0

Voici une autre option, avec un script shell d'une ligne.

cscp.sh 20337.patch < hosts.txt

Il utilise deux fichiers, un pour la boucle et un pour la liste d'hôtes du serveur. Il lit $1le premier paramètre de la CLI comme nom de fichier pour SCP

cscp.sh

#!/bin/bash
while read host; do
  scp $1 ${host}:
done

hosts.txt

project-prod-web1
project-prod-web2
project-prod-web3

Usage

Copiez le fichier sur plusieurs hôtes:

cscp.sh file < hosts

0

Si vous avez une convention de dénomination cohérente pour plusieurs serveurs, vous pouvez faire quelque chose de bien comme:

for x in st1-abc-{11..20}.acme.com; do scp filez.tgz user@$x; done
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.