Como copiar um arquivo de vários servidores para o meu sistema local?

11

Temos várias implantações de um aplicativo em servidores como app00, app01 e assim por diante. Eu preciso copiar um único arquivo de log de todos esses servidores para o meu mac local, para que eu possa executar alguns grepping e cut.

Usei o csshX para visualizar este arquivo, mas não consigo encontrar um equivalente para o scp. Eu basicamente quero duas coisas:

  1. Capacidade de conectar-se a n números desses servidores e copiar o arquivo
  2. Evite nomear conflitos localmente, talvez prefixando o arquivo de log com o nome do host do servidor

Como eu faço isso?

Gaurav
fonte
1
Provavelmente eu mesmo escreveria um roteiro. Isso não é uma opção?
Bernhard
Estou fazendo isso agora, Bernhard. :) Eu só esperava que houvesse algo como o csshX para isso também.
Gaurav

Respostas:

18

Isso é trivial a ver com um pequeno script. Por exemplo:

for server in app0 app1 app4 app5 appN; do
    scp user@$server:/path/to/log/file /local/path/to/"$server"_file
done

O acima irá copiar o arquivo de cada um dos servidores sequencialmente e nomeá-lo SERVERNAME_file. Portanto, o arquivo app0será app0_fileetc. Você obviamente pode alterar os nomes para o que quiser.

terdon
fonte
3
Coloque &no final do scpcomando e a waitno final, e você terá simultaneidade sem nenhum custo extra.
L0b0
3
@ l0b0 Não sei se isso é desejado. Eu gosto dessa abordagem porque sei se e quais arquivos falharam ao copiar. Boa dica, obrigado.
terdon
12

Use o GNU paralelo :

parallel -j0 scp {}:/remote_path file_from_{} ::: host1 host2 host3 # and so on

Diferente das soluções que usam a for, isso executará todos os downloads em paralelo

wingedsubmariner
fonte
5
remote_path="/path/to/file"
local_target_dir="/path/to/dir"
hosts=(app00 app01)
for host in "${hosts[@]}"; do
    scp "$host":"$remote_path" "$local_target_dir"/filename."$host"
done
Hauke ​​Laging
fonte
Muito obrigado, sou novo em bash programação e escrevi algo assim, muito mais sujo. :)
Gaurav
0

Se você é capaz de usar python, existe um módulo interessante que parece simplificar as tarefas de administração de máquina chamadas fabric: http://docs.fabfile.org/en/latest/tutorial.html

Eu queria usá-lo, mas também não o rodeio

Paulo
fonte
0

Isso funcionou para mim

#!/bin/bash
#Expect script
/usr/bin/expect -<<EOD 

set SERVERS {1 2 3 .. N}

foreach SERVER \$SERVERS {
    spawn scp user@\$SERVER:remote local/"\$SERVER"RESWeb.log
    expect {
      -re ".*es.*o.*" {
        exp_send "yes\r"
        exp_continue
      }
      -re ".*sword.*" {
        exp_send "pswrd\r"
      }
    }
    expect eof 
}
EOD

echo "completed"
user170232
fonte