Respostas:
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
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
).
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.
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