scp um único arquivo para vários locais

24

Você pode scp um arquivo para vários locais no mesmo comando?

Por exemplo:

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

Ou seria mais prático criar um script bash que já contenha todos os hosts e que apenas pegasse um arquivo como argumento?

    
por Andrew 22.09.2011 / 22:29

5 respostas

21

Digamos que você tenha um arquivo ( destfile.txt ) com user@host -values, um em cada linha. Então você poderia fazer assim:

for dest in $(<destfile.txt); do
  scp ourfile.txt "$dest:remote/path/"
done

ou

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

Parece um trabalho para scp paralelo (n) (t) - isto implementa um conjunto de comandos que permitem que os comandos scp sejam executados em vários sistemas de uma só vez. Isso permitirá a cópia de arquivos em paralelo a um conjunto de máquinas.

    
por 24.08.2012 / 01:50
3
cat file.txt | tee >(ssh [email protected] "cat > file.txt") \
                   >(ssh [email protected] "cat > file.txt")

tar cz file1 file2 file3 | tee >(ssh [email protected] "tar xz") \
                               >( ... )
    
por 22.09.2011 / 22:57
0

Outra alternativa (e um one-liner) seria usar o pdsh para conectar-se a cada nó de destino e acionar um get de lá:

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

Isso, é claro, requer mais uma informação (o host local) e direitos de usuário diferentes, mas você evita o loop no bash e o uso indireto para ler o arquivo.

    
por 29.09.2016 / 15:19
0

Aqui está outra opção, com um script de shell de uma linha.

cscp.sh 20337.patch < hosts.txt

Ele usa dois arquivos, um para o loop e um para a lista de hosts do servidor. Ele lê $1 para o primeiro parâmetro da CLI como o nome do arquivo para o 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

Copiar arquivo para vários hosts:

cscp.sh file < hosts
    
por 17.08.2017 / 05:38