scp un solo archivo a múltiples ubicaciones


28

¿Se puede enviar scpun archivo a varias ubicaciones en el mismo comando?

Por ejemplo:

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

¿O sería más práctico crear un script bash que ya tenga todos los hosts en él y solo tomaría un archivo como argumento?

Respuestas:


24

Digamos que tiene un archivo ( destfile.txt) con user@hostvalores, uno en cada línea. Entonces podrías hacer así:

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

¡Esto funciona! Sin embargo, todavía es un puñado de escribir. Quizás haya una manera de simplificar eso.
Andrew

2
@ Andrew, si cambias el forbucle a while read dest; do, se leerá desde la entrada estándar. Póngalo en un script y aliméntelo destfile.txt(p ./thescript.sh <destfile.txt. Ej .).
Kusalananda

Estoy haciendo lo primero, pero con rsync y algunos de mis nodos no se actualizan. ¿Alguna idea de por qué?
Soubriquet

7

Parece un trabajo para parallel-scp (n) (t) : implementa un conjunto de comandos que permiten que los comandos scp se ejecuten en varios sistemas a la vez. Permitirá la copia de archivos en paralelo a un conjunto de máquinas.


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

Otra alternativa (y una línea) sería utilizar pdsh para conectarse a cada nodo de destino y activar un get desde allí:

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

Por supuesto, esto requiere una información más (el host local) y diferentes derechos de usuario, pero evita hacer bucles en bash y usar indirección para leer el archivo.


0

Aquí hay otra opción, con un script de shell de una línea.

cscp.sh 20337.patch < hosts.txt

Utiliza dos archivos, uno para el bucle y otro para la lista de hosts del servidor. Lee $1el primer parámetro de la CLI como el nombre del archivo a SCP

cscp.sh

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

hosts.txt

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

Uso

Copie el archivo a varios hosts:

cscp.sh file < hosts

0

Si tiene una convención de nomenclatura constante para varios servidores, puede hacer algo ordenado como:

for x in st1-abc-{11..20}.acme.com; do scp filez.tgz user@$x; done
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.