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 pegaria um arquivo como argumento?

Andrew
fonte

Respostas:

21

Vamos dizer que você tem um arquivo ( destfile.txt ) com user@host -valores, 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
Kusalananda
fonte
Isso funciona! Ainda um punhado para digitar embora. Talvez haja uma maneira de simplificar isso.
Andrew
2
@ Andrew, se você mudar o for -loop em while read dest; do, lerá da entrada padrão. Coloque em um script e alimente o destfile.txt nele (por exemplo, ./thescript.sh <destfile.txt ).
Kusalananda
Eu estou fazendo o primeiro, mas com o rsync e alguns dos meus nós não estão atualizando. Alguma ideia do porquê?
Soubriquet
6

Parece um trabalho para scp paralelo n) (t) - isso 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.

AnonymousLurker
fonte
0

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

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

Isso, obviamente, requer mais uma informação (o host local) e direitos de usuário diferentes, mas você evita dar um loop no bash e usar indiretamente para ler o arquivo.

Rick Moritz
fonte
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 outro para a lista de hosts do servidor. 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
David Thomas
fonte