scp un fichier unique à plusieurs emplacements

28

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

Par exemple:

scp file.txt [email protected]:, [email protected]:

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?

Andrew
la source

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
Kusalananda
la source
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.

AnonymousLurker
la source
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.

Rick Moritz
la source
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
David Thomas
la source
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
deed02392
la source