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 user@ip-1.com:, user@ip2.com:

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

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

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.


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

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.