scp un singolo file in più posizioni


28

Puoi scpun file in più posizioni con lo stesso comando?

Per esempio:

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

O sarebbe più pratico creare uno script bash che contenga già tutti gli host e prenderebbe semplicemente un file come argomento?

Risposte:


24

Supponiamo che tu abbia un file ( destfile.txt) con user@host-valori, uno su ogni riga. Quindi potresti fare così:

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

Questo funziona! Ancora una manciata da scrivere però. Forse c'è un modo per semplificarlo.
Andrew,

2
@Andrew, se cambi for-loop in while read dest; do, leggerà dallo standard input. Inseriscilo in uno script e destfile.txtinseriscilo (ad es ./thescript.sh <destfile.txt.).
Kusalananda,

Sto facendo il primo, ma con rsync e alcuni dei miei nodi non si stanno aggiornando. Qualche idea sul perché?
Soubriquet,

7

Sembra un lavoro per parallel-scp (n) (t) - questo implementa una serie di comandi che consentono l'esecuzione di comandi scp su più sistemi contemporaneamente. Consentirà la copia di file in parallelo a un set di macchine.


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

Un'altra alternativa (e un one-liner) sarebbe invece usare pdsh per connettersi a ciascun nodo target e innescare un get da lì:

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

Ciò ovviamente richiede ulteriori informazioni (l'host locale) e diritti utente diversi, ma si evita di eseguire il looping in bash e di utilizzare il riferimento indiretto per leggere il file.


0

Ecco un'altra opzione, con uno script shell di una riga.

cscp.sh 20337.patch < hosts.txt

Utilizza due file, uno per il ciclo e uno per l'elenco degli host del server. Legge $1il primo parametro dalla CLI come nome file in 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

Copia il file su più host:

cscp.sh file < hosts

0

Se hai una convenzione di denominazione coerente in corso per più server, puoi fare qualcosa di pulito come:

for x in st1-abc-{11..20}.acme.com; do scp filez.tgz user@$x; done
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.